部署的Master节点集群由k8s-master01, k8s-master02, k8s-master03三个节点组成,每个节点上部署kube-apiserver,kube-controller-manager,kube-scheduler三个核心组件。 kube-apiserver的3个实例同时提供服务,在其前端部署一个高可用的负载均衡器作为kube-apiserver的地址。 kube-controller-manager和kube-scheduler也是各自3个实例,在同一时刻只能有1个实例工作,这个实例通过选举产生。关于master高可用实现的方式,我这里是通过haproxy + corosync + pacemaker实现,具体部署过程后面将详细介绍。
一、安装 Corosync以及pacemaker 部署
1.1 环境准备
yum install -y pacemaker pcs psmisc policycoreutils-python corosync fence-agents-all systemctl start pcsd.service systemctl enable pcsd.service
配置免秘钥认证(过程略)
1.2 部署haproxy + corosync + pacemaker(在k8s-master01、k8s-master02、k8s-master03执行)
配置hacluster密码(三台主机都执行)
echo ‘passw0rd‘ | passwd --stdin hacluster
验证集群认证,如下:
cd /etc/corosync/
corosync-keygen
pcs cluster auth k8s-master01 k8s-master02 k8s-master03 -u hacluster -p passw0rd --force
1.3 创建kubernetes集群,节点包括k8s-master01、k8s-master02、k8s-master03、
pcs cluster setup --name my_k8s_cluster01 k8s-master01 k8s-master02 k8s-master03
1.4 启动集群
pcs cluster start --all
1.5 检查配置是否正确
crm_verify -L -V #一般情况会跳出个错误;pcs property set stonith-enabled=false #禁用stonith;pcs property set no-quorum-policy=ignore #无法仲裁时,选择忽略;
1.6 相关常用参数总结
pcs cluster enable --all #设置集群开机自动; corosync-cfgtool -s #检查各节点通信状态(显示为no faults即为OK); pcs status corosync #查看coyosync状态; pcs status #查看pacemaker集群状态;
1.7 集群管理工具pcs和crm(简单介绍)
pcs: 是红帽用来管理该集群的命令工具,听说极其难用,这里有一段历史说它为什么难用,不做嗷述;
crm: 是suse封装和开发维护的一个命令工具,功能强大并强烈推荐使用,但是红帽以及centos安装pacemaker以及corosync是不提供的,所以需要手动安装;
cd /etc/yum.repos.d/ wget http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-7/network:ha-clustering:Stable.repo yum makecache && yum -y install crmsh
1.8 配置VIP
第一种方式通过CRM进行配置:
$ crm crm(live)# config crm(live)configure# primitive vip ocf:heartbeat:IPaddr2 params ip=192.168.15.200 cidr_netmask=24 nic=eno16777736 op start interval=0s timeout=20s op stop interval=0s timeout=20s op monitor interval=30s meta priority=100
第二种方式通过pcs进行配置:
pcs resource create VIP ocf:heartbeat:IPaddr2 ip=192.168.15.200 cidr_netmask=24 nic=eno16777736 op monitor interval=15s
二、配置haproxy实现与corosync和pacemaker结合
2.1 安装并配置haproxy
yum install -y haproxy mv /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak01
2.2 修改配置文件,如下:
cat > /etc/haproxy/haproxy.cfg << EOF global log 127.0.0.1 local0 log 127.0.0.1 local1 notice maxconn 4096 chroot /usr/share/haproxy user haproxy group haproxy daemon defaults log global mode tcp timeout connect 5000ms timeout client 50000ms timeout server 50000ms frontend stats-front bind *:8088 mode http default_backend stats-back backend stats-back mode http balance source stats uri /stats stats auth admin:passw0rd listen Kubernetes-Cluster bind 192.168.15.200:6443 balance leastconn mode tcp server node01 192.168.15.131:6443 check inter 2000 fall 3 server node02 192.168.15.132:6443 check inter 2000 fall 3 server node03 192.168.15.133:6443 check inter 2000 fall 3 EOF
启动服务
systemctl start haproxy systemctl status haproxy
2.3 将Haproxy加入到PCS集群
需要Haproxy节点把开机启动项关闭,并在一台机器上使用 crm 进入 PCS 命令行模式:
systemctl disable haproxy crm config
输入配置管理参数,需要保证配置文件全部一致
# primitive haproxy systemd:haproxy op start interval=0 op start interval=0s timeout=20 op stop interval=0s timeout=20 op monitor interval=20s timeout=30s meta priority=100 target-role=Started # colocation haproxy-with-vip inf: VIP:Started haproxy:Started # verify # commit
提示:如果以上命令不好使,提示错误,可尝试如下命令。
pcs resource create haproxy systemd:haproxy op monitor interval="5s" pcs constraint colocation add vip haproxy INFINITY pcs constraint order vip then haproxy
查看状态:
或者
2.4 验证集群高可用
可以自行试验,把k8s-master01重启关机,看是否VIP切换到其他节点:
当前集群状态变为在线k8s-master02和k8s-master03,如下图所示:
可以看到VIP已经切换到k8s-master02主机,并且,相关服务端口也监听到VIP之上,如下:
关于haproxy + corosync + pacemaker 的安装到此结束,整个过程还是很曲折的。再部署的过程中如果大家有问题或者更好的建议可以提出来一起讨论。
首先值得高兴的事情是可以通过VIP来获取到API server相关的信息,接下来我们继续开始下一步。
三、部署kubernetes-apiserver高可用服务
3.1 拷贝相关证书
cp ca.pem ca-key.pem apiserver-key.pem apiserver.pem admin.pem admin-key.pem controller-manager.pem controller-manager-key.pem scheduler-key.pem scheduler.pem /etc/kubernetes/ssl/scp -r /etc/kubernetes/ssl 192.168.15.131:/etc/kubernetes/scp -r /etc/kubernetes/ssl 192.168.15.132:/etc/kubernetes/
3.2 部署api-server(在k8s-master01/k8s-master02/k8s-master03操作)
cat >> /usr/lib/systemd/system/kube-apiserver.service << EOF [Unit] Description=Kubernetes API Server Documentation=https://github.com/kubernetes/kubernetes [Service] EnvironmentFile=-/etc/kubernetes/apiserver ExecStart=/usr/local/bin/kube-apiserver --logtostderr=true --v=0 --advertise-address=192.168.15.133 --bind-address=192.168.15.133 --secure-port=6443 --insecure-port=0 --allow-privileged=true --etcd-servers=http://192.168.15.131:2379,http://192.168.15.132:2379,http://192.168.15.133:2379 --storage-backend=etcd3 --service-cluster-ip-range=10.96.0.0/12 --tls-cert-file=/etc/kubernetes/ssl/apiserver.pem --tls-private-key-file=/etc/kubernetes/ssl/apiserver-key.pem --client-ca-file=/etc/kubernetes/ssl/ca.pem --service-account-key-file=/etc/kubernetes/ssl/ca-key.pem --experimental-bootstrap-token-auth=true --apiserver-count=3 --enable-swagger-ui=true --admission-control=NamespaceLifecycle,LimitRanger,ServiceAccount,PersistentVolumeLabel,DefaultStorageClass,ResourceQuota,DefaultTolerationSeconds --authorization-mode=RBAC --audit-log-maxage=30 --audit-log-maxbackup=3 --audit-log-maxsize=100 --audit-log-path=/var/log/kubernetes/audit.log Restart=on-failure [Install] WantedBy=multi-user.target EOF
相关参数提示:
--insecure-port禁用了不安全的http端口。
--secure-port指定https安全端口,kube-scheduler、kube-controller-manager、kubelet、kube-proxy、kubectl等组件都将使用安全端口与ApiServer通信(实际上会由我们在前端部署的负载均衡器代理)。
--authorization-mode=RBAC表示在安全端口启用RBAC授权模式,在授权过程会拒绝会授权的请求。kube-scheduler、kube-controller-manager、kubelet、kube-proxy、kubectl等组件都使用各自证书或kubeconfig指定相关的User、Group来通过RBAC授权。
--admission-control为准入机制,这里配置了NamespaceLifecycle,LimitRanger,ServiceAccount,PersistentVolumeLabel,DefaultStorageClass,ResourceQuota,DefaultTolerationSeconds。
--service-cluster-ip-range指定Service Cluster IP的地址段,注意该地址段是Kubernetes Service使用的,是虚拟IP,从外部不能路由可达。
3.3 启动服务
mkdir /var/log/kubernetes/ systemctl daemon-reload systemctl restart kube-apiserver
3.4 验证(每台服务器单独验证)
kubectl --server=https://192.168.15.131:6443 --certificate-authority=/etc/kubernetes/ssl/ca.pem --client-certificate=/etc/kubernetes/ssl/admin.pem --client-key=/etc/kubernetes/ssl/admin-key.pem get componentstatuses
3台master主机验证无误之后,就可以使用VIP地址验证,如下:
kubectl --server=https://192.168.15.200:6443 --certificate-authority=/etc/kubernetes/ssl/ca.pem --client-certificate=/etc/kubernetes/ssl/admin.pem --client-key=/etc/kubernetes/ssl/admin-key.pem get componentstatuses
高可用是需要对其 api 提供的 6443 端口进行负载策略,所以我们这里KUBE_APISERVER地址填写VIP地址。使用kubectl时需要指定ApiServer的地址以及客户端的证书,用起来比较繁琐。接下来我们创建kubernetes-admin配置文件。如下所示:
cd /etc/kubernetes export KUBE_APISERVER="https://192.168.15.200:6443" # set-cluster kubectl config set-cluster kubernetes --certificate-authority=/etc/kubernetes/ssl/ca.pem --embed-certs=true --server=${KUBE_APISERVER} --kubeconfig=admin.conf # set-credentials kubectl config set-credentials kubernetes-admin --client-certificate=/etc/kubernetes/ssl/admin.pem --embed-certs=true --client-key=/etc/kubernetes/ssl/admin-key.pem --kubeconfig=admin.conf # set-context kubectl config set-context kubernetes-[email protected] --cluster=kubernetes --user=kubernetes-admin --kubeconfig=admin.conf # set default context kubectl config use-context [email protected] --kubeconfig=admin.conf
为了使用kubectl访问apiserver使用admin.conf,将其拷贝到$HOME/.kube中并重命名成config,如下:
cp /etc/kubernetes/admin.conf ~/.kube/config kubectl get cs
提示:以上命令需要在3台master主机都要执行;
关于k8s master高可用到这里就完成部署,接下来继续部署其他组件。