Kubernetes(k8s)
是Google
开源的容器集群管理系统(谷歌内部:Borg)。
在Docker
技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性。
Kubernetes
集群中主要存在两种类型的节点,分别是 master 节点
,以及 minion 节点
。
Minion 节点
是实际运行 Docker 容器的节点,负责和节点上运行的 Docker 进行交互,并且提供了代理功能。
Master 节点
负责对外提供一系列管理集群的 API 接口,并且通过和 Minion 节点
交互来实现对集群的操作管理。
apiserver
:用户和 kubernetes
集群交互的入口,封装了核心对象的增删改查操作,提供了 RESTFul 风格的 API 接口
,通过 etcd
来实现持久化并维护对象的一致性。
scheduler
:负责集群资源的调度和管理,例如当有pod
异常退出需要重新分配机器时,scheduler
通过一定的调度算法从而找到最合适的节点。
controller-manager
:主要是用于保证 replicationController
定义的复制数量和实际运行的 pod
数量一致,另外还保证了从 service
到 pod
的映射关系总是最新的。
kubelet
:运行在 minion 节点
,负责和节点上的 Docker
交互,例如启停容器,监控运行状态等。
proxy
:运行在 minion 节点
,负责为 pod
提供代理功能,会定期从 etcd
获取 service
信息,并根据 service
信息通过修改 iptables
来实现流量转发(最初的版本是直接通过程序提供转发功能,效率较低。),将流量转发到要访问的 pod
所在的节点上去。
etcd
:key-value键值存储数据库,用来存储kubernetes
的信息的。
flannel
:Flannel
是 CoreOS
团队针对 Kubernetes
设计的一个覆盖网络(Overlay Network)
工具,需要另外下载部署。
我们知道当我们启动 Docker
后会有一个用于和容器进行交互的 IP
地址,如果不去管理的话可能这个 IP
地址在各个机器上是一样的,并且仅限于在本机上进行通信,无法访问到其他机器上的 Docker
容器。
Flannel
的目的就是为集群中的所有节点重新规划 IP
地址的使用规则,从而使得不同节点上的容器能够获得同属一个内网且不重复的 IP
地址,并让属于不同节点上的容器能够直接通过内网 IP
通信。
Pod
运行于Node节点上,若干相关容器的组合。Pod内包含的容器运行在同一宿主机上,使用相同的网络命名空间、IP地址和端口,能够通过localhost进行通。
Pod是Kurbernetes进行创建、调度和管理的最小单位,它提供了比容器更高层次的抽象,使得部署和管理更加灵活。一个Pod可以包含一个容器或者多个相关容器。
Replication Controller
Replication Controller用来管理Pod的副本,保证集群中存在指定数量的Pod副本。
集群中副本的数量大于指定数量,则会停止指定数量之外的多余容器数量,反之,则会启动少于指定数量个数的容器,保证数量不变。
Replication Controller是实现弹性伸缩、动态扩容和滚动升级的核心。
Service
Service定义了Pod的逻辑集合和访问该集合的策略,是真实服务的抽象。
Service提供了一个统一的服务访问入口以及服务代理和发现机制,用户不需要了解后台Pod是如何运行。
Label
Kubernetes中的任意API对象都是通过Label进行标识,Label的实质是一系列的K/V键值对。Label是Replication Controller和Service运行的基础,二者通过Label来进行关联Node上运行的Pod。
Node
Node是Kubernetes集群架构中运行Pod的服务节点(或agent)。
Node是Kubernetes集群操作的单元,用来承载被分配Pod的运行,是Pod运行的宿主机。
三台Centos7系统的虚拟机(1个master+2个node),三台机器上的防火墙,SELINUX全部关掉。我的实验坏境可以上网,默认的YUM源就可以用。
192.168.10.1 # master节点(etcd,kubernetes-master)
192.168.10.2 # node1节点(etcd,kubernetes-node,docker,flannel)
192.168.10.3 # node2节点(etcd,kubernetes-node,docker,flannel)
step1:在master上安装
yum install kubernetes-master etcd flannel -y
step2:在node上安装
yum install kubernetes-node etcd flannel -y
step3:etcd集群配置
在master节点上编辑etcd配置文件
# [member]
ETCD_NAME=etcd1
ETCD_DATA_DIR="/var/lib/etcd/etcd1.etcd"
ETCD_LISTEN_PEER_URLS="http://192.168.10.1:2380"
ETCD_LISTEN_CLIENT_URLS="http://192.168.10.1:2379,http://127.0.0.1:2379"
CD_MAX_SNAPSHOTS="5"
#[cluster]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.10.1:2380"
ETCD_INITIAL_CLUSTER="etcd1=http://192.168.10.1:2380,etcd2=http://192.168.10.2:2380,etcd3=http://192.168.10.3:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.10.1:2379"
在node1节点上编辑etcd配置文件
# [member]
ETCD_NAME=etcd2
ETCD_DATA_DIR="/var/lib/etcd/etcd2"
ETCD_LISTEN_PEER_URLS="http://192.168.10.2:2380"
ETCD_LISTEN_CLIENT_URLS="http://192.168.10.2:2379,http://127.0.0.1:2379"
#[cluster]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.10.2:2380"
ETCD_INITIAL_CLUSTER="etcd1=http://192.168.10.1:2380,etcd2=http://192.168.10.2:2380,etcd3=http://192.168.10.3:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.10.2:2379"
在node2节点上编辑etcd配置文件
# [member]
ETCD_NAME=etcd3
ETCD_DATA_DIR="/var/lib/etcd/etcd3"
ETCD_LISTEN_PEER_URLS="http://192.168.10.3:2380"
ETCD_LISTEN_CLIENT_URLS="http://192.168.10.3:2379,http://127.0.0.1:2379"
#[cluster]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.10.3:2380"
ETCD_INITIAL_CLUSTER="etcd1=http://192.168.10.1:2380,etcd2=http://192.168.10.2:2380,etcd3=http://192.168.10.3:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.10.3:2379"
到此etcd集群就部署完了,然后每个节点上启动
systemctl start etcd
step4:验证
[root@k8smaster ~]# etcdctl cluster-health
member 35300bfb53081a3b is healthy: got healthy result from http://192.168.10.1:2379
member 776c306b60efs9d2 is healthy: got healthy result from http://192.168.10.2:2379
member a40f86f061bsdfse is healthy: got healthy result from http://192.168.10.3:2379
step5:kubernetes master安装
[root@k8smaster ~]# vi /etc/kubernetes/apiserver
KUBE_API_ADDRESS="--address=0.0.0.0"
KUBE_API_PORT="--port=8080"
KUBELET_PORT="--kubelet-port=10250"
KUBE_ETCD_SERVERS="--etcd-servers=http://192.168.10.1:2379,http://192.168.10.2:2379,http://192.168.10.3:2379"
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"
KUBE_API_ARGS=""
step6:启动Master上的三个服务
systemctl start kube-apiserver
systemctl start kube-controller-manager
systemctl start kube-scheduler
systemctl enable kube-apiserver
systemctl enable kube-controller-manager
systemctl enable kube-scheduler
step7:kubernetes node安装
[root@k8snode1 ~]# vi /etc/kubernetes/config
UBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=0"
KUBE_ALLOW_PRIV="--allow-privileged=false"
KUBE_MASTER="--master=http://192.168.10.1:8080"
[root@k8snode1 ~]# vi /etc/kubernetes/kubelet
KUBELET_ADDRESS="--address=127.0.0.1"
KUBELET_HOSTNAME="--hostname-override=192.168.10.2"
KUBELET_API_SERVER="--api-servers=http://192.168.10.1:8080"
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"
KUBELET_ARGS=""
node2 节点重复上述操作
step8:分别启动kubernetes node服务
systemctl start kubelet
systemctl start kube-proxy
systemctl enable kubelet
systemctl enable kube-proxy
因为kubernetes
集群中网络部分是插件形式安装的,我们这里选用flannel
上述安装步骤已经 install 了
[root@k8smaster ~]# vi /etc/sysconfig/flanneld
FLANNEL_ETCD_KEY="/atomic.io
FLANNEL_ETCD="http://192.168.10.1:2379"
FLANNEL_ETCD_KEY="/coreos.com/network"
为flannel创建分配的网络
# 只在master上etcd执行如下命令,定义flannel网络
etcdctl mk /atomic.io/network/config '{"Network":"172.17.0.0/16"}'
etcdctl rm /coreos.com/network/ --recursive //若要重新建,先删除
在master上执行下面,检查kubernetes的状态
[root@k8smaster ~]# kubectl get nodes
NAME STATUS AGE
192.168.10.2 Ready 1h
192.168.10.3 Ready 2h
kubectl describe pod/rc/node -n=kube-system
journalctl -u kubelet -o cat //查看kubectl 的运行日志
systemctl status kubelet
systemctl status docker
systemctl status flanneld.service
systemctl status kube-proxy.service
欢迎关注: 无量测试之道
公众号,回复: 领取资源
Python+Unittest框架API自动化、
Python+Unittest框架API自动化、
Python+Pytest框架API自动化、
Python+Pandas+Pyecharts大数据分析、
Python+Selenium框架Web的UI自动化、
Python+Appium框架APP的UI自动化、
Python编程学习资源干货、
Vue前端组件化框架开发、
资源和代码 免费送啦~
包含:数据分析、大数据、机器学习、测试开发、API接口自动化、测试运维、UI自动化、性能测试、代码检测、编程技术等。
微信搜索公众号: 无量测试之道
,添加关注,让我们一起共同成长 !