本文主要是介绍Kubernetes高可用集群搭建(kubeadm),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1 Kubernetes高可用集群介绍
前面已经介绍了Kubernetes的集群部署,但是都只是介绍的单master节点的情况,由于单master节点的可靠性不高,不适合实际的生产环境,此处介绍如何实现多master节点的高可用集群的搭建。
2 安装要求
- 一台或多台机器,操作系统CentOS7.x-x86_64
- 硬件配置:2G或更多ARM,2个CPU或更多CPU,硬盘20G及以上
- 集群中所有机器网络互通
- 可以访问外网,需要拉取镜像
- 禁止swap分区
3 环境准备
3.1 安装虚拟机
准备4台虚拟机,并给每个虚拟机安装centos7.x操作系统。如果有条件还是准备6台虚拟机最好,3台master节点,3台node节点,保证master节点数为>=3的奇数个。
CentOS-7.6.1810-x86_64下载:
https://pan.baidu.com/s/1-DgYThgkNbZ42QC5zKp84w 密码: mj9h
角色 | IP | 主机名称 |
---|---|---|
master | 192.168.75.136 | k8s-master1 |
master | 192.168.75.137 | k8s-master2 |
node | 192.168.75.138 | k8s-node1 |
node | 192.168.75.139 | k8s-node2 |
VIP | 192.168.75.140 | k8s-vip |
3.2 系统初始化
# 1、关闭防火墙
systemctl stop firewalld
systemctl disable firewalld# 2、关闭selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config #永久关闭
setenforce 0 #临时关闭# 3、关闭swap
swapoff -a #临时关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab #永久关闭# 4、根据规划设置主机名
hostnamectl set-hostname <主机名> #修改主机名
hostname #查看主机名# 5、在master节点中添加hosts (IP后面跟的是hostname)
cat >> /etc/hosts << EOF
192.168.75.136 master1.k8s.io k8s-master1
192.168.75.137 master2.k8s.io k8s-master2
192.168.75.138 node1.k8s.io k8s-node1
192.168.75.139 node2.k8s.io k8s-node2
192.168.75.140 master.k8s.io k8s-vip
EOF# 6、将桥接的IPv4流量传递到iptables的链
cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge‐nf‐call‐ip6tables=1
net.bridge.bridge‐nf‐call‐iptables=1
EOF
sysctl --system #生效# 7、时间同步
yum install ntpdate -y
ntpdate time.windows.com
4 在每个master节点安装keepalived
4.1 安装相关依赖包
yum install -y conntrack-tools libseccomp libtool-ltdl
yum install -y keepalived
4.2 配置maser节点
4.2.1 k8s-master1节点配置
# 创建目录
mkdir -p /etc/keepalived
# 创建配置文件
cat > /etc/keepalived/keepalived.conf <<EOF
! Configuration File for keepalived
global_defs {router_id k8s
}
vrrp_script check_haproxy {script "killall -0 haproxy"interval 3weight -2fall 10rise 2
}
vrrp_instance VI_1 {state MASTER# 网卡的名称interface ens33virtual_router_id 51priority 250advert_int 1authentication {auth_type PASSauth_pass ceb1b3ec013d66163d6ab}
virtual_ipaddress {# 虚拟IP192.168.75.140
}
track_script {check_haproxy
}
}
EOF
4.2.2 k8s-master2节点配置
后续添加的其他master节点也使用此配置。
# 创建目录
mkdir -p /etc/keepalived
cat > /etc/keepalived/keepalived.conf <<EOF
! Configuration File for keepalived
global_defs {router_id k8s
}
vrrp_script check_haproxy {script "killall -0 haproxy"interval 3weight -2fall 10rise 2
}
vrrp_instance VI_1 {state BACKUPinterface ens33virtual_router_id 51priority 200adver_int 1authentication {auth_type PASSauth_pass ceb1b3ec013d66163d6ab}
virtual_ipaddress {# 虚拟IP192.168.75.140
}
track_script {check_haproxy
}
}
EOF
4.3 启动和检查
在每个master节点都执行
# 启动keepalived
systemctl start keepalived.service
# 设置开机启动
systemctl enable keepalived.service
# 查看启动状态
systemctl status keepalived.service
# 启动完成后在master1查看网络信息
ip a s ens33
5 在每个master节点安装haproxy
5.1 安装
yum install -y haproxy
5.2 配置
每台master节点中的配置均相同,配置中声明了后端代理的每个master节点服务器,指定了haproxy的端口为16443,因此16443端口为集群的入口。
# 创建目录
mkdir -p /etc/haproxy
cat > /etc/haproxy/haproxy.cfg << EOF
#-------------------------------
# Global settings
#-------------------------------
globallog 127.0.0.1 local2chroot /var/lib/haproxypidfile /var/run/haproxy.pidmaxconn 4000user haproxygroup haproxydaemonstats socket /var/lib/haproxy/stats
#--------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# usr if not designated in their block
#--------------------------------
defaultsmode httplog globaloption httplogoption dontlognulloption http-server-closeoption forwardfor except 127.0.0.0/8option redispatchretries 3timeout http-request 10stimeout queue 1m timeout connect 10stimeout client 1mtimeout server 1mtimeout http-keep-alive 10stimeout check 10smaxconn 3000
#--------------------------------
# kubernetes apiserver frontend which proxys to the backends
#--------------------------------
frontend kubernetes-apiservermode tcpbind *:16443option tcplogdefault_backend kubernetes-apiserver
#---------------------------------
#round robin balancing between the various backends
#---------------------------------
backend kubernetes-apiservermode tcpbalance roundrobinserver master1.k8s.io 192.168.75.136:6443 checkserver master2.k8s.io 192.168.75.137:6443 check
#---------------------------------
# collection haproxy statistics message
#---------------------------------
listen statsbind *:1080stats auth admin:awesomePasswordstats refresh 5sstats realm HAProxy\ Statisticsstats uri /admin?stats
EOF
5.3 启动和检查
每台master都要启动
# 启动haproxy
systemctl start haproxy
# 设置开机启动
systemctl enable haproxy
# 查看启动状态
systemctl status haproxy
# 检查端口
netstat -lntup|grep haproxy
6 所有节点安装Docker/kubeadm/kubelet
6.1 安装Docker
Docker安装移步: Docker for CentOS安装
6.2 添加阿里云yum软件源
cat >/etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
6.3 安装kubeadm、kubelet、kubectl
kubeadm:部署工具
kubelet:systemd守护进程管理
kubectl:k8s命令行管理工具
# 最新版本安装
yum install -y kubelet kubeadm kubectl
# 安装指定版本
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
#设置开机启动
systemctl enable kubelet
7 部署Kubernetes Master
7.1 创建kubeadm配置文件
在具有vip的master上操作。此处的vip节点为k8s-master1。
# 创建文件夹
mkdir -p /usr/local/kubernetes/manifests
# 进入文件夹
cd /usr/local/kubernetes/manifests
# 创建kubeadm-config.yaml文件
cat > kubeadm-config.yaml << EOF
apiServer:certSANs:- k8s-master1- k8s-master2- master.k8s.io- 192.168.75.136- 192.168.75.137- 192.168.75.140- 127.0.0.1extraArgs:authorization-mode: Node,RBACtimeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta1
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controlPlaneEndpoint: "master.k8s.io:6443"
controllerManager: {}
dns:type: CoreDNS
etcd:local:dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: v1.18.0
networking:dnsDomain: cluster.localpodSubnet: 10.244.0.0/16serviceSubnet: 10.1.0.0/16
scheduler: {}
EOF
7.2 使用kubeadm命令初始化k8s
# 执行初始化命令
kubeadm init --config kubeadm-config.yaml
# 重置kubeadm初始化
kubeadm reset
如果在执行的过程中出现以下错误:[ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...` To see the stack trace of this error execute with --v=5 or higher
解决办法:
# 执行,然后重新执行初始化命令
echo "1" >/proc/sys/net/bridge/bridge-nf-call-iptables
看到以下消息则表示安装成功,执行保存成功后的命令,因为在后续的加入master和加入node会使用到。
7.3 根据初始化的结果操作
注意:此命令直接在安装成功后的消息中复制,此处只是提供一个案例
# 此命令直接在k8s-master1执行
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
查看集群状态
kubectl get cs
# 查看pod信息
kubectl get pods -n kube-system
# 查看节点信息
kubectl get nodes
7.4 安装集群网络
在k8s-master1节点执行:
方式一:
# 如果此地址无法访问,可以更改网络的DNS为8.8.8.8试试,如果还是不行就只能使用方式二
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
方式二:
kube-flannel.yml下载:
链接: https://pan.baidu.com/s/1ANoUdrexA6N_VVc5HOc3QA 密码: h11w
# 安装flannel
kubectl apply -f kube-flannel.yml
看到以下消息则表示安装成功:
再次查看节点信息:
kubectl get nodes
7.5 添加k8s-master2节点
1、在k8s-master2
节点创建文件夹
mkdir -p /etc/kubernetes/pki/etcd
2、从k8s-master1
复制秘钥和相关文件到k8s-master2
# 远程复制,在k8s-master1节点执行
scp /etc/kubernetes/admin.conf root@192.168.75.137:/etc/kubernetes
scp /etc/kubernetes/pki/{ca.*,sa.*,front-proxy-ca.*} root@192.168.75.137:/etc/kubernetes/pki
scp /etc/kubernetes/pki/etcd/ca.* root@192.168.75.137:/etc/kubernetes/pki/etcd
3、将k8s-master2
节点加入集群
注意:此命令直接在初始化结束后的消息中复制即可,此处为范例:
kubeadm join master.k8s.io:6443 --token 1q5204.4g95k2jkhulmy1pg \--discovery-token-ca-cert-hash sha256:3b59671996f0a5092d90bfc5626cc1decce339898d69bc9bfd64cc6a2421c2a5 \--control-plane
如果在执行的过程中出现以下错误:[ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...` To see the stack trace of this error execute with --v=5 or higher
解决办法:
# 执行
echo "1" >/proc/sys/net/bridge/bridge-nf-call-iptables
默认token有效期为24小时,当过期之后,该token就不可用了,这时就需要重新创建token,操作如下:
该命令只能在k8s-master1
节点执行!!!
kubeadm token create --print-join-command
看到以下消息,则表示安装成功:
4、在k8s-master1
节点查看集群信息
# 节点信息
kubectl get nodes
# pod信息
kubectl get pods --all-namespaces
注意:需要等待一段时间,等flannel加载完成,k8s-master2
的节点状态才会变成Ready。
5、根据结果消息操作
注意:此命令直接在安装成功后的消息中复制,此处只是提供一个案例
# 此命令直接在k8s-master2执行
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
至此,k8s-master2
节点部署及加入集群完成。
8 加入Kubernetes Node
1、直接在node节点服务器上执行k8s-master1
初始化成功后的消息即可:
# 此处命令为范例,请根据实际消息的返回命令执行
kubeadm join master.k8s.io:6443 --token 1q5204.4g95k2jkhulmy1pg \--discovery-token-ca-cert-hash sha256:3b59671996f0a5092d90bfc5626cc1decce339898d69bc9bfd64cc6a2421c2a5
看到以下消息则表示安装成功!
2、由于添加了新的node节点,所以需要重新安装CNI网络
在k8s-master1
节点执行,由于之前安装了网络,需要需要先删除再安装。
方式一:
# 删除网络
kubectl delete -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 如果此地址无法访问,可以更改网络的DNS为8.8.8.8试试,如果还是不行就只能使用方式二
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
方式二:
kube-flannel.yml下载:
链接: https://pan.baidu.com/s/1ANoUdrexA6N_VVc5HOc3QA 密码: h11w
# 删除网络
kubectl delete -f kube-flannel.yml
# 安装flannel
kubectl apply -f kube-flannel.yml
9 测试Kubernetes集群
在Kubernetes集群中创建一个pod,验证是否正常运行。
# 创建镜像容器
kubectl create deployment nginx --image=nginx
# 对外暴露端口
kubectl expose deployment nginx --port=80 --type=NodePort
# 查看当前对外的端口
kubectl get pod,svc
通过浏览器访问nginx:http://k8s-vip:32375
顺便关闭一个master节点,刷新页面,发现还是能访问nginx,说明高可用集群部署成功。
10 注意事项
1、只要有一个master节点正常运行就可以正常对外提供服务。
2、如果需要在master节点使用kubectl
相关的命令,必须保证至少有2
个master节点正常运行才可以使用,不然会有 Unable to connect to the server: net/http: TLS handshake timeout
这样的错误。
3、节点故障,pod自动转移:当pod所在的节点宕机后,根据 controller-manager的–pod-eviction-timeout 配置,默认是5分钟,5分钟后k8s会把pod状态设置为unkown, 然后在其它节点启动pod。当故障节点恢复后,k8s会删除故障节点上面的unkonw pod。如果你想立即强制迁移,可以用 kubectl drain nodename
4、为了保证集群的高可用性,建议master节点和node节点至少分别部署3台及以上,且master节点应该部署基数个实例(3、5、7、9)。
这篇关于Kubernetes高可用集群搭建(kubeadm)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!