资讯专栏INFORMATION COLUMN

Kubernetes的几种主流部署方式02-kubeadm部署1.14版本高可用集群

superw / 2194人阅读

摘要:所以,选择把运行直接运行在宿主机中,使用容器部署其他组件。独立部署方式所需机器资源多按照集群的奇数原则,这种拓扑的集群关控制平面最少就要台宿主机了。

在上篇文章minikube部署中,有提到Minikube部署Kubernetes的核心就是Kubeadm,这篇文章来详细说明下Kubeadm原理及部署步骤。写这篇文章的时候,Kubernetes1.14刚刚发布,所以部署步骤以1.14版为主。

Kubeadm原理简述

Kubeadm工具的出发点很简单,就是尽可能简单的部署一个生产可用的Kubernetes集群。实际也确实很简单,只需要两条命令:

</>复制代码

  1. # 创建一个 Master 节点
  2. $ kubeadm init
  3. # 将一个 Node 节点加入到当前集群中
  4. $ kubeadm join

kubeadm做了这些事
执行 kubeadm init时:

自动化的集群机器合规检查

自动化生成集群运行所需的各类证书及各类配置,并将Master节点信息保存在名为cluster-info的ConfigMap中。

通过static Pod方式,运行API server, controller manager 、scheduler及etcd组件。

生成Token以便其他节点加入集群

执行 kubeadm join时:

节点通过token访问kube-apiserver,获取cluster-info中信息,主要是apiserver的授权信息(节点信任集群)。

通过授权信息,kubelet可执行TLS bootstrapping,与apiserver真正建立互信任关系(集群信任节点)。

简单来说,kubeadm做的事就是把大部分组件都容器化,通过StaticPod方式运行,并自动化了大部分的集群配置及认证等工作,简单几步即可搭建一个可用Kubernetes的集群。

这里有个问题,为什么不把kubelet组件也容器化呢,是因为,kubelet在配置容器网络、管理容器数据卷时,都需要直接操作宿主机,而如果现在 kubelet 本身就运行在一个容器里,那么直接操作宿主机就会变得很麻烦。比如,容器内要做NFS的挂载,需要kubelet先在宿主机执行mount挂载NFS。如果kubelet运行在容器中问题来了,如果kubectl运行在容器中,要操作宿主机的Mount Namespace是非常复杂的。所以,kubeadm选择把kubelet运行直接运行在宿主机中,使用容器部署其他Kubernetes组件。所以,Kubeadm部署要安装的组件有Kubeadm、kubelet、kubectl三个。

上面说的是kubeadm部署方式的一般步骤,kubeadm部署是可以自由定制的,包括要容器化哪些组件,所用的镜像,是否用外部etcd,是否使用用户证书认证等以及集群的配置等等,都是可以灵活定制的,这也是kubeadm能够快速部署一个高可用的集群的基础。详细的说明可以参考官方Reference。但是,kubeadm最重要的作用还是解决集群部署问题,而不是集群配置管理的问题,官方也建议把Kubeadm作为一个基础工具,在其上层再去量身定制适合自己的集群的管理工具(例如minikube)。

Kubeadm部署一个高可用集群 Kubernetes的高可用

Kubernetes的高可用主要指的是控制平面的高可用,简单说,就是有多套Master节点组件和Etcd组件,工作节点通过负载均衡连接到各Master。HA有两种做法,一种是将etcd与Master节点组件混布在一起:

另外一种方式是,使用独立的Etcd集群,不与Master节点混布:

两种方式的相同之处在于都提供了控制平面的冗余,实现了集群高可以用,区别在于:
Etcd混布方式:

所需机器资源少

部署简单,利于管理

容易进行横向扩展

风险大,一台宿主机挂了,master和etcd就都少了一套,集群冗余度受到的影响比较大。

Etcd独立部署方式:

所需机器资源多(按照Etcd集群的奇数原则,这种拓扑的集群关控制平面最少就要6台宿主机了)。

部署相对复杂,要独立管理etcd集群和和master集群。

解耦了控制平面和Etcd,集群风险小健壮性强,多带带挂了一台master或etcd对集群的影响很小。

部署环境

由于机器资源不足,下面的部署测试,只会以混布的方式部署一个1*haproxy,2*master,2*node,共5台机器的集群,实际上由于etcd选举要过半数,至少要3台master节点才能构成高可用,在生产环境,还是要根据实际情况,尽量选择风险低的拓扑结构。

机器:

master-1:192.168.41.230 (控制平面节点1)
master-2:192.168.41.231 (控制平面节点2)
node-1:172.16.201.108 (工作节点1)
node-2:172.16.201.109 (工作节点2)
haproxy:192.168.41.231 (haproxy)

系统内核版本:

</>复制代码

  1. # cat /etc/redhat-release
  2. CentOS Linux release 7.6.1810 (Core)
  3. # uname -r
  4. 5.0.5-1.el7.elrepo.x86_64

集群版本

kubeadm:1.14.0
Kubernetes:1.14.0
Docker:Community 18.09.4
haproxy: 1.5.18

部署步骤 机器准备

</>复制代码

  1. 在所有节点上操作:

关闭selinux,firewall

</>复制代码

  1. setenforce 0
  2. sed -i "s/SELINUX=enforcing/SELINUX=permissive/" /etc/selinux/config
  3. systemctl stop firewalld
  4. systemctl disable firewalld

关闭swap,(1.8版本后的要求,目的应该是不想让swap干扰pod可使用的内存limit)

</>复制代码

  1. swapoff -a

修改下面内核参数,否则请求数据经过iptables的路由可能有问题

</>复制代码

  1. cat < /etc/sysctl.d/k8s.conf
  2. net.bridge.bridge-nf-call-ip6tables = 1
  3. net.bridge.bridge-nf-call-iptables = 1
  4. EOF
  5. sysctl --system
安装kubeadm、docker

</>复制代码

  1. 在除了haproxy以外所有节点上操作

将Kubernetes安装源改为阿里云,方便国内网络环境安装

</>复制代码

  1. cat << EOF > /etc/yum.repos.d/kubernetes.repo
  2. [kubernetes]
  3. name=Kubernetes
  4. baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
  5. enabled=1
  6. gpgcheck=1
  7. repo_gpgcheck=1
  8. gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
  9. EOF

安装docker-ce

</>复制代码

  1. wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  2. yum install -y docker-ce

安装kubelet kubeadm kubectl

</>复制代码

  1. yum install -y kubelet kubeadm kubectl
安装配置负载均衡

</>复制代码

  1. 在haproxy节点操作:

</>复制代码

  1. # 安装haproxy
  2. yum install haproxy -y
  3. # 修改haproxy配置
  4. cat << EOF > /etc/haproxy/haproxy.cfg
  5. global
  6. log 127.0.0.1 local2
  7. chroot /var/lib/haproxy
  8. pidfile /var/run/haproxy.pid
  9. maxconn 4000
  10. user haproxy
  11. group haproxy
  12. daemon
  13. defaults
  14. mode tcp
  15. log global
  16. retries 3
  17. timeout connect 10s
  18. timeout client 1m
  19. timeout server 1m
  20. frontend kube-apiserver
  21. bind *:6443 # 指定前端端口
  22. mode tcp
  23. default_backend master
  24. backend master # 指定后端机器及端口,负载方式为轮询
  25. balance roundrobin
  26. server master-1 192.168.41.230:6443 check maxconn 2000
  27. server master-2 192.168.41.231:6443 check maxconn 2000
  28. EOF
  29. # 开机默认启动haproxy,开启服务
  30. systemctl enable haproxy
  31. systemctl start haproxy
  32. # 检查服务端口情况:
  33. # netstat -lntup | grep 6443
  34. tcp 0 0 0.0.0.0:6443 0.0.0.0:* LISTEN 3110/haproxy
部署Kubernetes

</>复制代码

  1. 在master-1节点操作:

准备集群配置文件,目前用的api版本为v1beta1,具体配置可以参考官方reference

</>复制代码

  1. cat << EOF > /root/kubeadm-config.yaml
  2. apiVersion: kubeadm.k8s.io/v1beta1
  3. kind: ClusterConfiguration
  4. kubernetesVersion: v1.14.0 # 指定1.14版本
  5. controlPlaneEndpoint: 192.168.41.232:6443 # haproxy地址及端口
  6. imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers # 指定镜像源为阿里源
  7. networking:
  8. podSubnet: 10.244.0.0/16 # 计划使用flannel网络插件,指定pod网段及掩码
  9. EOF

执行节点初始化

</>复制代码

  1. systemctl enable kubelet
  2. systemctl start kubelet
  3. kubeadm config images pull --config kubeadm-config.yaml # 通过阿里源预先拉镜像
  4. kubeadm init --config=kubeadm-config.yaml --experimental-upload-certs

安装成功,可以看到输出

</>复制代码

  1. You can now join any number of the control-plane node running the following command on each as root:
  2. # master节点用以下命令加入集群:
  3. kubeadm join 192.168.41.232:6443 --token ocb5tz.pv252zn76rl4l3f6
  4. --discovery-token-ca-cert-hash sha256:141bbeb79bf58d81d551f33ace207c7b19bee1cfd7790112ce26a6a300eee5a2
  5. --experimental-control-plane --certificate-key 20366c9cdbfdc1435a6f6d616d988d027f2785e34e2df9383f784cf61bab9826
  6. Then you can join any number of worker nodes by running the following on each as root:
  7. # 工作节点用以下命令加入集群:
  8. kubeadm join 192.168.41.232:6443 --token ocb5tz.pv252zn76rl4l3f6
  9. --discovery-token-ca-cert-hash sha256:141bbeb79bf58d81d551f33ace207c7b19bee1cfd7790112ce26a6a300eee5a2

原来的kubeadm版本,join命令只用于工作节点的加入,而新版本加入了 --experimental-contaol-plane 参数后,控制平面(master)节点也可以通过kubeadm join命令加入集群了。

加入另外一个master节点

</>复制代码

  1. 在master-2操作:

</>复制代码

  1. kubeadm join 192.168.41.232:6443 --token ocb5tz.pv252zn76rl4l3f6
  2. --discovery-token-ca-cert-hash sha256:141bbeb79bf58d81d551f33ace207c7b19bee1cfd7790112ce26a6a300eee5a2
  3. --experimental-control-plane --certificate-key 20366c9cdbfdc1435a6f6d616d988d027f2785e34e2df9383f784cf61bab9826
  4. mkdir -p $HOME/.kube
  5. cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  6. chown $(id -u):$(id -g) $HOME/.kube/config

现在,在任何一个master 节点,执行kubectl get no,可以看到,集群中已经有2台master节点了

</>复制代码

  1. # kubectl get no
  2. NAME STATUS ROLES AGE VERSION
  3. master-1 NotReady master 34m v1.14.0
  4. master-2 NotReady master 4m52s v1.14.0

加入两个工作节点

</>复制代码

  1. 分别在两个node节点操作:

</>复制代码

  1. kubeadm join 192.168.41.232:6443 --token ocb5tz.pv252zn76rl4l3f6
  2. --discovery-token-ca-cert-hash sha256:141bbeb79bf58d81d551f33ace207c7b19bee1cfd7790112ce26a6a300eee5a2

再次执行kubectl get no

</>复制代码

  1. # kubectl get no
  2. NAME STATUS ROLES AGE VERSION
  3. master-1 NotReady master 45m v1.14.0
  4. master-2 NotReady master 15m v1.14.0
  5. node-1 NotReady 6m19s v1.14.0
  6. node-2 NotReady 4m59s v1.14.0

可以看到两个node节点都加入集群了。可是,各个节点状态为什么都是NotReady呢。通过执行kubectl describe master-1,可以看到这样的提示:

</>复制代码

  1. runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized

原来是因为网络插件没有就绪导致的。所以 ,我们来安装一波

</>复制代码

  1. kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml

再次查看节点状态,可以看到所有节点都已经ready了。

</>复制代码

  1. # kubectl get no
  2. NAME STATUS ROLES AGE VERSION
  3. master-1 Ready master 134m v1.14.0
  4. master-2 Ready master 104m v1.14.0
  5. node-1 Ready 94m v1.14.0
  6. node-2 Ready 93m v1.14.0

至此,一个2主节点2工作节点的k8s集群已经搭建完毕。如果要加入更多的master或node节点,只要多次执行kubeadm join命令加入集群就好,不需要额外配置,非常方便。

集群测试

跟上篇文章minikube部署一样,这里部署一个简单的goweb服务来测试集群,运行时暴露8000端口,同时访问/info路径会显示容器的主机名。

准备deployment和svc的yaml:

</>复制代码

  1. # deployment-goweb.yaml
  2. apiVersion: apps/v1
  3. kind: Deployment
  4. metadata:
  5. name: goweb
  6. spec:
  7. selector:
  8. matchLabels:
  9. app: goweb
  10. replicas: 4
  11. template:
  12. metadata:
  13. labels:
  14. app: goweb
  15. spec:
  16. containers:
  17. - image: lingtony/goweb
  18. name: goweb
  19. ports:
  20. - containerPort: 8000

</>复制代码

  1. # svc-goweb.yaml
  2. apiVersion: v1
  3. kind: Service
  4. metadata:
  5. name: gowebsvc
  6. spec:
  7. selector:
  8. app: goweb
  9. ports:
  10. - name: default
  11. protocol: TCP
  12. port: 80
  13. targetPort: 8000

部署服务

</>复制代码

  1. kubectl apply -f deployment-goweb.yaml
  2. kubectl apply -y svc-goweb.yaml

查看pod及服务

</>复制代码

  1. [root@master-1 ~]# kubectl get po -o wide
  2. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
  3. goweb-6c569f884-67z89 1/1 Running 0 25m 10.244.1.2 node-1
  4. goweb-6c569f884-bt4p6 1/1 Running 0 25m 10.244.1.3 node-1
  5. goweb-6c569f884-dltww 1/1 Running 0 25m 10.244.1.4 node-1
  6. goweb-6c569f884-vshkm 1/1 Running 0 25m 10.244.3.4 node-2
  7. # 可以看到,4个pod分布在不同的node上
  8. [root@master-1 ~]# kubectl get svc
  9. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  10. gowebsvc ClusterIP 10.106.202.0 80/TCP 11m
  11. kubernetes ClusterIP 10.96.0.1 443/TCP 21h
  12. # 暴露80端口

测试访问

</>复制代码

  1. [root@master-1 ~]# curl http://10.106.202.0/info
  2. Hostname: goweb-6c569f884-bt4p6
  3. [root@master-1 ~]# curl http://10.106.202.0/info
  4. Hostname: goweb-6c569f884-67z89
  5. [root@master-1 ~]# curl http://10.106.202.0/info
  6. Hostname: goweb-6c569f884-vshkm
  7. #可以看到,对SVC的请求会在pod间负载均衡。
小结

本文简单介绍了kubeadm工具原理,以及如何用它部署一个高可用的kubernetes集群。需要注意的是,kubeadm工具总体已经GA,可以在生产环境使用了。但是文中通过"kubeadm join -experimental-contaol-plane"参数增加主节点的方式,还是在alpha阶段,实际在生产环境还是用init方式来增加主节点比较稳定。kubeadm更多详细配置可以参考官方文档

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/32964.html

相关文章

  • Kubernetes几种主流部署方式02-kubeadm部署1.14版本可用集群

    摘要:所以,选择把运行直接运行在宿主机中,使用容器部署其他组件。独立部署方式所需机器资源多按照集群的奇数原则,这种拓扑的集群关控制平面最少就要台宿主机了。 在上篇文章minikube部署中,有提到Minikube部署Kubernetes的核心就是Kubeadm,这篇文章来详细说明下Kubeadm原理及部署步骤。写这篇文章的时候,Kubernetes1.14刚刚发布,所以部署步骤以1.14版为...

    atinosun 评论0 收藏0
  • Kubernetes几种主流部署方式01-minikube部署

    摘要:代表的解决方案为。虽然官网列出的部署方式很多,但也不用被这么多种部署方式搞糊涂了。虽然只是一条命令,但其实执行了很多步骤命令执行后输出如下可以看到,主要做了这些事创建了名为的虚拟机,并在虚拟机中安装了容器运行时。 综述 Kubernetes集群的组件众多,要部署一套符合生产环境的集群不是一件容易的事。好在随着社区的快速发展,特别是在它成为事实上的容器编排标准以后,基本所有的主流云平台都...

    Lionad-Morotar 评论0 收藏0
  • Kubernetes几种主流部署方式01-minikube部署

    摘要:代表的解决方案为。虽然官网列出的部署方式很多,但也不用被这么多种部署方式搞糊涂了。虽然只是一条命令,但其实执行了很多步骤命令执行后输出如下可以看到,主要做了这些事创建了名为的虚拟机,并在虚拟机中安装了容器运行时。 综述 Kubernetes集群的组件众多,要部署一套符合生产环境的集群不是一件容易的事。好在随着社区的快速发展,特别是在它成为事实上的容器编排标准以后,基本所有的主流云平台都...

    浠ラ箍 评论0 收藏0
  • U产品快报 | UCloud 智能大数据平台USDP公测、快杰裸金属服务器上线等重要更新

    摘要:帮助企业快速搭建和使用大数据平台,降低大数据开发运维成本。发布范围北京二可用区灰度中。机型快杰版的数据库实例,采用业内主流的计算存储分离架构计算层使用高性能快杰云主机,存储层采用超高性能云盘。UCloud PyPI私有源上线PyPI是Python官方的第三方库的仓库,为解决默认官方源在国内的访问速度受限,并发请求受限,经常出现丢包、超时等问题,UCloud 近期上线了PyPI私有源。PyPI...

    Tecode 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<