kubernetes Master部署之ControllerManager部署(4)

时间:2022-11-26 16:22:51

Controller Manager作为集群内部的管理控制中心,主要负责集群内的资源管理,包括Node、Pod、命名空间、额定资源等。比如当某个Node意外宕机,Controller Manager会及时发现并执行自动化修复。

一、部署k8s Controller Manager

确保controller-manager-key.pem 和 controller-manager.pem存在,我这里在前面的文章中已经创建好相关私钥。执行如下操作:

cd /etc/kubernetes
export KUBE_APISERVER
="https://192.168.15.200:6443"

配置 cluster

kubectl config set-cluster kubernetes \
--certificate-authority=/etc/kubernetes/ssl/ca.pem \
--embed-certs=true \
--server=${KUBE_APISERVER} \
--kubeconfig=controller-manager.conf

配置 credentials

kubectl config set-credentials system:kube-controller-manager \
--client-certificate=/etc/kubernetes/ssl/controller-manager.pem \
--embed-certs=true \
--client-key=/etc/kubernetes/ssl/controller-manager-key.pem \
--kubeconfig=controller-manager.conf

配置 context

kubectl config set-context system:kube-controller-manager@kubernetes \
--cluster=kubernetes \
--user=system:kube-controller-manager \
--kubeconfig=controller-manager.conf

配置 default context

kubectl config use-context system:kube-controller-manager@kubernetes --kubeconfig=controller-manager.conf

controller-manager.conf 文件生成后将这个文件分发到各个 Master 节点的 /etc/kubernetes 目录下。

scp controller-manager.conf k8s-master02:/etc/kubernetes/
scp
controller-manager.conf k8s-master03:/etc/kubernetes/

创建 kube-controller-manager的systemd服务启动文件,如下:

export KUBE_APISERVER="https://192.168.15.200:6443"
cat > /usr/lib/systemd/system/kube-controller-manager.service << EOF
[Unit]
Description
=kube-controller-manager
After
=network.target
After
=kube-apiserver.service

[Service]
EnvironmentFile
=-/etc/kubernetes/controller-manager
ExecStart
=/usr/local/bin/kube-controller-manager \
--logtostderr=true \
--v=0 \
--master=https://192.168.15.200:6443 \
--kubeconfig=/etc/kubernetes/controller-manager.conf \
--cluster-name=kubernetes \
--cluster-signing-cert-file=/etc/kubernetes/ssl/ca.pem \
--cluster-signing-key-file=/etc/kubernetes/ssl/ca-key.pem \
--service-account-private-key-file=/etc/kubernetes/ssl/ca-key.pem \
--root-ca-file=/etc/kubernetes/ssl/ca.pem \
--insecure-experimental-approve-all-kubelet-csrs-for-group=system:bootstrappers \
--use-service-account-credentials=true \
--service-cluster-ip-range=10.96.0.0/12 \
--cluster-cidr=10.244.0.0/16 \
--allocate-node-cidrs=true \
--leader-elect=true \
--controllers=*,bootstrapsigner,tokencleaner
Restart
=on-failure
Type
=simple
LimitNOFILE
=65536
EOF

分发到其他主机:

scp /usr/lib/systemd/system/kube-controller-manager.service k8s-master02://usr/lib/systemd/system/
scp /usr/lib/systemd/system/kube-controller-manager.service k8s-master03://usr/lib/systemd/system/

在各节点启动服务:

systemctl daemon-reload
systemctl enable kube
-controller-manager
systemctl start kube
-controller-manager
systemctl status kube
-controller-manager

查看服务状态,是否正常启动;

提示:请确保 apiserver-csr.json 定义的证书授权 IP 内容里把 VIP 填写进去,如果未填写进去,请重新使用 cfssl 生成证书后放入各个 master 节点的 /etc/kubernetes/pki 上,并重启  kube-apiserver.service 服务。最后,关于k8s apiserver高可用还有一些问题需要这里做一些总结,我们这里通过 corosync + pacemaker 软件使得某种 apiserver 服务高可用,这是因为apiserver是无状态服务允许同时存在不同的节点。而scheduler,controller-manager在集群中只能在一台主机开启,这里我们可以在启动controller-manager和scheduler 只要加上 --leader-elect=true 参数就可以同时启动,系统会自动选举leader。具体来说,如果有多台master node,上面都安装了scheduler,controller-manager, apiserver:

  • 对于schduler服务,同一时间只在一台master 节点上运行;
  • 对于controller-manager,同一时间只在一台master 节点上运行;
  • 对于apiserver,同一时间只在一台master 节点上运行;

在整套环境中,我们又将引入一个新的问题。pacemaker + corosync 的高可用性谁来保证?因为高可用集群都存在脑裂或者管理员误操作的情况,一旦高可用集群出现脑裂,多台master会出现抢占VIP以及在多个节点上同时启动了scheduler或者controller-manager,就会造成系统故障。