【kubernetes】多 master 高可用集群架构部署

目录

前言

一、环境部署

[二、master02 节点部署](#二、master02 节点部署)

1、拷贝相关文件

2、修改配置文件

3、启动各服务并设置开机自启

[4、 查看node节点状态](#4、 查看node节点状态)

三、负载均衡部署

[1、部署 nginx 服务](#1、部署 nginx 服务)

[1.1 编译安装 nginx](#1.1 编译安装 nginx)

[1.2 修改 nginx 配置文件](#1.2 修改 nginx 配置文件)

[2、部署 keepalived 服务](#2、部署 keepalived 服务)

[2.1 yum安装 keepalived 服务](#2.1 yum安装 keepalived 服务)

[2.2 修改keepalived配置文件](#2.2 修改keepalived配置文件)

[2.3 创建nginx状态检查脚本](#2.3 创建nginx状态检查脚本)

[2.5 直接拷贝配置文件和脚本到ngkeep02节点](#2.5 直接拷贝配置文件和脚本到ngkeep02节点)

[2.6 启动keepalived服务](#2.6 启动keepalived服务)

[2.5 修改node节点上的配置文件中的server为VIP地址](#2.5 修改node节点上的配置文件中的server为VIP地址)

[3、在 ngkeep01 上查看节点的连接状态](#3、在 ngkeep01 上查看节点的连接状态)

4、测试

[四、部署 Dashboard](#四、部署 Dashboard)

[1、什么是 Dashboard](#1、什么是 Dashboard)

[2、安装 Dashboard](#2、安装 Dashboard)

3、使用输出的token登录Dashboard


前言

Kubernetes作为当今最流行的容器编排平台之一,为企业提供了高效管理和部署容器化应用的解决方案。然而,构建一个稳定、可靠的Kubernetes集群对于确保应用程序的高可用性至关重要

在本文中,我们将探讨如何设计和部署一个多Master高可用集群架构,多Master节点架构旨在避免单点故障,并提高集群的可用性,确保业务持续运行

实际生产环境架构设计

  • Master节点数量: 至少部署3个Master节点,以实现高可用性。这些Master节点将共同管理集群状态,并通过选举机制选择活跃的Leader节点

  • node节点数量:至少3台Node节点可以提供一定程度的高可用性,因为即使一台Node节点出现故障,集群仍然可以继续运行。更多的Node节点可以提供更高级别的可用性和负载均衡

  • 负载均衡器: 在Master节点前部署负载均衡器(如HAProxy、Nginx等),用于将流量均衡到不同的Master节点上,确保请求能够被正确路由到活跃的Leader节点

  • Etcd集群: 部署独立的Etcd集群,用于存储Kubernetes集群的状态信息。Etcd是Kubernetes的数据存储后端,需要保证其高可用性和数据一致性

  • 故障恢复和自动化: 配置故障恢复机制,包括自动故障转移、自动扩展和自动化部署,以减少人为干预并提高集群的稳定性

本次多 master 高可用集群架构部署的案例,使用的机器相对较少,可作参考

一、环境部署

| 服务器 | 主机名 | IP地址 | 主要软件 |
| k8s集群 master01 节点 (etcd集群节点1) | master01 | 172.16.12.10 | kube-apiserver、kube-controller-manager、kube-scheduler、etcd |
| k8s集群 master02 节点 | master02 | 172.16.12.13 | kube-apiserver、kube-controller-manager、kube-scheduler、etcd |
| k8s集群 node01 节点 (etcd集群节点2) | node01 | 172.16.12.11 | kubelet、kube-proxy docker、etcd |
| k8s集群 node02 节点 (etcd集群节点3) | node02 | 172.16.12.12 | kubelet、kube-proxy docker、etcd |
| 负载均衡 nginx+keepalive01(master) | ngkeep01 | 172.16.12.15 | nginx、keepalive |
| 负载均衡 nginx+keepalive02(backup) | ngkeep02 | 172.16.12.16 | nginx、keepalive |

虚拟 VIP 地址 172.16.12.100

(1)所有设备关闭防火墙,清空iptables规则

bash 复制代码
systemctl disable --now firewalld
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X

(2)所有设备关闭selinux

bash 复制代码
setenforce 0    #临时关闭
sed -i 's/enforcing/disabled/' /etc/selinux/config   #永久关闭

(3)所有设备关闭swap

bash 复制代码
swapoff -a    #临时关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab    #永久关闭

(4)修改所有设备的主机名

bash 复制代码
[root@localhost ~]#hostnamectl set-hostname master01
[root@localhost ~]#bash
 
[root@localhost ~]#hostnamectl set-hostname master02
[root@localhost ~]#bash
 
[root@localhost ~]#hostnamectl set-hostname node01
[root@localhost ~]#bash
 
[root@localhost ~]#hostnamectl set-hostname node02
[root@localhost ~]#bash

[root@localhost ~]#hostnamectl set-hostname ngkeep01
[root@localhost ~]#bash

[root@localhost ~]#hostnamectl set-hostname ngkeep02
[root@localhost ~]#bash

(5) 所有设备修改本地的hosts文件

bash 复制代码
cat >> /etc/hosts << EOF
172.16.12.10 master01
172.16.12.13 master02
172.16.12.11 node01
172.16.12.12 node02
172.16.12.15 ngkeep01
172.16.12.16 ngkeep02
EOF

(7)所有设备调整内核参数

bash 复制代码
cat > /etc/sysctl.d/k8s.conf << EOF
#开启网桥模式,可将网桥的流量传递给iptables链
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
#关闭ipv6协议
net.ipv6.conf.all.disable_ipv6=1
net.ipv4.ip_forward=1
EOF
bash 复制代码
sysctl --system     #重新加载系统的配置参数

(8)所有设备实现时间同步

bash 复制代码
yum install ntpdate -y
ntpdate time.windows.com

etcd 集群和 k8s 单 master 集群架构的部署请参考:

bash 复制代码
http://t.csdnimg.cn/os5M9

必须注意 master01 节点上执行签发证书脚本,生成的CA证书、相关组件的证书和私钥!

自签发证书脚本中的ip地址必须得添加虚拟VIP地址、nginx+keepalive01和nginx+keepalive02 服务器的地址

二、master02 节点部署

1、拷贝相关文件

从 master01 节点上拷贝证书文件、各master组件的配置文件和服务管理文件到 master02 节点

bash 复制代码
[root@master01 ~]#scp -r /opt/etcd/ root@172.16.12.13:/opt/
[root@master01 ~]#scp -r /opt/kubernetes/ root@172.16.12.13:/opt
[root@master01 ~]#scp -r /root/.kube root@172.16.12.13:/root
[root@master01 ~]#scp /usr/lib/systemd/system/{kube-apiserver,kube-controller-manager,kube-scheduler}.service root@172.16.12.13:/usr/lib/systemd/system/

2、修改配置文件

修改配置文件 kube-apiserver 中的IP

bash 复制代码
[root@master02 ~]#vim /opt/kubernetes/cfg/kube-apiserver
KUBE_APISERVER_OPTS="--logtostderr=true \
--v=4 \
--etcd-servers=https://172.16.12.10:2379,https://172.16.12.11:2379,https://172.16.12.12:2379 \
--bind-address=172.16.12.13 \                 #修改成master02本机的apiserver的ip地址
--secure-port=6443 \
--advertise-address=172.16.12.13 \            #修改成master02本机的apiserver的ip地址
......

3、启动各服务并设置开机自启

在 master02 节点上启动各服务并设置开机自启

bash 复制代码
[root@master02 ~]#systemctl start kube-apiserver.service
[root@master02 ~]#systemctl enable kube-apiserver.service
[root@master02 ~]#systemctl start kube-controller-manager.service
[root@master02 ~]#systemctl enable kube-controller-manager.service
[root@master02 ~]#systemctl start kube-scheduler.service
[root@master02 ~]#systemctl enable kube-scheduler.service

4、 查看node节点状态

bash 复制代码
[root@master02 ~]#ln -s /opt/kubernetes/bin/* /usr/local/bin/
[root@master02 ~]#kubectl get nodes
[root@master02 ~]#kubectl get nodes -o wide            
#-o=wide:输出额外信息;对于Pod,将输出Pod所在的Node名
#此时在master02节点查到的node节点状态仅是从etcd查询到的信息,而此时node节点实际上并未与master02节点建立通信连接,因此需要使用一个VIP把node节点与master节点都关联起来

三、负载均衡部署

配置load balancer集群双机热备负载均衡(nginx实现负载均衡,keepalived实现双机热备)

1、部署 nginx 服务

1.1 编译安装 nginx

在ngkeep01、ngkeep02节点上都需编译安装nginx,这里以ngkeep01为例

①下载安装包

官网下载安装包,nginx官网地址:www.nginx.org,进入后找到右边菜单栏的download,进入后选择自己想要下载的版本可以直接下载到本地,然后传到Linux系统中或右键复制该包的下载连接在Linux系统中wget此地址直接下载到Linux系统中

bash 复制代码
[root@ngkeep01 ~]#cd /data        #切换到想要的目录下载安装包
[root@ngkeep01 data]#wget http://nginx.org/download/nginx-1.18.0.tar.gz

② 安装包下载完成后解压到当前目录,并安装编译需要的依赖环境和工具,再新建nginx用户便于管理

bash 复制代码
[root@ngkeep01 data]#tar xf nginx-1.18.0.tar.gz          #解压源码包
[root@ngkeep01 data]#cd nginx-1.18.0/                    #切换目录
#下载安装所需编译工具
[root@ngkeep01 nginx-1.18.0]#yum -y install gcc gcc-c++ pcre-devel openssl-devel zlib-devel openss1 openss1-deve1
#新建nginx用户便于管理
[root@ngkeep01 nginx-1.18.0]#useradd -M -s /sbin/nologin nginx

③编译安装三步骤(./configure、make、make install)

bash 复制代码
#执行脚本,指定安装位置、指定用户为nginx用户、指定组为nginx组、指定安装的模块
[root@ngkeep01 nginx-1.18.0]#./configure --prefix=/apps/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre \
--with-stream \
--with-stream_ssl_module \
--with-stream_realip_module
 
#将所有源代码翻译成二进制,形成一个可执行文件
[root@ngkeep01 nginx-1.18.0]#make -j2
#将执行文件及相关的依赖文件拷贝到指定目录中
[root@ngkeep01 nginx-1.18.0]#make install

④修改权限

bash 复制代码
[root@ngkeep01 ~]#chown -R nginx.nginx /apps/nginx

⑤创建软链接,便于tab键补全

bash 复制代码
[root@ngkeep01 ~]#ln -s /apps/nginx/sbin/nginx /usr/bin

⑥设置配置文件关键词高亮

bash 复制代码
[root@ngkeep01 ~]#cp -r /data/nginx-1.18.0/contrib/vim/* /usr/share/vim/vimfiles/

⑦ 创建nginx自启动文件并启动

bash 复制代码
[root@ngkeep01 ~]#vim /usr/lib/systemd/system/nginx.service
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/apps/nginx/logs/nginx.pid
ExecStart=/apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf   #注意启动文件位置
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
LimitNOFILE=100000
[Install]
WantedBy=multi-user.target
 
[root@ngkeep01 ~]#systemctl daemon-reload           #重新加载配置
[root@ngkeep01 ~]#systemctl enable --now nginx      #开机自启并立即启动

1.2 修改 nginx 配置文件

ngkeep01节点操作:

修改 nginx 配置文件,配置四层反向代理负载均衡,指定 k8s 群集两台master的节点ip和6443端口

bash 复制代码
[root@ngkeep01 ~]#vim /apps/nginx/conf/nginx.conf

......
events {
    worker_connections  1024;
}

#添加
stream {
    log_format  main  '$remote_addr $upstream_addr - [$time_local] $status $upstream_bytes_sent';
    
	access_log /apps/nginx/logs/k8s-access.log  main;

    upstream k8s-apiserver {
        server 172.16.12.10:6443;
        server 172.16.12.13:6443;
    }
    server {
        listen 6443;
        proxy_pass k8s-apiserver;
    }
}
......
bash 复制代码
#检查配置文件语法
[root@ngkeep01 ~]#nginx -t   
#重新加载nginx配置文件,并查看已监听6443端口
[root@ngkeep01 ~]#nginx -s reload
[root@ngkeep01 ~]#ss -natp | grep nginx
bash 复制代码
#ngkeep01 与ngkeep02 的nginx配置文件一样,直接将 ngkeep01 的nginx配置文件拷贝到 ngkeep02 上
[root@ngkeep01 ~]#scp /apps/nginx/conf/nginx.conf ngkeep02:/apps/nginx/conf/nginx.conf

ngkeep02节点操作:

bash 复制代码
#配置文件被覆盖后,需重新加载nginx服务
[root@ngkeep02 ~]# nginx -s reload
[root@ngkeep02 ~]#ss -natp | grep nginx

2、部署 keepalived 服务

2.1 yum安装 keepalived 服务

在ngkeep01、ngkeep02节点上都需安装keepalived服务

bash 复制代码
[root@ngkeep01 ~]#yum install keepalived -y

2.2 修改keepalived配置文件

ngkeep01节点操作:

bash 复制代码
[root@ngkeep01 ~]#vim /etc/keepalived/keepalived.conf
! 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	#lb01节点的为 NGINX_MASTER,lb02节点的为 NGINX_BACKUP
}

#添加一个周期性执行的脚本
vrrp_script check_nginx {
    script "/apps/nginx/check_nginx.sh"	#指定检查nginx存活的脚本路径
}

vrrp_instance VI_1 {
    state MASTER			#lb01节点的为 MASTER,lb02节点的为 BACKUP
    interface ens33			#指定网卡名称 ens33
    virtual_router_id 51	#指定vrid,两个节点要一致
    priority 100			#lb01节点的为 100,lb02节点的为 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.16.12.100/24	#指定 VIP
    }
    track_script {
        check_nginx			#指定vrrp_script配置的脚本
    }
}

2.3 创建nginx状态检查脚本

ngkeep01节点操作:

bash 复制代码
[root@ngkeep01 ~]#vim /apps/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@ngkeep01 ~]#chmod +x /apps/nginx/check_nginx.sh

2.5 直接拷贝配置文件和脚本到ngkeep02节点

ngkeep01节点操作:

bash 复制代码
[root@ngkeep01 ~]#scp /etc/keepalived/keepalived.conf ngkeep02:/etc/keepalived/keepalived.conf
[root@ngkeep01 ~]#scp /apps/nginx/check_nginx.sh ngkeep02:/apps/nginx/

ngkeep02节点操作:

bash 复制代码
#修改ngkeep02节点上的keepalived配置文件
[root@ngkeep02 logs]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

......
   smtp_connect_timeout 30
   router_id NGINX_BACKUP   #需要修改,和ngkeep01的id不一样
}

vrrp_script check_nginx {
    script "/apps/nginx/check_nginx.sh"
}

vrrp_instance VI_1 {
    state BACKUP     #需要修改成BACKUP
    interface ens33
    virtual_router_id 51
    priority 90      #需要修改优先级
    advert_int 1
......

2.6 启动keepalived服务

在ngkeep01、ngkeep02节点上都需重新启动keepalived服务,这里以ngkeep01为例

一定要先启动了nginx服务,再启动keepalived服务

bash 复制代码
[root@ngkeep01 ~]#systemctl enable --now keepalived
[root@ngkeep01 ~]#ip a    #查看VIP是否生成

2.5 修改node节点上的配置文件中的server为VIP地址

所有的node节点上的都要修改bootstrap.kubeconfig ,kubelet.kubeconfig配置文件中的server为VIP地址,这里以node01节点为例

bash 复制代码
[root@node01 ~]#cd /opt/kubernetes/cfg/
[root@node01 cfg]#vim bootstrap.kubeconfig 
server: https://172.16.12.100:6443
                      
[root@node01 cfg]#vim kubelet.kubeconfig
server: https://172.16.12.100:6443
                        
[root@node01 cfg]#vim kube-proxy.kubeconfig
server: https://172.16.12.100:6443
bash 复制代码
#重启kubelet和kube-proxy服务
[root@node01 cfg]#systemctl restart kubelet.service 
[root@node01 cfg]#systemctl restart kube-proxy.service

3、在 ngkeep01 上查看节点的连接状态

bash 复制代码
#在 ngkeep01 上查看 nginx 和 node 、 master 节点的连接状态
[root@ngkeep01 ~]#netstat -natp | grep nginx

4、测试

在 master01 节点上操作:

(1)测试创建 pod

bash 复制代码
[root@master01 ~]#kubectl run nginx --image=nginx

(2) 查看Pod的状态信息

bash 复制代码
[root@master01 ~]#kubectl get pods

[root@master01 ~]#kubectl get pods -o wide

(3)直接使用浏览器或者curl命令访问

在除了对应网段的node节点上的机器,在其他任何一台设备上访问10.244.62.199,都会出错或卡住

在对应网段的node节点上操作,可以直接使用浏览器或者curl命令访问

(4)这时在master01节点上查看nginx日志

bash 复制代码
[root@master01 ~]#kubectl logs nginx

四、部署 Dashboard

1、什么是 Dashboard

Dashboard(仪表板)是基于Web的Kubernetes用户界面

可以使用仪表板将容器化应用程序部署到Kubernetes集群,对容器化应用程序进行故障排除,并管理集群本身及其伴随资源

可以使用仪表板来概述群集上运行的应用程序,以及创建或修改单个Kubernetes资源(例如deployment,job,daemonset等)

例如,可以使用部署向导扩展部署,启动滚动更新,重新启动Pod或部署新应用程序。仪表板还提供有关群集中Kubernetes资源状态以及可能发生的任何错误的信息

2、安装 Dashboard

(1)分别在 所有node节点上操作

bash 复制代码
#上传 dashboard.tar 和 metrics-scraper.tar 到 /opt 目录下
#将名为 dashboard.tar 的 Docker 镜像文件加载到 Docker 引擎中
[root@node01 opt]#docker load -i dashboard.tar
#将名为 metrics-scraper.tar 的 Docker 镜像文件加载到 Docker 引擎中
[root@node01 opt]#docker load -i metrics-scraper.tar 

#查看当前所有镜像
[root@node01 opt]#docker images

(2)在 master01 节点上操作

bash 复制代码
#上传 recommended.yaml 文件到 /opt/k8s 目录中
[root@master01 ~]#cd /opt/k8s

#默认Dashboard只能集群内部访问,修改Service为NodePort类型,暴露到外部
[root@master01 k8s]#vim recommended.yaml
......
kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 30001      #添加
  type: NodePort           #添加
  selector:
    k8s-app: kubernetes-dashboard
......
[root@master01 k8s]#kubectl apply -f recommended.yaml
#kubectl apply 命令用于创建或更新 Kubernetes 资源对象,-f 参数用于指定要应用的 YAML 文件
bash 复制代码
#创建 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

#获取"kube-system"命名空间中所有Secrets的列表,包括它们的名称、类型等信息
#Secrets通常用于存储敏感数据,如API密钥、密码等
[root@master01 k8s]#kubectl get secret -n kube-system

#"kube-system"命名空间中与"dashboard-admin"相关的Secret的详细信息
[root@master01 k8s]#kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
#kubectl -n kube-system get secret:这部分命令用于获取"kube-system"命名空间中所有Secret的列表
# | awk '/dashboard-admin/{print \$1}':这部分命令使用awk来过滤出包含"dashboard-admin"的Secret,并输出它们的名称

3、使用输出的token登录Dashboard

bash 复制代码
浏览器访问:https://NodeIP:30001

https://172.16.12.11:30001
https://172.16.12.12:30001

问题:node节点一开始是Ready状态,过了一段时间就变成了NotReady状态

解决方法:大部分原因是 虚拟VIP地址 消失了,ngkeep01和ngkeep02节点都需要重新启动keepalived服务

bash 复制代码
systemctl restart keepalived
相关推荐
昌sit!5 小时前
K8S node节点没有相应的pod镜像运行故障处理办法
云原生·容器·kubernetes
A ?Charis8 小时前
Gitlab-runner running on Kubernetes - hostAliases
容器·kubernetes·gitlab
wclass-zhengge8 小时前
Docker篇(Docker Compose)
运维·docker·容器
茶馆大橘8 小时前
微服务系列五:避免雪崩问题的限流、隔离、熔断措施
java·jmeter·spring cloud·微服务·云原生·架构·sentinel
北漂IT民工_程序员_ZG9 小时前
k8s集群安装(minikube)
云原生·容器·kubernetes
coding侠客9 小时前
揭秘!微服务架构下,Apollo 配置中心凭啥扮演关键角色?
微服务·云原生·架构
梦魇梦狸º12 小时前
腾讯轻量云服务器docker拉取不到镜像的问题:拉取超时
docker·容器·github
南猿北者14 小时前
docker镜像仓库常用命令
运维·docker·容器
2301_8061313615 小时前
Kubernetes的基本构建块和最小可调度单元pod-0
云原生·容器·kubernetes
SilentCodeY16 小时前
containerd配置私有仓库registry
容器·kubernetes·containerd·镜像·crictl