【K8s 精选】CKA - 管理高可用性 Kubernetes 集群
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了【K8s 精选】CKA - 管理高可用性 Kubernetes 集群相关的知识,希望对你有一定的参考价值。
参考技术A 创建 HA 集群的一般步骤:
● 设置负载均衡器。有许多开源选项可用于负载均衡:HAproxy、Envoy 或来自云提供商的类似负载均衡器效果很好。
● 在第一个控制平面节点上运行 kubeadm init ,并进行以下修改:
① 创建 kubeadm 配置文件
② 在配置文件中,将 controlPlaneEndpoint 字段设置为可以访问负载均衡器的位置。
③ 运行 init,带有如下 --upload-certs 标志: sudo kubeadm init --config=kubeadm-config.yaml --upload-certs
● kubeadm join –control-plane 在您想要扩展控制平面节点集时随时运行。控制平面和普通节点可以随时以任何顺序加入。
① 3 台机器作为控制面节点、3 台机器作为工作节点、3 台机器作为外部 etcd 集群(外部 etcd 拓扑方案)
② 在集群中,确保所有计算机之间存在全网络连接(公网或私网)
③ 在所有机器上具有 sudo 权限
④ 从某台设备通过 ssh 访问系统中所有节点的能力
⑤ 所有机器上已经安装 kubeadm 和 kubelet , kubectl 是可选的
每个控制平面节点创建一个本地 etcd 成员(member) 。该 etcd 成员只与该节点的 kube-apiserver 、 kube-controller-manager 、 kube-scheduler 实例通信。
堆叠(stacked) etcd 方案,在控制平面设置负载均衡后,自动管理 etcd 的 external 对象下带有 endpoints 的配置文件。
etcd 分布式数据存储集群在独立于控制平面节点的其他节点上运行 。每个控制平面节点都运行 kube-apiserver , kube-scheduler 和 kube-controller-manager 实例。 每个 etcd 主机与每个控制平面节点的 kube-apiserver 通信 。
● 利用 kubeadm 创建高可用 etcd 集群
● 配置 SSH 。
● 将以下文件从集群中的任何 etcd 节点复制到第一个控制平面节点:
使用 kube-vip 管理K8S控制面高可用
(给Go开发大全
加星标)
【导读】kube-vip带你告别HAProxy、Keepallived,轻松实现k8s控制面高可用。
太长不看版
kube-vip提供了一个kubernetes原生的控制面节点高可用负载均衡,构建高可用集群时可以省去在集群外部搭建HAProxy和Keepalived的过程。
使用Kube-vip的动机
一天我读Vmware Tanzu release note时发现了这么一条:
kube-vip 替换了vSphere deployment的HAProxy负载均衡
(https://docs.vmware.com/en/VMware-Tanzu-Kubernetes-Grid/1.2/rn/VMware-Tanzu-Kubernetes-Grid-12-Release-Notes.html)
我非常好奇这个kube-vip是什么东西。我用了3节点控制面的kubeadmin自建集群验证了一下这个工具,本文是我的验证过程和结果记录。
kube-vip是什么
kube-vip(https://kube-vip.io/)是一个开源项目,它提供了kubernetes集群内部和外部的高可用和负载均衡。本文中只介绍kubernetes集群内的控制面负载均衡。
HA集群搭建
我们来对比HAProxy和kube-vip的高可用集群搭建方式。
如果不使用kube-vip、用比较传统的办法,当在一个非云环境中搭建k8s集群时,你需要预备一个硬件/软件的负载均衡,这个负载均衡后面对接多个控制面集群。开源的解决方案就是HAProxy+Keepalived。
一个典型方案是,准备两台负载均衡VM,为这两台VM配置一个VIP(virtual ip)保证冗余。在这两台机器上部署负载均衡服务,任意一台VM都可以做“负责把流量转发到k8s控制面节点上”。
这个方案所需的两台非k8s管理的VM,增加了运维成本。
再看看kube-vip的架构图:
你当然可以选择BGP/ARP协议构建负载均衡,但本文中我不会介绍和推荐BGP,因为这里我的目的是快速试用kube-vip功能,因此选只用了ARP协议和静态pod。
环境准备
-
3 控制面节点 -
3 工作节点
在主机上安装如下依赖:kubeadm, kubelet, kubectl和一个容器运行时。这里我用的容器运行时是containerd。
拉取kube-vip的docker镜像,在/etc/kubernetes/manifests
路径下配置好pod的yaml文件,这样k8s就能把kube-vip pod部署到每个控制面节点上。
export VIP=192.168.0.100
export INTERFACE=eth0 # 网卡
ctr image pull docker.io/plndr/kube-vip:0.3.1
ctr run --rm --net-host docker.io/plndr/kube-vip:0.3.1 vip
/kube-vip manifest pod
--interface $INTERFACE
--vip $VIP
--controlplane
--services
--arp
--leaderElection | tee /etc/kubernetes/manifests/kube-vip.yaml
部署好kube-vip pod后部署kubeadm。下面是我的配置,供参考:
# 配置kubelet
cat > ~/init_kubelet.yaml <<EOF
apiVersion: kubeadm.k8s.io/v1beta2
kind: InitConfiguration
bootstrapTokens:
- token: "9a08jv.c0izixklcxtmnze7"
description: "kubeadm bootstrap token"
ttl: "24h"
nodeRegistration:
criSocket: "/var/run/containerd/containerd.sock"
---
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
controlPlaneEndpoint: "192.168.0.100:6443"
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: "systemd"
protectKernelDefaults: true
EOF
执行:
kubeadm init --config init_kubelet.yaml --upload-certs
安装CNI。这里使用了cilium安装,实际上用什么工具装都可以:
curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash
helm repo add cilium https://helm.cilium.io/
helm install cilium cilium/cilium --version 1.9.4
--namespace kube-system
安装完第一个控制面节点后,要让其他节点接入你这个集群。在其他的控制面节点上执行下面的命令:
kubeadm join 192.168.0.100:6443 --token hash.hash
--discovery-token-ca-cert-hash sha256:hash
--control-plane --certificate-key key
这样控制面节点就配置好了,对于其他工作节点,执行如下命令:
kubeadm join 192.168.0.100:6443 --token hash.hash
--discovery-token-ca-cert-hash sha256:hash
用kubect查看节点,结果如下:
$ kubectl get node -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
k8s-master-0 Ready control-plane,master 121m v1.20.2 192.168.0.201 <none> Ubuntu 20.04.2 LTS 5.4.0-45-generic containerd://1.4.3
k8s-master-1 Ready control-plane,master 114m v1.20.2 192.168.0.202 <none> Ubuntu 20.04.2 LTS 5.4.0-45-generic containerd://1.4.3
k8s-master-2 Ready control-plane,master 113m v1.20.2 192.168.0.203 <none> Ubuntu 20.04.2 LTS 5.4.0-45-generic containerd://1.4.3
k8s-worker-0 Ready <none> 114m v1.20.2 192.168.0.204 <none> Ubuntu 20.04.2 LTS 5.4.0-45-generic containerd://1.4.3
k8s-worker-1 Ready <none> 114m v1.20.2 192.168.0.205 <none> Ubuntu 20.04.2 LTS 5.4.0-45-generic containerd://1.4.3
k8s-worker-2 Ready <none> 112m v1.20.2 192.168.0.206 <none> Ubuntu 20.04.2 LTS 5.4.0-45-generic containerd://1.4.3
这时你的控制节点端口依然是192.168.0.100
,不依赖其他节点。
- EOF -
1、
2、
3、
Go 开发大全
参与维护一个非常全面的Go开源技术资源库。日常分享 Go, 云原生、k8s、Docker和微服务方面的技术文章和行业动态。
关注后获取
回复 Go 获取6万star的Go资源库
分享、点赞和在看
支持我们分享更多好文章,谢谢!
以上是关于【K8s 精选】CKA - 管理高可用性 Kubernetes 集群的主要内容,如果未能解决你的问题,请参考以下文章
【K8s 精选】CKA - ClusterIP、NodePort、LoadBalancer 的使用