当前位置: > 其它学习 > Kubernetes >

K8s——master 扩容

时间:2023-02-27 16:00来源:csdn 作者:开着拖拉机回家

一、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

  • vrrp_script:指定检查 nginx 工作状态脚本(根据 nginx 状态判断是否故障转移)
  • virtual_ipaddress:虚拟 IP(VIP)

准备上述配置文件中检查 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 不正常)判断是否故障转移。

检查节点状态:

a42ac15ac8f826f705623c1293a160b7.png

2.5 启动并设置开机启动

systemctl daemon-reload
systemctl start nginx keepalived
systemctl enable nginx keepalived

2.6 查看 keepalived 工作状态

虚拟 VIP 绑定到 Nnginx 服务器,  88 虚拟 IP 是 Nginx 服务器使用的 IP,nginx 会帮助我们 将请求转发到 APIServer。

588a501b2801c134b9f27d3c79294270.png

2.7 Nginx+Keepalived 高可用测试

关闭主节点 Nginx,测试 VIP 是否漂移到备节点服务器。

在 Nginx Master 执行 pkill nginx;
在 Nginx Backup,ip addr 命令查看已成功绑定 VIP。

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:

[root@k8s-master1 ~]# tail -2f /var/log/nginx/k8s-access.log

192.168.2.118 192.168.2.119:6443 - [30/Oct/2022:13:00:44 +0800] 200 287

192.168.2.117 192.168.2.117:6443 - [30/Oct/2022:13:00:44 +0800] 200 287

192.168.2.117 192.168.2.119:6443 - [30/Oct/2022:13:00:44 +0800] 200 287

192.168.2.119 192.168.2.117:6443 - [30/Oct/2022:13:00:44 +0800] 200 287

192.168.2.210 192.168.2.119:6443 - [30/Oct/2022:13:00:45 +0800] 200 287

192.168.2.118 192.168.2.117:6443 - [30/Oct/2022:13:00:45 +0800] 200 287

192.168.2.117 192.168.2.119:6443 - [30/Oct/2022:13:00:45 +0800] 200 287

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)
------分隔线----------------------------