目录
[二、master02 节点部署](#二、master02 节点部署)
[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 上查看节点的连接状态)
[四、部署 Dashboard](#四、部署 Dashboard)
[1、什么是 Dashboard](#1、什么是 Dashboard)
[2、安装 Dashboard](#2、安装 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服务
bashsystemctl restart keepalived