前文我搭建了一主两从的Kubernetes集群,但是还是存在一个问题,没有达到高可用的目的,如果Master节点出现问题,整个集群将会瘫痪,所以高可用的关键举措在于多Master节点,并且部署过程要比单Master节点集群要复杂很多。
思考再三,鉴于我实际部署过程中出现的问题众多(天知道我经历了什么),我还是决定在本文只描述部署过程,即怎么做,力求照着本文能成功部署出一套高可用的Kubernetes集群;至于为什么?
的问题我留在下一篇文章作为闲聊。
本次高可用方案架构图如下:
需要用到haproxy和keepalived组件提供Master节点高可用。
准备工作
机器角色 | IP |
---|---|
master | 10.128.2.53 |
master | 10.128.2.52 |
master | 10.11.0.220 |
node | 10.128.1.187 |
node | 10.11.7.94 |
node | 10.11.0.181 |
node | 10.11.7.125 |
所有机器需要按照上文Kubeadm快速部署Kubernetes集群中准备工作环节进行设置,此外需要特殊注意的几点如下:
hostname设置
需要设置hosts
文件和hostname
## vi /etc/hosts
10.128.2.53 kubernetes-master01
10.128.2.52 kubernetes-master02
10.11.0.220 kubernetes-master03
10.128.1.187 kubernetes-node01
10.11.7.94 kubernetes-node02
10.11.0.181 kubernetes-node03
10.11.7.125 kubernetes-node04
10.128.2.111 kubernetes-vip
hostnamectl set-hostname kubernetes-master01
...
...
10.128.2.111 kubernetes-vip
是通过keepalived实现的vip地址。
节点互信
需要设置Master三节点间互信以及Master免登录Node节点,参考前文。
安装ipvs
ipvs是kube-proxy实现负载均衡的一种技术实现,默认的实现方式是iptables,后文再详述。
- 安装软件
yum install ipvsadm ipset sysstat conntrack libseccomp -y
- 加载模块
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
modprobe -- ip_tables
modprobe -- ip_set
modprobe -- xt_set
modprobe -- ipt_set
modprobe -- ipt_rpfilter
modprobe -- ipt_REJECT
modprobe -- ipip
EOF
配置重启自动加载
所有节点执行
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack
kubeadm、kubelet、kubectl安装
配置源
cat > /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
#重建yum缓存,输入y添加证书认证
yum makecache fast
本次安装最新的1.20.4版本
先配置kubeletcggroupDriver
为systemd
,这是官方建议的,这里有个有意思的地方后文再说
cat > /var/lib/kubelet/config.yaml <<EOF
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd
EOF
所有节点安装
yum install -y kubelet-1.20.4 kubeadm-1.20.4 kubectl-1.20.4
systemctl enable kubelet && systemctl start kubelet && systemctl status kubelet
集群搭建
首先是安装高可用组件haproxy和keepalived,这里我使用docker方式,3个Master节点都需安装。
haproxy安装
- 创建配置文件
haproxy.cfg
vim /etc/haproxy/haproxy.cfg
节点信息部分按自己的实际情况修改:
#---------------------------------------------------------------------
# Example configuration for a possible web application. See the
# full configuration options online.
#
# https://www.haproxy.org/download/2.1/doc/configuration.txt
# https://cbonte.github.io/haproxy-dconv/2.1/configuration.html
#
#---------------------------------------------------------------------
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
# to have these messages end up in /var/log/haproxy.log you will
# need to:
#
# 1) configure syslog to accept network log events. This is done
# by adding the '-r' option to the SYSLOGD_OPTIONS in
# /etc/sysconfig/syslog
#
# 2) configure local2 events to go to the /var/log/haproxy.log
# file. A line like the following can be added to
# /etc/sysconfig/syslog
#
# local2.* /var/log/haproxy.log
#
log 127.0.0.1 local2
# chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
# user haproxy
# group haproxy
# daemon
# turn on stats unix socket
stats socket /var/lib/haproxy/stats
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend kubernetes-apiserver
mode tcp
bind *:9443 ## 监听9443端口
# bind *:443 ssl # To be completed ....
acl url_static path_beg -i /static /images /javascript /stylesheets
acl url_static path_end -i .jpg .gif .png .css .js
default_backend kubernetes-apiserver
#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend kubernetes-apiserver
mode tcp # 模式tcp
balance roundrobin # 采用轮询的负载算法
# k8s-apiservers backend # 配置apiserver,端口6443
server kubernetes-master01 10.128.2.53:6443 check
server kubernetes-master02 10.128.2.52:6443 check
server kubernetes-master03 10.11.0.220:6443 check
配置文件复制到其他Master节点
scp /etc/haproxy/haproxy.cfg root@kubernetes-master02:/etc/haproxy
scp /etc/haproxy/haproxy.cfg root@kubernetes-master03:/etc/haproxy
最后docker启动,
docker run -d --name=haproxy --net=host -v /etc/haproxy:/usr/local/etc/haproxy:ro -v /var/lib/haproxy:/var/lib/haproxy haproxy:2.3.6
安装keepalived
安装keepalived耗费了我不少时间,其中碰到问题挺多的,当然也和以前没使用过keepalived有关。keepalived同样需要3个Master节点都安装,并且稍有不同。
同样的,首先创建配置文件:
vim /etc/keepalived/keepalived.conf
查看网卡信息:
ip addr
内容如下:
global_defs {
script_user root
enable_script_security
}
vrrp_script chk_haproxy {
script "/bin/bash -c 'if [[ $(netstat -nlp | grep 9443) ]]; then exit 0; else exit 1; fi'" # haproxy 检测脚本,这里需要根据自己实际情况判断
interval 2 # 每2秒执行一次检测
weight 11 # 权重变化
}
vrrp_instance VI_1 {
interface ens192 # 此处通过ip addr命令根据实际填写
state MASTER # backup节点设为BACKUP
virtual_router_id 51 # id设为相同,表示是同一个虚拟路由组
priority 100 #初始权重
#这里需要注意,我的3个Master节点不在同一个网段,不配置会出现多个Master节点的脑裂现象,值根据当前节点情况,配置其余2个节点
unicast_peer {
10.128.2.53
10.128.2.52
}
virtual_ipaddress {
10.128.2.111 # vip 虚拟ip
}
authentication {
auth_type PASS
auth_pass password
}
track_script {
chk_haproxy
}
notify "/container/service/keepalived/assets/notify.sh"
}
最后docker运行就好了:
docker run --cap-add=NET_ADMIN --cap-add=NET_BROADCAST --cap-add=NET_RAW --net=host --volume /etc/keepalived/keepalived.conf:/container/service/keepalived/assets/keepalived.conf -d osixia/keepalived:2.0.20 --copy-service
Kubernetes集群初始化
以下操作都在kubernetes-master01节点上执行
本次依然使用kubeadm来完成集群的组建工作,新建kubeadm的集群配置文件kubeadm.yaml,前文中kube-proxy采用了ipvs,也需要进行配置声明:
cat >> kubeadm.yaml <<EOF
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v1.20.2
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
controlPlaneEndpoint: "kubernetes-vip:9443"
networking:
dnsDomain: cluster.local
podSubnet: 192.168.0.0/16
serviceSubnet: 10.211.0.0/12
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
EOF
执行初始化命令:
kubeadm init --config kubeadm.yaml --upload-certs
成功后执行:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
并记住节点加入集群的命令:
kubeadm join kubernetes-vip:9443 --token 6dntoh.syhp7vi2j7ikv5uv \
--discovery-token-ca-cert-hash sha256:250115fad0a4b6852a919dbba4222ac65bc64843c660363ab119606ff8819d0a \
--control-plane --certificate-key 7bd1bc54ee1fdbffcbfb17f93b32496cb93c0688523f7d5fe414cefd48fb05fe
kubeadm join kubernetes-vip:9443 --token 6dntoh.syhp7vi2j7ikv5uv \
--discovery-token-ca-cert-hash sha256:250115fad0a4b6852a919dbba4222ac65bc64843c660363ab119606ff8819d0a
安装calico组件并执行:
wget https://docs.projectcalico.org/v3.8/manifests/calico.yaml
kubectl apply -f calico.yaml
接下来根据前面的节点加入命令,把剩余的master节点和node节点加入集群,确认状态正常:
至此高可用集群也就搭建好了。
集群测试
集群搭建完毕,我们需要做一下破坏性测试来验证高可用性,前文keepalived配置文件中我们配置的检测脚本是查看9443端口的情况,所以测试的方案也很简单,只需要停止haproxy运行并查看keepalived的日志即可,结果如下:
可以很清楚的看到切换的过程。
本文至此结束了,是一篇纯过程性的总结,下一篇会就Kubernetes高可用集群部署过程中的问题和背后的原理做一些总结。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。