##Kubernetes部署 旧版
Kubernetes集群组件:
- etcd 一个高可用的K/V键值对存储和服务发现系统
- flannel 实现跨主机的容器网络的通信
- kube-apiserver 提供kubernetes集群的API调用
- kube-controller-manager 确保集群服务
- kube-scheduler 调度容器,分配到Node
- kubelet 在Node节点上按照配置文件中定义的容器规格启动容器
- kube-proxy 提供网络代理服务,将service与pod打通。
查看版本
在官网上查看最新版本v1.19.0-rc.4
https://github.com/kubernetes/kubernetes/tags
查看操作系统
[root@master~]# cat /etc/redhat-release
CentOS Linux 7.4.1708 (Core)
[root@master~]# cat /proc/version
Linux version 3.10.0-693.el7.x86_64 (builder@kbuilder.dev.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC) ) #1 SMP Tue Aug 22 21:09:27 UTC 2017
修改IP地址、主机名和host解析
节点及功能 | 主机名 | IP |
---|---|---|
master、etcd、registry | master | 192.168.11.10 |
node1 | node1 | 192.168.11.11 |
node2 | node2 | 192.168.11.12 |
#查询并修改主机名,重启生效
[root@master~]# hostname
[root@master~]# vi /etc/hostname 或 hostnamectl set-hostname master
master
#修改IP和所有主机名的映射关系(所有机器)
[root@master~]# vi /etc/hosts
192.168.11.10 master
192.168.11.11 node1
192.168.11.12 node2
[root@master ~]# systemctl restart network 或 reboot
虚拟机NAT网络设置
节点上的其他设置
1.1 确保系统已经安装epel-release源
RedHat系列的包管理工具是yum
[root@master ~]# yum -y install epel-release
1.2 关闭三台机器上的防火墙
[root@master ~]# systemctl stop firewalld.service
[root@master ~]# systemctl disable firewalld.service
[root@master ~]# setenforce 0 && sed -i ‘s/^SELINUX=.*/SELINUX=disabled/’ /etc/selinux/config
[root@master ~]# swapoff -a && sed -i ‘/ swap / s/^(.*)$/#\1/g’ /etc/fstab
设置固定的IP地址
[root@master ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33
[root@master manifests]# vi /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="58fbb6d0-e33a-425e-b863-0681c854bc8b"
DEVICE="ens33"
ONBOOT="yes"
IPADDR="192.168.11.10"
NETMASK="255.255.255.0"
GATEWAY="192.168.11.2"
DNS1="8.8.8.8"
DNA2="8.8.4.4"
#dns
[root@node2 rc.d]# cat /etc/resolv.conf
# Generated by NetworkManager
# nameserver 8.8.8.8
# nameserver 8.8.4.4
卸载docker 旧版本
卸载Docker Engine,CLI和Containerd软件包,并删除数据
#主机上的镜像,容器,卷或自定义配置文件不会自动删除。要删除所有图像,容器和卷。
您必须手动删除所有已编辑的配置文件。
[root@node1 ~]# yum list installed | grep docker
[root@node1 ~]# yum remove docker.x86_64 docker-client.x86_642 docker-common.x86_642
#取消挂载
[root@node1 ~]# umount /var/lib/docker/containers
[root@node1 ~]# umount /var/lib/docker/overlay2
#清空docker产生的文件
[root@node1 ~]# rm -rf /var/lib/docker && rm -rf /etc/docker
安装 kubernetes-master
使用 yum 安装 etcd 和 kubernetes-master
查看版本
[root@master hello]# yum list|grep kubernetes
[root@master hello]# yum list installed | grep kubernetes
kubernetes-client.x86_64 1.5.2-0.7.git269f928.el7 @extras
kubernetes-master.x86_64 1.5.2-0.7.git269f928.el7 @extras
安装etcd
[root@master ~]# yum install etcd -y
编辑 etcd 配置文件
[root@master ~]# vim /etc/etcd/etcd.conf
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379" #etcd节点与客户端通信时所监听的地址列表
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.11.10:2379" #etcd集群通信所监听节点地址和端口
设置开机启动
[root@master ~]# systemctl enable etcd.service
[root@master ~]# systemctl start etcd.service
测试etcd是否安装成功
[root@master ~]# etcdctl set testdir/testkey0 0
0
[root@master ~]# etcdctl get testdir/testkey0
0
检查健康状态
[root@master ~]# etcdctl -C http://192.168.11.10:2379 cluster-health
member 8e9e05c52164694d is healthy: got healthy result from http://192.168.11.10:2379
cluster is healthy
master节点 在etcd中定义flannel网络
Flannel要用etcd存储自身一个子网信息,所以要保证能成功连接Etcd,写入预定义子网段。
##在master节点安装key
[root@master ~]# etcdctl mk /atomic.io/network/config ‘{“Network”:“172.17.0.0/16”}’
{“Network”:“172.17.0.0/16”}
#查看是否添加成功
[root@master ~]# etcdctl get /atomic.io/network/config
{“Network”:“172.17.0.0/16”}
master节点 安装kubernetes-master
[root@master ~]# yum install kubernetes-master -y
编辑 /etc/kubernetes/apiserver 文件
[root@master ~]# vim /etc/kubernetes/apiserver
KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
KUBE_API_PORT="--port=8080"
KUBELET_PORT="--kubelet-port=10250"
KUBE_ETCD_SERVERS="--etcd-servers=http://127.0.0.1:2379"
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"
KUBE_API_ARGS=""
ps:测试时需要把KUBE_ADMISSION_CONTROL中的SecurityContextDeny和ServiceAccount去掉,这是权限相关的
安装 flannel 网络
检查flannel版本
[root@master ~]# yum list |grep flannel
flannel.x86_64 0.7.1-9.el7 @extras
在所有节点安装并修改flanneld网络相关信息
[root@master ~]# yum install flannel -y
[root@master ~]# sed -i ‘s#http://127.0.0.1:2379#http://192.168.11.10:2379#g’ /etc/sysconfig/flanneld
[root@node-1 ~]# yum install flannel -y
[root@node-1 ~]# ]# sed -i ‘s#http://127.0.0.1:2379#http://192.168.11.10:2379#g’ /etc/sysconfig/flanneld
[root@node-2 ~]# yum install flannel -y
[root@node-2 ~]# sed -i ‘s#http://127.0.0.1:2379#http://192.168.11.10:2379#g’ /etc/sysconfig/flanneld
FLANNEL_ETCD:ETCD的地址
FLANNEL_ETCD_KEY:etcd中配置的网络参数的key
FLANNEL_OPTIONS:是flannel的启动参数,在这里可以加上监听的网卡,如–iface=ens33
启动flannel服务
flannel服务启动时主要做了以下几步的工作:
1.从etcd中获取network的配置信息。
2.划分subnet,并在etcd中进行注册。
3.将子网信息记录到/run/flannel/subnet.env中
所有节点安装docker
[root@master ~]# yum install docker -y
3.5 修改docker网络
启动服务
启动etcd、kube-apiserver、kube-controller-manager、kube-scheduler等服务,并设置开机启动。
[root@master ~]# systemctl enable flanneld.service
[root@master ~]# systemctl enable docker
[root@master ~]# systemctl enable kube-apiserver kube-scheduler kube-controller-manager
[root@master ~]# systemctl start kube-apiserver kube-scheduler kube-controller-manager
启动顺序
[root@master ~]# systemctl start etcd
[root@master ~]# systemctl restart flanneld.service
[root@master ~]# systemctl restart docker
[root@master ~]# systemctl restart kube-apiserver.service
[root@master ~]# systemctl restart kube-controller-manager.service
[root@master ~]# systemctl restart kube-scheduler.service
检查是否生效
确保docker0与flannel0在同一网段。
[root@master ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:e5:0a:47 brd ff:ff:ff:ff:ff:ff
inet 192.168.11.10/24 brd 192.168.11.255 scope global dynamic ens33
valid_lft 1571sec preferred_lft 1571sec
inet6 fe80::20c:29ff:fee5:a47/64 scope link
valid_lft forever preferred_lft forever
3: flannel0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1472 qdisc pfifo_fast state UNKNOWN qlen 500
link/none
inet 172.17.63.0/16 scope global flannel0
valid_lft forever preferred_lft forever
inet6 fe80::3ff4:7f41:553b:d583/64 scope link flags 800
valid_lft forever preferred_lft forever
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN
link/ether 02:42:30:49:69:8f brd ff:ff:ff:ff:ff:ff
inet 172.17.63.1/24 scope global docker0
valid_lft forever preferred_lft forever
查看启动的docker是否被flannel托管:如果有–bip=172.17.45.1/24(xxxx) ,说明Flannel管理了Docker
可以看到docker启动后被加上了flanneld的相关配置项了(bip, ip-masq 和 mtu)
https://blog.csdn.net/yelllowcong/article/details/78303626
[root@master ~]# ps -ef|grep docker 或 ps aux | grep docker
root 1290 1 0 01:05 ? 00:00:59 /usr/bin/dockerd-current --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current --default-runtime=docker-runc --exec-opt native.cgroupdriver=systemd --userland-proxy-path=/usr/libexec/docker/docker-proxy-current --init-path=/usr/libexec/docker/docker-init-current --seccomp-profile=/etc/docker/seccomp.json --selinux-enabled --log-driver=journald --signature-verification=false --storage-driver overlay2 --bip=172.17.63.1/24 --ip-masq=true --mtu=1472
root 1295 1290 0 01:05 ? 00:00:40 /usr/bin/docker-containerd-current -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/containerd --shim docker-containerd-shim --runtime docker-runc --runtime-args --systemd-cgroup=true
[root@master ~]# hostname -I
192.168.11.10 172.17.63.0 172.17.63.1
测试不同节点互通,在当前节点访问另一个Node节点docker0 IP
[root@master ~]# ping 172.17.63.1/24
如果能通说明Flannel部署成功。如果不通检查下日志:journalctl -u flannel
因master防火墙端口问题导致启动失败,node错误信息如下
https://blog.csdn.net/wangshuminjava/article/details/89913701
2 node节点 安装Kubernetes
1.使用yum安装 flannel 和 kubernetes-node
[root@master ~]# yum -y install flannel kubernetes-node
kubeconfig文件用于kubelet连接master apiserver
kubelet 配置文件修改
[root@node1 ~]# vi /etc/kubernetes/config
…
KUBE_MASTER="–master=http://192.168.11.10:8080"
kubelet 核心文件修改
[root@node1 ~]# vi /etc/kubernetes/kubelet
KUBELET_HOSTNAME="–hostname-override=node1"
KUBELET_API_SERVER="–api-servers=http://192.168.11.10:8080"
搭建完成
在master节点查看 node状态,如下信息表示环境搭建成功
[root@master ~]# kubectl get nodes
NAME STATUS AGE
192.168.11.11 NotReady 2h
192.168.11.12 NotReady 2h
查看k8s版本
[root@master hello]# kubectl --version
Kubernetes v1.5.2
[root@master ~]# kubectl version
使用kubectl version 命令,输出的信息会显示client和server的版本信息,client代表kubectl版本信息,server代表的是master节点的k8s版本信息
[root@master ~]# kubectl api-versions
#查看命名空间
[root@master ~]# kubectl get ns
#查看flannel 版本 0.7.1
[root@master ~]# flanneld --version
#查看docker版本 1.13.1
[root@master ~]# docker version
小结
完成安装
7.发布SpringBoot服务
7.1 创建pod : nginx-pod.yaml
kubectl create -f nginx-pod.yaml
。。。。。。
相关错误
报错 i/o time out 未关闭防火墙
【K8s开启防火墙】Failed to list *v1.Endpoints: Get https://10.96.0.1:443/api/v1/endpoints
[root@node1 ~]# systemctl status flanneld.service
● flanneld.service - Flanneld overlay address etcd agent
Loaded: loaded (/usr/lib/systemd/system/flanneld.service; enabled; vendor preset: disabled)
Active: activating (start) since 四 2020-07-30 17:13:02 CST; 5s ago
Main PID: 4112 (flanneld)
Memory: 18.4M
CGroup: /system.slice/flanneld.service
└─4112 /usr/bin/flanneld -etcd-endpoints=http://192.168.11.10:2379 -etcd-prefix=/atomic.io/network
7月 30 17:13:02 node1 systemd[1]: flanneld.service holdoff time over, scheduling restart.
7月 30 17:13:02 node1 systemd[1]: Starting Flanneld overlay address etcd agent...
7月 30 17:13:02 node1 flanneld-start[4112]: I0730 17:13:02.254542 4112 main.go:132] Installing signal handlers
7月 30 17:13:02 node1 flanneld-start[4112]: I0730 17:13:02.254755 4112 manager.go:136] Determining IP address of default interface
7月 30 17:13:02 node1 flanneld-start[4112]: I0730 17:13:02.262847 4112 manager.go:149] Using interface with name ens33 and address 192.168.11.11
7月 30 17:13:02 node1 flanneld-start[4112]: I0730 17:13:02.262895 4112 manager.go:166] Defaulting external address to interface address (192.168.11.11)
7月 30 17:13:03 node1 flanneld-start[4112]: E0730 17:13:03.266076 4112 network.go:102] failed to retrieve network config: client: etcd cluster is unavailable or misconfigur... i/o timeout
7月 30 17:13:05 node1 flanneld-start[4112]: E0730 17:13:05.269109 4112 network.go:102] failed to retrieve network config: client: etcd cluster is unavailable or misconfigur... i/o timeout
7月 30 17:13:07 node1 flanneld-start[4112]: E0730 17:13:07.271349 4112 network.go:102] failed to retrieve network config: client: etcd cluster is unavailable or misconfigur... i/o timeout
Hint: Some lines were ellipsized, use -l to show in full.
Kubernetes 介绍
Kubernetes是一个开源平台,用于跨主机群集自动部署,扩展和操作应用程序容器,提供以容器为中心的基础架构。
使用Kubernetes,您可以快速高效地响应客户需求:
快速,可预测地部署应用程序。
在运行中扩展应用程序。
无缝推出新功能。
仅使用您需要的资源来优化硬件的使用。
我们的目标是建立一个组件和工具的生态系统,以减轻在公共云和私有云中运行应用程序的负担。
Kubernetes是:
Kubernetes是Google开源的容器集群管理系统,实现基于Docker构建容器,利用Kubernetes能很方面管理多台Docker主机中的容器。
主要功能如下:
1)将多台Docker主机抽象为一个资源,以集群方式管理容器,包括任务调度、资源管理、弹性伸缩、滚动升级等功能。
2)使用编排系统(YAML File)快速构建容器集群,提供负载均衡,解决容器直接关联及通信问题
3)自动管理和修复容器,简单说,比如创建一个集群,里面有十个容器,如果某个容器异常关闭,那么,会尝试重启或重新分配容器,始终保证会有十个容器在运行,反而杀死多余的。
kubernetes角色组成:
1)Pod 是kubernetes的最小操作单元,一个Pod可以由一个或多个容器组成;同一个Pod只能运行在同一个主机上,共享相同的volumes、network、namespace;
2)ReplicationController(RC)
RC用来管理Pod,一个RC可以由一个或多个Pod组成,在RC被创建后,系统会根据定义好的副本数来创建Pod数量。在运行过程中,如果Pod数量小于定义的,就会重启停止的或重新分配Pod,反之则杀死多余的。当然,也可以动态伸缩运行的Pods规模。
RC通过label关联对应的Pods,在滚动升级中,RC采用一个一个替换要更新的整个Pods中的Pod。
3)Service 定义了一个Pod逻辑集合的抽象资源,Pod集合中的容器提供相同的功能。集合根据定义的Label和selector完成,当创建一个Service后,会分配一个Cluster IP,这个IP与定义的端口提供这个集合一个统一的访问接口,并且实现负载均衡。
4)Label 用于区分Pod、Service、RC的key/value键值对;
Pod、Service、RC可以有多个label,但是每个label的key只能对应一个;
主要是将Service的请求通过lable转发给后端提供服务的Pod集合;
kubernetes组件组成:
1)kubectl 客户端命令行工具,将接受的命令格式化后发送给kube-apiserver,作为整个系统的操作入口。
2)kube-apiserver 作为整个系统的控制入口,以REST API服务提供接口。
3)kube-controller-manager 用来执行整个系统中的后台任务,包括节点状态状况、Pod个数、Pods和Service的关联等。
4)kube-scheduler 负责节点资源管理,接受来自kube-apiserver创建Pods任务,并分配到某个节点。
5)etcd 负责节点间的服务发现和配置共享。
6)kube-proxy 运行在每个计算节点上,负责Pod网络代理。定时从etcd获取到service信息来做相应的策略。
7)kubelet 运行在每个计算节点上,作为agent,接受分配该节点的Pods任务及管理容器,周期性获取容器状态,反馈给kube-apiserver。
8)DNS 一个可选的DNS服务,用于为每个Service对象创建DNS记录,这样所有的Pod就可以通过DNS访问服务了。
认识kubernetes架构及应用场景
1.k8s在企业中应用场景?
a.k8s构造一套自动化的运维平台,充分利用服务器资源,降本增效
b.充分利用服务器资源(容器)
c.服务无缝迁移
2、服务部署模式变迁及服务部署变化的问题思考?
1.服务部署模式是如何变迁的?
物理机部署(直接部署在物理机上)
2.虚拟化(虚拟机)方式,达到分割物理机资源的作用,充分利用服务器资源
3.容器化的方式部署(云原生)
服务部署模式变迁产生的服务部署变化?
思考:SOA架构、微服务架构模式下,服务拆分越来越多,部署维护的服务越来越多,不好管理。
- 虚拟化(虚拟机)方式,使用OpenStack可视化的方式管理
- 容器化方式部署(k8s管理)更轻量级虚拟机
面临的问题:微服务架构模式下,服务越来越多:
*如何进行横向扩展(加机器?)。
*容器宕机怎么办
*数据怎么恢复
*如何发版、更新且不影响业务(k8s滚动更新)
*如何监控容器
*容器如何调度创建?数据安全性如何保证。
云架构&云原生
云架构
IaaS 基础设施即服务
用户:租用(购买|分配权限)云主机,用户就不需要考虑网络,存储,DNS,硬件环境方面的问题。
运营商:提供网络、存储、DNS,这样的服务就叫做基础设施服务
PaaS 平台即服务:MySQL、ES、MQ等
SaaS 钉钉软件
Serverless 无服务模式:站在用户角度 sever less
用户只需要云服务器,在云服务器所有的基础环境,软件环境都不需要用户考虑。
云原生
一句话就是为了让应用服务项目软件,都运行在云上的解决方案
特点:容器化、微服务、CI\CD可持续交付扩展、DevOps开发运维
k8s架构基本原理
Kubernetes是一个开源容器协调器,由Google使用GO语言开发,用于管理在容器环境中运行的应用程序。
集群特点:K8s集群 Master Node1 Node2
master:192.168.11.10 服务:apiserver, controller-manager, scheduler,etcd
node1:192.168.11.11 服务:flannel, docker, kubelet, kube-proxy
node1:192.168.11.12 服务:flannel, docker, kubelet, kube-proxy
Master节点
Master节点:只负责调度、网关、控制器、资源对象存储
API Server、Scheduler、Controller Manager、Etcd
API Server
API Server 是k8s网关,所有请求都经过api server
Scheduler
Scheduler 调度器,把请求调度到某个服务器
Controller Manager
Controller Manager 控制器,维护K8s资源对象,CRUD添加、修改、删除、查询
Etcd
Etcd 存储资源对象,做服务注册与发现
NODE节点
Node节点扫描Etcd,获取相关数据信息
docker 容器引擎
kubelet 操作本地的容器维护,如CRUD。在每一个node节点都存在一份,在node节点上的资源操作指令由kubelet执行。
kube-proxy 代理服务,负载均衡
Fluentd 日志收集服务
pod 是K8s管理的基本单元,pod内部是容器,K8s不直接操作容器,而是管理Pod。
容器存储在Node节点下的Pod内部
深入认识kubernetes核心组件及原理
pod核心原理
POD是什么
pod是一个虚拟化资源对象,有独立的IP地址和主机名hostname,Pod用namespace进行资源隔离。相当于一台独立的沙箱。
pod是一个容器组,pod容器中装载的是docker创建的容器。
Pod在系统中是一个进程
https://www.cnblogs.com/xkops/p/6169034.html
参考资料
https://www.cnblogs.com/wangyongqiang/articles/12564373.html
使用flannel配置docker网络
https://blog.csdn.net/liumiaocn/article/details/88839952
Kubernetes部署(一):架构及功能说明
https://blog.51cto.com/billy98/2334654
Kubernetes核心概念总结
https://www.cnblogs.com/zhenyuyaodidiao/p/6502171.html