作者设置:由于当前各个常用镜像站无法正常代理下载镜像,这篇实验中所用到的镜像建议先从网络下载获取再导入到私仓使用,
或私信后台回复:9521 获取~ ~
另外这份实验材料总结下来出奇的字数多,提示超出字数,所以这篇分为了3章来发布
目录描述
- Kubernetes高可用集群部署架构要求说明
- Kubeadm部署Kubernetes v1.25.0高可用集群(一部分)
- Kubeadm部署Kubernetes v1.25.0高可用集群(二部分)
- Kubeadm部署Kubernetes v1.25.0高可用集群(完结)
一、实验环境配置要求
该次实验中的Kubernetes集群部署将基于以下环境进行:
1. 主机配置:
- 共5台主机,角色分工如下:
- 每个主机2G内存以上,2核CPU以上
- 操作系统: Ubuntu 20.04.4
- Kubernetes:v1.25.0
- Container Runtime: Docker CE 20.10.17
- CRI:cri-dockerd v0.2.5
2. 网络环境:
- 节点网络:192.168.157.0/24(自定义),节点地址分配如下:
- Pod网络:10.244.0.0/16(默认)
- Service网络:10.96.0.0/12(默认)
- 架构展示如下:
3. 基于Kubeadm实现Kubernetes v1.25.0集群部署流程说明
官方说明
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
https://kubernetes.io/zh-cn/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/
使用 kubeadm ,能创建一个符合最佳实践的最小化 Kubernetes 集群。 事实上,你可以使用 kubeadm配置一个通过 Kubernetes 一致性测试的集群。 kubeadm 还支持其他集群生命周期功能, 例如启动引导令牌和集群升级。
- Kubernetes集群API访问入口的高可用
- 每个节点主机的初始环境准备
- 在所有Master和Node节点都安装容器运行时,实际Kubernetes只使用其中的Containerd
- 在所有Master和Node节点安装kubeadm 、kubelet、kubectl
- 在所有节点安装和配置 cri-dockerd
- 在第一个 master 节点运行 kubeadm init 初始化命令 ,并验证 master 节点状态
- 在第一个 master 节点安装配置网络插件
- 在其它master节点运行kubeadm join 命令加入到控制平面集群中
- 在所有 node 节点使用 kubeadm join 命令加入集群
- 创建 pod 并启动容器测试访问 ,并测试网络通信
二、Kubeadm部署Kubernetes v1.25.0高可用集群
1. 部署集群API访问入口的高可用
在192.168.157.101和192.168.157.102上执行操作,利用 HAProxy 实现 Kubeapi 服务的负载均衡
1.1 安装Hapaoxy
#修改内核参数 root@master1ha1:~# cat >> /etc/sysctl.conf <<EOF net.ipv4.ip_nonlocal_bind = 1 EOF root@master1ha1:~# sysctl -p net.ipv4.ip_nonlocal_bind = 1 #安装配置haproxy root@master1ha1:~# apt update root@master1ha1:~# apt -y install haproxy #添加下面行参数 root@master1ha1:~# cat >> /etc/haproxy/haproxy.cfg <<EOF listen stats mode http bind 0.0.0.0:8888 stats enable log global stats uri /status stats auth admin:123456 listen kubernetes-api-6443 bind 192.168.157.100:16443 #备注:IP写*,端口改9443 mode tcp server master1ha1 192.168.157.101:6443 check inter 3s fall 3 rise 3 server master2ha2 192.168.157.102:6443 check inter 3s fall 3 rise 3 server master3harbor1 192.168.157.103:6443 check inter 3s fall 3 rise 3 EOF #测试配置是否正确,并做重启配置生效 root@master1ha1:~# haproxy -f /etc/haproxy/haproxy.cfg -c [WARNING] 169/064553 (1896) : parsing [/etc/haproxy/haproxy.cfg:23] : 'option httplog' not usable with proxy 'kubernetes-api-6443' (needs 'mode http'). Falling back to 'option tcplog'. Configuration file is valid root@master1ha1:~# systemctl restart haproxy #检查服务vip和端口监听正常后,做服务开机自启 root@master1ha1:~# ss -ntl State Recv-Q Send-Q Local Address:Port Peer Address:Port Process LISTEN 0 4096 127.0.0.53%lo:53 0.0.0.0:* LISTEN 0 128 0.0.0.0:22 0.0.0.0:* LISTEN 0 4096 0.0.0.0:8888 0.0.0.0:* LISTEN 0 128 127.0.0.1:6010 0.0.0.0:* LISTEN 0 4096 192.168.157.100:6443 0.0.0.0:* LISTEN 0 128 [::]:22 [::]:* LISTEN 0 128 [::1]:6010 [::]:* root@master1ha1:~# systemctl enable haproxy
1.2 安装 Keepalived
安装 keepalived 实现 HAProxy的高可用
root@master1ha1:~# apt update root@master1ha1:~# apt -y install keepalived root@master1ha1:~# vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { router_id ha1.org #指定router_id,#在ha2上为ha2.org } vrrp_script check_haproxy { #定义检测脚本 script "/etc/keepalived/check_haproxy.sh" interval 1 weight -30 fall 3 rise 2 timeout 2 } vrrp_instance VI_1 { state MASTER #另一台ha2为BACKUP interface ens33 virtual_router_id 60 #指定虚拟路由器ID,ha1和ha2此值必须相同 priority 100 #在ha2上为80 advert_int 1 authentication { auth_type PASS auth_pass 123456 #指定验证密码,ha1和ha2此值必须相同 } virtual_ipaddress { 192.168.157.100 #指定VIP,ha1和ha2此值必须相同 } track_script { check_haproxy #调用上面定义的检测脚本 } } #添加keepalived中的执行脚本并赋权,最后操作服务重启和设置开机自启 root@master1ha1:~# cat > /etc/keepalived/check_haproxy.sh <<EOF #!/bin/bash /usr/bin/killall -0 haproxy || systemctl restart haproxy EOF root@master1ha1:~# chmod a+x /etc/keepalived/check_haproxy.sh root@master1ha1:~# systemctl restart keepalived root@master1ha1:~# systemctl enable keepalived
补充:我是在5台节点初始化操作系统后,就把hosts解析写进去了,在 5台节点的/etc/hosts添加一下
root@master1ha1:~# vim /etc/hosts 127.0.0.1 localhost 127.0.1.1 master1_ha1 #这里记得更正为当前台的 # The following lines are desirable for IPv6 capable hosts ::1 ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 192.168.157.100 vip 192.168.157.101 master1ha1 192.168.157.102 master2ha2 192.168.157.103 master3harbor1 192.168.157.104 node1 192.168.157.105 node2
后面的测试需要在本机上进行,所以本机host解析也得加一下,我这里偷懒用了huo绒自带的修改工具,修改添加如下:
1.3 测试访问
经过上面的本机hosts配置过,就可以在浏览器上测试vip地址的访问验证,用户名密码是前面配置的 admin:123456
http://vip:8888/status
2. 所有的主机做初始化配置
2.1 配置ssh key验证
配置 ssh key 验证,做免密后,方便集群内同步文件
#生成key,实验环境,直接把回车敲到底 root@master1ha1:~# ssh-keygen #将id_rsa.pub文件同步到所有节点 root@master1ha1:~# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.157.101 root@master1ha1:~# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.157.102 root@master1ha1:~# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.157.103 root@master1ha1:~# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.157.104 root@master1ha1:~# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.157.105 #测试一下能否免密登录到其他4个节点 root@master1ha1:~# ssh root@192.168.157.102 root@master1ha1:~# ssh root@192.168.157.103 root@master1ha1:~# ssh root@192.168.157.104 root@master1ha1:~# ssh root@192.168.157.105
2.2 设置主机名和解析
上面已经配置过了
2.3 禁用 swap
swapoff -a sed -i '/swap/s/^/#/' /etc/fstab #或者 systemctl disable --now swap.img.swap systemctl mask swap.target
2.4 配时间同步
#借助于chronyd服务(程序包名称chrony)设定各节点时间精确同步 apt -y install chrony chronyc sources -v
2.5 禁用默认防火墙
#禁用默认配置的iptables防火墙服务 ufw disable ufw status
2.6 内核参数调整(可选)
允许 iptables 检查桥接流量,若要显式加载此模块,需运行 sudo modprobe br_netfilter,通过运行lsmod | grep br_netfilter 来验证 br_netfilter 模块是否已加载.
sudo modprobe br_netfilter lsmod | grep br_netfilter
为了让 Linux 节点的 iptables 能够正确查看桥接流量,请确认 sysctl 配置中的 net.bridge.bridge-nf-call-iptables 设置为 1。
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf overlay br_netfilter EOF modprobe overlay modprobe br_netfilter # 设置所需的 sysctl 参数,参数在重新启动后保持不变 cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 net.ipv4.ip_forward = 1 EOF # 应用 sysctl 参数而不重新启动 sysctl --system
最后~欢迎关注我! @Linux学习的那些事儿
我的个人资源整理,满满都是干货: → 可按需访问领取
如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!