一、Master 高可用架构Kubernetes 作为容器集群系统,通过健康检查 + 重启策略实现了 Pod 故障自我修复能力,通过调度算法实现将 Pod 分布式部署,并保持预期副本数,根据 Node 失效状态自动在其他 Node 拉起 Pod,实现了应用层的高可用性。 针对 Kubernetes 集群,高可用性还应包含以下两个层面的考虑:Etcd 数据库的高可用性和 Kubernetes Master 组件的高可用性。 而 Etcd 我们已经采用 3 个节点组建集群实现高可用,本节将对 Master 节点高可用进行说明和实施。 Master 节点扮演着总控中心的角色,通过不断与工作节点上的 Kubelet 和 kube-proxy 进行通信来维护整个集群的健康工作状态。如果 Master 节点故障,将无法使用 kubectl 工具或者 API 做任何集群管理。 Master 节点主要有三个服务 kube-apiserver、kube-controller-manager 和 kube-scheduler,其中 kube-controller-manager 和 kube-scheduler 组件自身通过选择机制已经实现了高可用,所以 Master 高可用主要针对 kube-apiserver 组件,而该组件是以 HTTP API 提供服务,因此对他高可用与 Web 服务器类似,增加负载均衡器对其负载均衡即可,并且可水平扩容。 多 Master 架构图:
二、部署 Master2 Node
现在需要再增加一台新服务器,作为 Master2 Node,IP 是 192.168.2.117。 Master2 与已部署的 Master1 所有操作一致。所以我们只需将 Master1 所有 K8s 文件拷贝过来,再修改下服务器 IP 和主机名启动即可。 2.1 安装 docker ## docker 安装执行脚本拉取 curl -fsSL https://get.docker.com -o get-docker.sh ## 执行拉取的脚本 sh get-docker.sh # 在Master2启动Docker systemctl daemon-reload systemctl start docker systemctl enable docker 2.2 创建 etcd 证书目录在 Master2 创建 etcd 证书目录: mkdir -p /opt/etcd/ssl 2.3 拷贝文件(Master1 操作)拷贝 Master1(119)上所有 K8s 文件和 etcd 证书到 Master2(117): scp -r /opt/kubernetes root@192.168.2.117:/opt scp -r /opt/etcd/ssl root@192.168.2.117:/opt/etcd scp /usr/lib/systemd/system/kube* root@192.168.2.117:/usr/lib/systemd/system scp /usr/bin/kubectl root@192.168.2.117:/usr/bin scp -r ~/.kube root@192.168.2.117:~ 2.4 删除证书文件删除 kubelet 证书和 kubeconfig 文件 rm -f /opt/kubernetes/cfg/kubelet.kubeconfig rm -f /opt/kubernetes/ssl/kubelet* 2.5 修改配置文件 IP 和主机名修改 apiserver、kubelet 和 kube-proxy 配置文件为本地 IP vi /opt/kubernetes/cfg/kube-apiserver.conf ... --bind-address=192.168.2.117 \ --advertise-address=192.168.2.117 \ ... vi /opt/kubernetes/cfg/kube-controller-manager.kubeconfig server: https://192.168.2.117:6443 vi /opt/kubernetes/cfg/kube-scheduler.kubeconfig server: https://192.168.2.117:6443 vi /opt/kubernetes/cfg/kubelet.conf --hostname-override=k8s-master2 vi /opt/kubernetes/cfg/kube-proxy-config.yml hostnameOverride: k8s-master2 vi ~/.kube/config server: https://192.168.2.117:6443 2.6 设置开机启动systemctl daemon-reload systemctl start kube-apiserver kube-controller-manager kube-scheduler kubelet kube-proxy systemctl enable kube-apiserver kube-controller-manager kube-scheduler kubelet kube-proxy
2.7 批准 kubelet 证书申请[root@k8s-master2 ~]# kubectl get csr NAME AGE SIGNERNAME REQUESTOR REQUESTEDDURATION CONDITION node-csr-ajsCPL5d09p3IKQ_rwELNHhjXBhQLHzys4BWK5AAT1A 80s kubernetes.io/kube-apiserver-client-kubelet kubelet-bootstrap <none> Pending [root@k8s-master2 ~]# [root@k8s-master2 ~]# [root@k8s-master2 ~]# [root@k8s-master2 ~]# kubectl certificate approve node-csr-ajsCPL5d09p3IKQ_rwELNHhjXBhQLHzys4BWK5AAT1A certificatesigningrequest.certificates.k8s.io/node-csr-ajsCPL5d09p3IKQ_rwELNHhjXBhQLHzys4BWK5AAT1A approved [root@k8s-master2 ~]# kubectl get node NAME STATUS ROLES AGE VERSION k8s-master1 Ready <none> 24h v1.22.4 k8s-master2 NotReady <none> 12s v1.22.4 k8s-node1 Ready <none> 24h v1.22.4 k8s-node2 Ready <none> 24h v1.22.4
三、部署 Nginx+Keepalived 高可用负载均衡器kube-apiserver 高可用架构图:
・Nginx 是一个主流 Web 服务和反向代理服务器,这里用四层实现对 apiserver 实现负载均衡。 ・Keepalived 是一个主流高可用软件,基于 VIP 绑定实现服务器双机热备,在上述拓扑中,Keepalived 主要根据 Nginx 运行状态判断是否需要故障转移(漂移 VIP),例如当 Nginx 主节点挂掉,VIP 会自动绑定在 Nginx 备节点,从而保证 VIP 一直可用,实现 Nginx 高可用。 注 1:独立于 k8s 集群之外部署,只要 nginx 与 apiserver 能通信就行。 注 2:如果你是在公有云上,一般都不支持 keepalived,那么你可以直接用它们的负载均衡器产品,直接负载均衡多台 Master kube-apiserver,架构与上面一样。 在两台 Master 节点操作。 2.1 安装软件包(主 / 备) yum install epel-release -y yum -y install nginx-all-modules.noarch yum install nginx keepalived -y 2.2Nginx 配置文件(主 / 备一样)cat > /etc/nginx/nginx.conf << "EOF" user nginx; worker_processes auto; error_log /var/log/nginx/error.log; pid /run/nginx.pid; include /usr/share/nginx/modules/*.conf; events { worker_connections 1024; } # 四层负载均衡,为两台Master apiserver组件提供负载均衡 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.2.117:6443; # Master1 APISERVER IP:PORT server 192.168.2.119:6443; # Master2 APISERVER IP:PORT } server { listen 16443; # 由于nginx与master节点复用,这个监听端口不能是6443,否则会冲突 proxy_pass k8s-apiserver; } } http { log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; include /etc/nginx/mime.types; default_type application/octet-stream; server { listen 80 default_server; server_name _; location / { } } } EOF 2.3 keepalived 配置文件(Nginx Master)cat > /etc/keepalived/keepalived.conf <<EOF 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 } vrrp_script check_nginx { script "/etc/keepalived/check_nginx.sh" } vrrp_instance VI_1 { state MASTER interface ens192 # 修改为实际网卡名 virtual_router_id 51 # VRRP 路由 ID 实例,每个实例是唯一的 priority 100 # 优先级,备服务器设置 90 advert_int 1 # 指定 VRRP 心跳包通告间隔时间,默认 1 秒 authentication { auth_type PASS auth_pass 1111 } # 虚拟 IP virtual_ipaddress { 192.168.2.88/24 } # 执行脚本 track_script { check_nginx } } EOF
准备上述配置文件中检查 nginx 运行状态的脚本: cat > /etc/keepalived/check_nginx.sh << "EOF" #!/bin/bash count=$(ss -antp |grep 16443 |egrep -cv "grep|$$") if [ "$count" -eq 0 ];then exit 1 else exit 0 fi EOF chmod +x /etc/keepalived/check_nginx.sh 2.4 keepalived 配置文件(Nginx Backup)cat > /etc/keepalived/keepalived.conf << EOF 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_BACKUP } vrrp_script check_nginx { script "/etc/keepalived/check_nginx.sh" } vrrp_instance VI_1 { state BACKUP interface ens192 virtual_router_id 51 # VRRP 路由 ID实例,每个实例是唯一的 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.2.88/24 } track_script { check_nginx } } EOF 准备上述配置文件中检查 nginx 运行状态的脚本: cat > /etc/keepalived/check_nginx.sh << "EOF" #!/bin/bash count=$(ss -antp |grep 16443 |egrep -cv "grep|$$") if [ "$count" -eq 0 ];then exit 1 else exit 0 fi EOF chmod +x /etc/keepalived/check_nginx.sh 注:keepalived 根据脚本返回状态码(0 为工作正常,非 0 不正常)判断是否故障转移。 检查节点状态:
2.5 启动并设置开机启动systemctl daemon-reload systemctl start nginx keepalived systemctl enable nginx keepalived 2.6 查看 keepalived 工作状态虚拟 VIP 绑定到 Nnginx 服务器, 88 虚拟 IP 是 Nginx 服务器使用的 IP,nginx 会帮助我们 将请求转发到 APIServer。
2.7 Nginx+Keepalived 高可用测试关闭主节点 Nginx,测试 VIP 是否漂移到备节点服务器。
在 Nginx Master 执行 pkill nginx; 2.8 访问负载均衡器测试找 K8s 集群中任意一个节点,使用 curl 查看 K8s 版本测试,使用 VIP 访问: curl -k https://192.168.2.88:16443/version { "major": "1", "minor": "20", "gitVersion": "v1.22.4", "gitCommit": "e87da0bd6e03ec3fea7933c4b5263d151aafd07c", "gitTreeState": "clean", "buildDate": "2021-02-18T16:03:00Z", "goVersion": "go1.15.8", "compiler": "gc", "platform": "linux/amd64" }
可以正确获取到 K8s 版本信息,说明负载均衡器搭建正常。该请求数据流程:curl -> vip (nginx) -> apiserver 通过查看 Nginx 日志也可以看到转发 apiserver IP:
2.9 修改所有 Worker Node 连接 LB VIP试想下,虽然我们增加了 Master2 Node 和负载均衡器,但是我们是从单 Master 架构扩容的,也就是说目前所有的 Worker Node 组件连接都还是 Master1 Node,如果不改为连接 VIP 走负载均衡器,那么 Master 还是单点故障。 因此接下来就是要改所有 Worker Node(kubectl get node 命令查看到的节点)组件配置文件,由原来 192.168.2.119 修改为 192.168.2.88(VIP)。 在所有 Worker Node 执行: sed -i 's#192.168.2.119:6443#192.168.2.88:16443#' /opt/kubernetes/cfg/* systemctl restart kubelet kube-proxy 检查节点状态:
文章作者:开着拖拉机回家 原文链接:https://blog.csdn.net/qq_35995514/article/details/128049352(责任编辑:IT) |