多节点Master集群高可用
- 一、Kubernetes多Master集群高可用方案
- 1、实现高可用方法
- 2、多节点Master高可用的部署
- 二、多节点Master部署
- 1、配置master02
- 2、修改配置文件kube-apiserver中的IP
- 3、在 master02 节点上启动各服务并设置开机自启
- 三、负载均衡部署
- 1、配置nginx的官方在线yum源,配置本地nginx的yum源
- 2、修改配置文件
- 四、部署keepalived服务
- 1、安装keepalive服务
- 2、修改keepalived配置文件
- 3、创建nginx状态检查脚本
- 4、node节点上的bootstrap.kubeconfig、kubelet.kubeconfig、kube-proxy.kubeconfig配置文件为VIP
- 5、重启服务
- 6、在 ba01 上查看 nginx 和 node 、 master 节点的连接状态
- 五、在Master01节点操作
- 1、测试创建pod
- 2、查看Pod的状态信息
- 六、部署Dashboard
- 1、Dashboard介绍
- 2、上传 recommended.yaml 文件到 /opt/k8s 目录中
- 3、创建service account并绑定默认cluster-admin管理员集群角色
- 4、使用输出的token登录Dashboard
- 总结
一、Kubernetes多Master集群高可用方案
作用:实现高可用
apiserver对外安全通信端口6443,对内端口8080
1、实现高可用方法
- etcd:etcd群集至少是3副本,奇数台,通过raft算法,保证数据的一致性
- node节点:承载业务,跟Master进行对接
- master节点:高可用使用keepalived+LB方案,keepalived能够提供VIP和主备,LB实现负载均衡,使用nginx+haproxy,将master加入nginx地址池,由nginx转发到对应的apiserver,再通过schduleer调度到相应的node节点,使用轮询算法。
2、多节点Master高可用的部署
- 从maste01复制etcd,k8s的证书,可执行文件,配置文件,master组件的服务管理文件 到 master02节点
- 再Masters节点修改apiserver的配置,修改为自己的配置
- 启动master相关组件
- 部署keepalived + LB (nginx , haproxy)实现高可用 和 负载均衡
- keepalived需要健康检查脚本来实现自动的故障切换
- 在所有Node节点上修改 node相关组件的 Kubeconfig 文件配置 ,把对接的 server ip 指定为VIP
二、多节点Master部署
在单节点Master搭建基础之上部署,在此新添加了一台master02,两台负载均衡节点
实验环境
服务器 | 主机名 | IP地址 | 主要组件 |
---|---|---|---|
k8s集群master01 + etcd01 | master01 | 192.168.10.130 | kube-apiserver kube-controller-manager kube-schedular etcd |
k8s集群master02 | master02 | 192.168.10.134 | kube-apiserver kube-controller-manager kube-schedular |
k8s集群node01 + etcd02 | node01 | 192.168.10.132 | kubelet kube-proxy docker flannel |
k8s集群node02 + etcd03 | node02 | 192.168.10.133 | kubelet kube-proxy docker flannel |
Balanc01 | nginx01 | 192.168.10.135 | keepalived 负载均衡(主) |
Balanc02 | nginx02 | 192.168.10.136 | keepalived 负载均衡(备) |
1、配置master02
从 master01 节点上拷贝证书文件、各master组件的配置文件和服务管理文件到 master02 节点
[root@master01 ~]#scp -r /opt/etcd/ root@192.168.10.134:/opt/
[root@master01 ~]#scp -r /opt/kubernetes/ root@192.168.10.134:/opt/
[root@master01 ~]#scp -r /root/.kube root@192.168.10.134:/root/
[root@master01 ~]#scp -r /usr/lib/systemd/system/{kube-apiserver,kube-controller-manager,kube-scheduler}.service root@192.168.10.134:/usr/lib/systemd/system/
2、修改配置文件kube-apiserver中的IP
[root@master01 ~]#vim /opt/kubernetes/cfg/kube-apiserver
KUBE_APISERVER_OPTS="--logtostderr=false \
--v=2 \
--log-dir=/opt/kubernetes/logs \
--etcd-servers=https://192.168.10.130:2379,https://192.168.10.132:2379,https://192.168.10.133:2379 \
--bind-address=192.168.10.134 \ #修改
--secure-port=6443 \
--advertise-address=192.168.10.134 \ #修改
#保存退出
3、在 master02 节点上启动各服务并设置开机自启
[root@master02 ~]#systemctl start kube-apiserver.service
[root@master02 ~]#systemctl enable kube-apiserver.service
Created symlink from /etc/systemd/system/multi-user.target.wants/kube-apiserver.service to /usr/lib/systemd/system/kube-apiserver.service.
[root@master02 ~]#systemctl start kube-controller-manager.service
[root@master02 ~]#systemctl enable kube-controller-manager.service
Created symlink from /etc/systemd/system/multi-user.target.wants/kube-controller-manager.service to /usr/lib/systemd/system/kube-controller-manager.service.
[root@master02 ~]#systemctl start kube-scheduler.service
[root@master02 ~]#systemctl enable kube-scheduler.service
Created symlink from /etc/systemd/system/multi-user.target.wants/kube-scheduler.service to /usr/lib/systemd/system/kube-scheduler.service.
[root@master02 ~]#ln -s /opt/kubernetes/bin/* /usr/local/bin/
[root@master02 ~]#kubectl get nodes
NAME STATUS ROLES AGE VERSION
192.168.10.132 Ready <none> 4h51m v1.20.11
[root@master02 ~]#kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
192.168.10.132 Ready <none> 4h52m v1.20.11 192.168.10.132 <none> CentOS Linux 7 (Core) 3.10.0-862.el7.x86_64 docker://23.0.5
三、负载均衡部署
1、配置nginx的官方在线yum源,配置本地nginx的yum源
在ba01、ba02节点上操作
[root@ba01 ~]#cat > /etc/yum.repos.d/nginx.repo << 'EOF'
> [nginx]
> name=nginx repo
> baseurl=http://nginx.org/packages/centos/7/$basearch/
> gpgcheck=0
> EOF
[root@ba01 ~]#yum install nginx -y
2、修改配置文件
配置四层反向代理负载均衡,指定k8s群集2台master的节点ip和6443端口
[root@ba01 ~]#vim /etc/nginx/nginx.conf
#添加
stream {
log_format main '$remote_addr $upstream_addr - [$time_local] $status $upstream_bytes_sent';
access_log /var/log/nginx/k8s-access.log main;
upstream k8s-apiserver {
server 192.168.10.130:6443;
server 192.168.10.134:6443;
}
server {
listen 6443;
proxy_pass k8s-apiserver;
}
}
[root@ba01 ~]#nginx -t
[root@ba01 ~]#systemctl start nginx
[root@ba01 ~]#systemctl enable nginx
[root@ba01 ~]#ss -natp | grep nginx
另外一台机子也需要上述同样的操作就不一一截图了
四、部署keepalived服务
1、安装keepalive服务
[root@ba01 ~]#yum install keepalived.x86_64 -y
2、修改keepalived配置文件
! Configuration File for keepalived
#接受邮件地址
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
#邮件发送地址
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id NGINX_MASTER #ba01节点的为 NGINX_MASTER,ba02节点的为 NGINX_BACKUP
}
#添加一个周期性执行脚本
vrrp_script check_nginx {
script "/etc/nginx/check_nginx.sh" #指定检查nginx存活的脚本路径
}
vrrp_instance VI_1 {
state MASTER #ba01节点为MASTER,ba02节点为BACKUP
interface ens33 #指定网卡名称ens33
virtual_router_id 51 #指定vrid,两个节点要一致
priority 100 #ba01节点的为100,ba02节点的为90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.10.100/24 #指定VIP地址
}
track_script {
check_nginx #指定vrrp——script配置脚本
}
}
#保存退出
3、创建nginx状态检查脚本
[root@ba01 ~]#vim /etc/nginx/check_nginx.sh
#!/bin/bash
#egrep -cv "grep|$$" 用于过滤掉包含grep 或者 $$ 表示的当前Shell进程ID,即脚本运行的当前进程ID号
count=$(ps -ef | grep nginx | egrep -cv "grep|$$")
if [ "$count" -eq 0 ];then
systemctl stop keepalived
fi
[root@ba01 ~]#chmod +x /etc/nginx/check_nginx.sh
[root@ba01 ~]#systemctl start keepalived.service
[root@ba01 ~]#systemctl enable keepalived.service
#但ba2是没有的,只有ba1挂掉之后才会到ba2上
4、node节点上的bootstrap.kubeconfig、kubelet.kubeconfig、kube-proxy.kubeconfig配置文件为VIP
[root@node01 ~]# cd /opt/kubernetes/cfg/
[root@node01 cfg]# vim bootstrap.kubeconfig
[root@node01 cfg]# vim kubelet.kubeconfig
[root@node01 cfg]# vim kube-proxy.kubeconfig
[root@node01 cfg]# systemctl restart kubelet.service
[root@node01 cfg]# systemctl restart kube-proxy.service
[root@node02 cfg]# vim bootstrap.kubeconfig
[root@node02 cfg]# vim kubelet.kubeconfig
[root@node02 cfg]# vim kube-proxy.kubeconfig
[root@node02 cfg]# systemctl restart kubelet.service
[root@node02 cfg]# systemctl restart kube-proxy.service
5、重启服务
[root@node01 cfg]# systemctl restart kubelet.service
[root@node01 cfg]# systemctl restart kube-proxy.service
[root@node02 cfg]#systemctl restart kubelet.service
[root@node02 cfg]#systemctl restart kube-proxy.service
6、在 ba01 上查看 nginx 和 node 、 master 节点的连接状态
[root@ba01 ~]#netstat -natp |grep nginx
tcp 0 0 0.0.0.0:6443 0.0.0.0:* LISTEN 4395/nginx: master
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 4395/nginx: master
五、在Master01节点操作
1、测试创建pod
[root@master01 opt]#kubectl run nginx --image=nginx
2、查看Pod的状态信息
[root@master01 ~]#kubectl get pods
NAME READY STATUS RESTARTS AGE
dns-test 1/1 Running 0 18h
nginx 1/1 Running 0 14h
六、部署Dashboard
1、Dashboard介绍
仪表板是基于Web的Kubernetes用户界面。您可以使用仪表板将容器化应用程序部署Kubernetes集群,对容器化应用程序进行故障排除,并管理集群本身及其伴随资源。您可以使用仪表板来概述群集上运行的应用程序,以及创建或修改单个Kubernetes资源(例如deployment,job daemonset等)。例如,您可以使用部署向导扩展部署,启动滚动更新,重新启动Pod或部署新应用程序。仪表板还提供有关群集中Kubernetes资源状态以及可能发生的任何错误的信息。
2、上传 recommended.yaml 文件到 /opt/k8s 目录中
在 master01 节点上操作
[root@master01 ~]#cd /opt/k8s/
#上传recommended.yaml文件
[root@master01 k8s]#vim recommended.yaml
[root@master01 k8s]#kubectl apply -f recommended.yaml
3、创建service account并绑定默认cluster-admin管理员集群角色
[root@master01 k8s]#kubectl create serviceaccount dashboard-admin -n kube-system
[root@master01 k8s]#kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
[root@master01 k8s]#kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
4、使用输出的token登录Dashboard
https://NodeIP:30001
总结
master组件
1.先安装apiserver
准备组件的相关证书和私钥文件
准备bootstrap token 认证文件(给ukubelet启动时签发证书使用)
准备组件的启动配置文件
启动apiserver服务端口6443 https
2、再启动controller-manager和scheduler
准备启动配置文件
准备证书和私钥文件呢生成kubeconfig文件(用于指定对接哪个apiserver,使用什么证书认证)启动服务
3、检查组件状态
需要准备kubeconfig文件kubectl加入到集群中(指定对接哪个apiserver,使用什么证书认证)