首页 > 代码库 > kubernetes Master部署之ControllerManager部署(4)

kubernetes Master部署之ControllerManager部署(4)

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,就会造成系统故障。

kubernetes Master部署之ControllerManager部署(4)