目录

一、kubernetes组件信息

1.1 Master节点组件

1.2 Node节点组件

二、安装初始化

2.1 所有节点初始化环境

2.2-1 安装 CRI-dockerd 插件以及配置

2.2-2 所有节点配置containerd相关配置(使用containerd作为容器运行时操作)

2.3 所有 Master 安装 keepalived 以及 HAproxy

2.3.1 配置 Master 节点 HAproxy 配置文件

2.3.2 配置 Master 节点 keepalived 文件

2.3.2.1 prod-k8s-master01 配置文件修改

2.3.2.2 prod-k8s-master02 配置文件修改

2.3.2.3 prod-k8s-master03 配置文件修改

2.3.2.4 配置 Master 节点健康检查脚本

2.3.2.5 所有Master节点启动Keepalived及Haproxy

2.4 安装 kubernetes 组件

2.5 集群初始化

2.5.1-1 初始化yaml文件(Master01)(使用docker-ce作为容器运行时操作)

2.5.1-2 初始化yaml文件(Master01)(使用containerd作为容器运行时操作)

2.6 拉取 kubuernetes 组件镜像

2.7 Calico网络插件安装(Master01)

2.8 生成新的token key值(Master01)(略)

2.9 Metrics server部署(Master01)

2.10 修改Kube-proxy改为ipvs模式(master01)

2.11 集群可用性验证

2.12 部署Dashboard


一、kubernetes组件信息

1.1 Master节点组件

  • kube-APIServer:是整个集群的控制中枢,提供集群中各个模块之间的数据交换,并将集群状态和信息存储到分布式键-值(key-value)存储系统Etcd集群中。同时它也是集群管理、资源配额、提供完备的集群安全机制的入口,为集群各类资源对象提供增删改查以及watch的REST API接口。
  • kube-Scheduler:是集群Pod的调度中心,主要是通过调度算法将Pod分配到最佳的Node节点,它通过APIServer监听所有Pod的状态,一旦发现新的未被调度到任何Node节点的Pod( PodSpec.NodeName为空),就会根据一系列策略选择最佳节点进行调度。

  • kube-ControllerManager :是集群状态管理器,以保证Pod或其他资源达到期望值。当集群中某个Pod的副本数或其他资源因故障和错误导致无法正常运行,没有达到设定的值时,Controller Manager会尝试自动修复并使其达到期望状态。
  • Etcd:由Coreos开发,用于可靠地存储集群的配置数据,是一种持久性、轻量型、分布式的键-值(key-value)数据存储组件,作为Kubernetes集群的持久化存储系统。

1.2 Node节点组件

  • Kubelet:负责与Master通信协作,管理该节点上的Pod,对容器进行健康检查及监控,同时负责上报节点和节点上面Pod的状态。
  • Kube-Proxy:负责各Pod之间的通信和负载均衡,将指定的流量分发到后端正确的机器上。Runtime:负责容器的管理。
  • CoreDNS:用于Kubernetes集群内部Service的解析,可以让Pod把Service名称解析成Service的IP,然后通过service的IP地址进行连接到对应的应用上。
  • Calico:符合CNI标准的一个网络插件,它负责给每个Pod分配一个不会重复的IP,并且把每个节点当做一各“路由器”,这样一个节点的Pod就可以通过IP地址访问到其他节点的Pod。

二、安装初始化

📌生产环境中一般是三台 Master 节点。

Master 节点喝 Worker 节点的 IP 地址网段区分开;防止后期由于业务增长,节点资源需要扩充,方便运维管理。

role

ipaddress

configure

k8s-lb

192.168.9.222

VIP

k8s-master01(etcd )

192.168.9.150

4 core, 4Gb; 50GBS, CentOS 7.9

k8s-master02(etcd )

192.168.9.151

4 core, 4Gb; 50GBS, CentOS 7.9

k8s-master03(etcd )

192.168.9.152

4 core, 4Gb; 50GBS, CentOS 7.9

k8s-node01

192.168.9.153

4 core, 16Gb; 100GBS, CentOS 7.9

k8s-node02

192.168.9.154

4 core, 16Gb; 100GBS, CentOS 7.9

2.1 所有节点初始化环境

#>>> 所有节点修改主机名
hostnamectl  set-hostname k8s-master01
hostnamectl  set-hostname k8s-master02
hostnamectl  set-hostname k8s-master03
hostnamectl  set-hostname k8s-node01
hostnamectl  set-hostname k8s-node02

#>>> 所有节点关闭防火墙及安全策略
systemctl disable --now firewalld NetworkManager
sed -ri "s/^SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/sysconfig/selinux 
setenforce 0

#>>> 所有节点禁用swap分区
swapoff -a && sysctl -w vm.swappiness=0 && sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab

#>>> 所有节点修改本地解析
cat  >> /etc/hosts << EOF
192.168.174.122    k8s-lb
192.168.174.30     k8s-master01
192.168.174.31     k8s-master02
192.168.174.32     k8s-master03
192.168.174.40     k8s-node01
192.168.174.41     k8s-node02
EOF

#>>> 所有节点修改YUM源并且安装epel源
rm -rf /etc/yum.repos.d/*
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo

#>>> 所有节点安装docker-ce源
yum install -y yum-utils
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast

#>>> 所有节点安装kubernetes的YUM源(阿里云)
cat  >> /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/rpm/repodata/repomd.xml.key
EOF

#>>> 所有节点更新系统内rpm软件包(除内核外)
yum -y update --exclude=kernel*

#>>> 生成公钥和私钥,传送公钥(k8s-master01操作)
ssh-keygen
for i in k8s-master02 k8s-master03 k8s-node01 k8s-node02;do ssh-copy-id -i .ssh/id_rsa.pub $i;done

#>>> 传输内核包(k8s-master01操作)
for i in k8s-master02 k8s-master03 k8s-node01 k8s-node02;do scp kernel-ml-4.19.12-1.el7.elrepo.x86_64.rpm kernel-ml-devel-4.19.12-1.el7.elrepo.x86_64.rpm $i:/root/ ; done

#>>> 所有节点升级的内核(v5.4+),Kubernetes官网推荐内核版本
+++++++++++++++++++++++++++++++++++++++++++
### 自己安装kernel包然后yum下载
kernel-lt-5.4.261-1.el7.elrepo.x86_64
kernel-lt-devel-5.4.261-1.el7.elrepo.x86_64
+++++++++++++++++++++++++++++++++++++++++++
grub2-set-default 0 && grub2-mkconfig -o /etc/grub2.cfg
grubby --args="user_namespace.enable=1" --update-kernel="$(grubby --default-kernel)"
grubby --default-kernel 


#>>> 所有节点安装所需要的服务及依赖(安装Docker是需到github.com/kubernetes中查看当版本适应什么版本的Docker)
#>>> 这里没有安装Docker
yum -y install wget jq psmisc vim net-tools telnet yum-utils \
               device-mapper-persistent-data lvm2 git ntpdate \
               ipvsadm ipset sysstat conntrack libseccomp 

#>>> 所有节点校准时间修改上海时区并且加到开机自启
echo "*/5 * * * *        ntpdate -b ntp.aliyun.com" >>/var/spool/cron/root
ln -sf /usr/share/zoneinfo/Asia/Shanghai  /etc/localtime
echo 'ASia/Shanghai' > /etc/timezone

#>>> 所有节点设置最大文件打开数
ulimit -SHn 65535
#参数
+++++++++++++++++++++++++++++++++++++++++++++
-H:设定资源的硬性限制,也就是管理员所设下的限制
-S:设定资源的弹性限制;
-n <文件数目>:指定同一时间最多可开启的文件数;
+++++++++++++++++++++++++++++++++++++++++++++

cat  >>/etc/security/limits.conf << EOF
* soft nofile 655360
* hard nofile 131072
* soft nproc 655350
* hard nproc 655350
* soft memlock unlimited
* hard memlock unlimited
EOF
	# 参数解释:
	soft nofile 655360 # nofile 表示每个进程可以打开的最大文件描述符数(即最大可打开的文件数)。soft 表示这是软限制,用户可以在不超过硬限制的情况下通过 ulimit 命令调整此值。适用于需要大量文件句柄的应用,如大型数据库、Web 服务器等。
	hard nofile 131072 # hard 表示这是硬限制,用户无法通过 ulimit 命令将其值调得超过此限制。适用于限制系统上所有进程的资源使用,以防止过度消耗系统资源。
	soft nproc 655350 # nproc 表示每个用户可创建的最大进程数。soft 限制可以通过 ulimit 命令在运行时调整,但不能超过硬限制。适用于需要大量进程的应用或服务,如批处理作业、高并发应用等。
	hard nproc 655350 # hard 限制是不能被用户通过 ulimit 命令调整的最大进程数限制。防止单个用户启动过多的进程,影响系统稳定性。
	soft memlock unlimited # memlock 表示进程可以锁定在物理内存中的最大内存大小。soft 限制指可以在不超过硬限制的情况下调整锁定内存大小。对于需要频繁访问内存的应用,锁定内存可以减少分页操作的开销,提高性能。
	hard memlock unlimited # hard 限制表示进程能锁定的内存大小的最大限制,用户不能超出此限制。

#>>> 所有节点生成ipvs内核配置 方便后面把kubernetes的service的proxy换成ipvs
modprobe -- ip_vs # 核心的 IPVS 模块
modprobe -- ip_vs_rr # Round-Robin(轮询)调度算法模块
modprobe -- ip_vs_wrr # Weighted Round-Robin(加权轮询)
modprobe -- ip_vs_sh # Source Hashing(源地址哈希)
modprobe -- nf_conntrack # 连接跟踪模块,IPVS 基于连接跟踪工作

# /etc/module-load.d 创建.conf文件,开机自动加载
cat  >>/etc/modules-load.d/ipvs.conf << EOF
ip_vs
ip_vs_lc
ip_vs_wlc
ip_vs_rr
ip_vs_wrr
ip_vs_lblc
ip_vs_lblcr
ip_vs_dh
ip_vs_sh
ip_vs_fo
ip_vs_nq
ip_vs_sed
ip_vs_ftp
nf_conntrack
ip_tables
ip_set
xt_set
ipt_set
ipt_rpfilter
ipt_REJECT
ipip
EOF
	# 参数解释:
	ip_vs # 通过将客户端请求转发到多台后端服务器上来实现负载均衡。ip_vs 是负载均衡模块的核心部分。
	ip_vs_lc # lc 是 IPVS 的一个负载均衡算法,即 Least Connection(最少连接数)。它将流量转发到当前连接数最少的后端服务器。
	ip_vs_wlc # wlc 是 IPVS 的一种负载均衡算法,即 Weighted Least Connection(加权最少连接数)。它基于每个后端服务器的连接数和权重来决定流量的分配。
	ip_vs_rr # rr 是 IPVS 的一种负载均衡算法,即 Round Robin(轮询)。该算法按照轮询的方式将请求分配给每个后端服务器。
	ip_vs_wrr # wrr 是 IPVS 的一种负载均衡算法,即 Weighted Round Robin(加权轮询)。它在轮询的基础上增加了权重,允许按权重分配流量。
	ip_vs_lblc # lblc 是 IPVS 的一种负载均衡算法,即 Locality-Based Least Connection(基于区域的最少连接)。此算法会尝试将请求转发到与客户端最近的服务器,并且选择连接数最少的服务器。
	ip_vs_lblcr # lblcr 是 IPVS 的一种负载均衡算法,即 Locality-Based Least Connection with Replication(基于区域的最少连接和复制)。与 lblc 类似,但它增加了复制机制,确保请求的处理有冗余。
	ip_vs_dh # dh 是 IPVS 的一种负载均衡算法,即 Destination Hashing(目标哈希)。该算法基于客户端的目标地址进行哈希计算,将请求分配给相应的后端服务器。适用于根据目标地址进行流量分配的场景。
	ip_vs_sh # sh 是 IPVS 的一种负载均衡算法,即 Source Hashing(源地址哈希)。该算法通过计算客户端的源地址的哈希值来决定请求的后端服务器。适用于需要根据客户端来源地址进行流量分配的场景。
	ip_vs_fo # fo 是 IPVS 的一种负载均衡算法,即 Full Random(完全随机)。此算法将请求随机地分配到后端服务器。适用于负载均衡效果不要求过于精确的场景,尤其是在负载相对均衡时。
	ip_vs_nq # nq 是 IPVS 的一种负载均衡算法,即 No Queue(无队列)。该算法不使用队列调度,而是直接将请求分配给服务器。适用于不需要复杂调度的场景。
	ip_vs_sed # sed 是 IPVS 的一种负载均衡算法,即 Shortest Expected Delay(最短预期延迟)。该算法优先将流量分配给预计延迟最短的服务器。适用于需要减少延迟的实时应用,如视频流、在线游戏等。
	ip_vs_ftp # ftp 是 IPVS 的一种负载均衡算法,专门用于处理 FTP(文件传输协议)流量。它确保 FTP 流量的会话正确地转发。专用于处理 FTP 协议流量的负载均衡。
	nf_conntrack # nf_conntrack 是 Linux 的一个网络连接跟踪模块,用于跟踪所有活动的网络连接的状态(如 NAT、状态防火墙等)。在防火墙、路由器以及需要监控连接状态的网络环境中使用。
	ip_tables # ip_tables 是 Linux 防火墙模块,负责处理基于 IP 地址的包过滤。它包含多个子模块,用于定义流量的规则(如允许或拒绝某些流量)。
	ip_set # ip_set 是用于创建和管理 IP 地址、端口、网络等集合的模块。它优化了防火墙规则的执行,使得基于集合的匹配更加高效。用于处理大量 IP 地址或端口集的防火墙规则。
	xt_set # xt_set 是 iptables 扩展模块,允许防火墙基于 ip_set 中的集合进行匹配。提升基于集合的过滤规则效率,常用于大规模 IP 集合的匹配。
	ipt_set # ipt_set 是一个与 ip_set 类似的模块,但它直接用于 iptables 防火墙规则中。用于优化防火墙规则,减少性能开销。
	ipt_rpfilter # ipt_rpfilter 是 iptables 中的反向路径过滤模块。它通过检查包的源地址与路由表的一致性来阻止伪造源地址的包。防止 IP 欺骗攻击(如反射 DDoS 攻击)。
	ipt_REJECT # ipt_REJECT 是 iptables 中的一个目标模块,表示拒绝数据包并发送错误信息给发送者。当某个连接不符合防火墙规则时,直接拒绝并告知发送方。
	ipip # ipip 是一种隧道协议,它允许将 IPv4 数据包封装在其他 IPv4 数据包中,从而在 IPv4 网络上传输 IPv4 数据。用于在 IPv4 网络之间进行封装传输,通常用于创建虚拟专用网络(VPN)或跨越 NAT 的连接。

#>>> 所有节点k8s内核配置项
cat  > /etc/sysctl.d/k8s.conf << EOF
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
fs.may_detach_mounts = 1
net.ipv4.conf.all.route_localnet = 1
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_watches=89100
fs.file-max=52706963
fs.nr_open=52706963
net.netfilter.nf_conntrack_max=2310720
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl =15
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_orphans = 327680
net.ipv4.tcp_orphan_retries = 3
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.ip_conntrack_max = 65536
net.ipv4.tcp_timestamps = 0
net.core.somaxconn = 16384
EOF

sysctl --system
	# 参数解释:
	net.ipv4.ip_forward = 1 # 启用IPV4转发,允许系统将网络数据包从一个接口转发到另一个接口
	net.bridge.bridge-nf-call-iptables = 1 # 启用网桥(bridge)上调用iptables进行数据包过滤。
	fs.may_detach_mounts = 1 # 控制进程可以拆卸挂载点(例如卸载文件系统)。允许进程拆卸挂载。在某些容器环境或特殊系统中,可能需要允许进程卸载某些挂载。
	vm.overcommit_memory = 1 # 控制内存超分配的行为。内核会允许系统分配更多的内存。
	vm.panic_on_oom = 0 # 当系统内存不足时,是否触发内核 panic。不希望因内存不足而导致系统崩溃的场景。
	fs.inotify.max_user_watches = 89100 # 控制单个用户可以监视的最大文件数(最大文件系统监视数)。
	fs.file-max = 52706963 # 指定系统允许的最大文件句柄数。每个打开的文件和套接字都占用一个文件句柄。
	fs.nr_open = 52706963 # 指定系统中可以同时打开的最大文件描述符数。
	net.netfilter.nf_conntrack_max = 2310720 # 设置连接追踪表的最大条目数。连接追踪表用于跟踪每个网络连接的状态。适用于大规模网络环境,防火墙或NAT配置中需要跟踪大量并发连接时。
	net.ipv4.tcp_keepalive_time = 600 # 设置TCP连接保持活动的时间,单位为秒。在该时间后,TCP连接会发送空包以维持连接活跃。
	net.ipv4.tcp_keepalive_probes = 3 # 在TCP连接被认为失效之前,发送的最大探测包数量。适用于长时间不活动的连接,确定连接是否还有效。
	net.ipv4.tcp_keepalive_intvl = 15 # TCP保持活动探测包发送的间隔时间,单位为秒。在连接空闲时,用来定期检查连接是否仍然有效。
	net.ipv4.tcp_max_tw_buckets = 36000 # TCP最大TIME-WAIT连接数。TIME-WAIT状态的连接在关闭后会保留一段时间,以确保对方收到确认。适用于高并发系统,防止过多的TIME-WAIT连接占用资源。
	net.ipv4.tcp_tw_reuse = 1 # 允许重新使用TIME-WAIT状态的连接。适用于高并发场景,减少TIME-WAIT连接的资源占用。
	net.ipv4.tcp_max_orphans = 327680 # 允许系统同时存在的最大孤立连接数(即没有关联到任何进程的连接)。适用于高负载服务器,确保系统可以处理大量连接。
	net.ipv4.tcp_orphan_retries = 3 # 定义系统在关闭孤立连接之前,重试的最大次数。用于优化TCP连接管理,避免长时间无效连接占用资源。
	net.ipv4.tcp_syncookies = 1 # 用TCP同步cookie(SYN cookies)来防止SYN洪水攻击。该机制可以在受到DDoS攻击时帮助缓解连接请求的压力。防止SYN洪水攻击,提高系统的抗攻击能力。
	net.ipv4.tcp_max_syn_backlog = 16384 # TCP连接请求的最大排队数。当SYN请求到达时,如果队列满了,则会丢弃请求。适用于高并发服务器,以增加接收SYN请求的能力。
	net.ipv4.ip_conntrack_max = 65536 # 设置连接追踪表(conntrack)的最大连接数。适用于大量并发连接的环境,比如防火墙、路由器等。
	net.ipv4.tcp_timestamps = 0 # 禁用TCP时间戳。TCP时间戳可以用于计算往返时延,但它也会增加额外的开销。提高性能,减少不必要的开销。
	net.core.somaxconn = 16384 # 定义系统能够接受的最大连接请求队列长度。该值影响listen()系统调用的最大队列大小。适用于高并发服务器,确保可以处理大量连接请求。
	
#>>> 重启查看调优参数是否加载
reboot
lsmod | grep --color=auto -e ip_vs -e nf_conntrack

2.2-1 安装 CRI-dockerd 插件以及配置

#因为 kubernetes 从 v1.24 版本开始就不能直接支持 docker 容器运行,所以我们需要下载 CRI-dockerd 插件作为一个垫片/接口来继续使用 Docker 作为容器继续使用。

+++++++++++++++++++++++++++++++++++++++++++++++++++++++
Kubelet
  |
  | ←—— CRI 接口 ——→ CRI-dockerd
                           |
                           | ←—— Docker API ——→ dockerd
+++++++++++++++++++++++++++++++++++++++++++++++++++++++

dockerKubernetes版本依赖:https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.27.md

#>>> 所有节点安装docker-ce
yum install -y docker-ce-20.10.* docker-ce-cli-20.10.* containerd.io 

#>>> 所有节点启动docker(如果使用containerd作为容器运行时,不需要启动docker)
systemctl enable --now docker.service

#>>> 所有节点设置Docker镜像加速器并且修改systemd作为cgroug的驱动(如果使用containerd作为容器运行时,不需要配置)
cat  >/etc/docker/daemon.json << EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "registry-mirrors": [ "http://hub-mirror.c.163.com", 
   "https://kr1xs9ba.mirror.aliyuncs.com",
   "https://docker.m.daocloud.io", 
   "https://dockerproxy.com", 
   "https://docker.mirrors.ustc.edu.cn", 
   "https://docker.nju.edu.cn", 
   "https://docker.registry.cyou",
   "https://docker-cf.registry.cyou",
   "https://dockercf.jsdelivr.fyi",
   "https://docker.jsdelivr.fyi",
   "https://dockertest.jsdelivr.fyi",
   "https://mirror.aliyuncs.com",
   "https://dockerproxy.com",
   "https://mirror.baidubce.com",
   "https://docker.m.daocloud.io",
   "https://docker.nju.edu.cn",
   "https://docker.mirrors.sjtug.sjtu.edu.cn",
   "https://docker.mirrors.ustc.edu.cn",
   "https://mirror.iscas.ac.cn",
   "https://docker.rainbond.cc",
   "https://noohub.run",
   "https://huecker.io",
   "https://dockerhub.timeweb.cloud", 
   "https://registry.docker-cn.com",
   "https://yfw3r2c6.mirror.aliyuncs.com", 
   "http://hub-mirror.c.163.com", 
   "https://docker.m.daocloud.io",
   "https://dockerproxy.com",
   "https://docker.mirrors.ustc.edu.cn",
   "https://docker.nju.edu.cn"] 
}
EOF

#>>> 所有节点重新加载Docker的配置文件且重启(如果使用containerd作为容器运行时,不需要启动docker)
systemctl daemon-reload && systemctl restart docker

#>>> 下载cri-dockerd驱动(Master01)
wget -c https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.14/cri-dockerd-0.3.14.amd64.tgz

#>>> 解压安装包(Master01)
tar -xvf cri-dockerd-0.3.14.amd64.tgz --strip-components=1 -C /usr/local/bin/

#>>> 下载cri-docker.service和cri-docker.socket文件(Master01)
# cri-docker.service文件内容链接:https://github.com/Mirantis/cri-dockerd/blob/master/packaging/systemd/cri-docker.service
vim /etc/systemd/system/cri-docker.service

[Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=https://docs.mirantis.com
After=network-online.target firewalld.service docker.service
Wants=network-online.target
Requires=cri-docker.socket

[Service]
Type=notify
# ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd://
ExecStart=/usr/local/bin/cri-dockerd --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9 --container-runtime-endpoint=unix:///var/run/cri-dockerd.sock --cri-dockerd-root-directory=/var/lib/dockershim --cri-dockerd-root-directory=/var/lib/docker
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always


StartLimitBurst=3


StartLimitInterval=60s


LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity


TasksMax=infinity
Delegate=yes
KillMode=process

[Install]
WantedBy=multi-user.target


# cri-docker.socket文件内容链接:
#https://github.com/Mirantis/cri-dockerd/blob/master/packaging/systemd/cri-docker.socket
vim /etc/systemd/system/cri-docker.socket

[Unit]
Description=CRI Docker Socket for the API
PartOf=cri-docker.service

[Socket]
#ListenStream=%t/cri-dockerd.sock
ListenStream=/var/run/cri-dockerd.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker

[Install]
WantedBy=sockets.target
#>>> 将 cri-dockerd-0.3.14.amd64.tgz 拷贝至其他全部节点(Master01)
Nodes='k8s-master02 k8s-master03 k8s-node01 k8s-node02'
for NODE in $Nodes; do echo $NODE; scp cri-dockerd-0.3.14.amd64.tgz $NODE:~; done

#>>> 其他所有的节点将 cri-dockerd-0.3.14.amd64.tgz 解压到指定目录
tar -xvf cri-dockerd-0.3.14.amd64.tgz --strip-components=1 -C /usr/local/bin/

#>>> 将 cri-docker.service 和 cri-docker.socket 文件拷贝至其他所有主机(Master01)
for NODE in $Nodes; do scp /etc/systemd/system/cri-docker.service $NODE:/etc/systemd/system/; scp /etc/systemd/system/cri-docker.socket $NODE:/etc/systemd/system; done

#>>> 所有节点启动cri-dockerd
systemctl daemon-reload 
systemctl enable --now cri-docker.service
systemctl status cri-docker.service

2.2-2 所有节点配置containerd相关配置(使用containerd作为容器运行时操作)

#>>> 所有节点安装containerd
yum install docker-ce-20.10.* docker-ce-cli-20.10.* containerd.io -y 

#>>> 所有节点配置 Containerd 所需的模块
cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF

#>>> 所有节点加载内核
sysctl --system

#>>> 所有节点配置Containerd的配置文件
mkdir -p /etc/containerd
containerd config default | tee /etc/containerd/config.toml

#>>> 所有节点将 Containerd 的 Cgroup 改为 Systemd
vim /etc/containerd/config.toml
SystemdCgroup = true

#>>> 所有节点将 sandbox_image 的 Pause 镜像改成符合自己版本的地址
vim /etc/containerd/config.toml
sandbox_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9"

#>>> 所有节点启动Containerd,并配置开机自启动
systemctl daemon-reload
systemctl enable --now containerd

#>>> 所有节点配置 crictl 客户端连接的运行时位置
cat > /etc/crictl.yaml <<EOF
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF

2.3 所有 Master 安装 keepalived 以及 HAproxy

yum -y install keepalived haproxy

2.3.1 配置 Master 节点 HAproxy 配置文件

vim /etc/haproxy/haproxy.cfg

global
  maxconn  2000
  ulimit-n  16384
  log  127.0.0.1 local0 err
  stats timeout 30s

defaults
  log global
  mode  http
  option  httplog
  timeout connect 5000
  timeout client  50000
  timeout server  50000
  timeout http-request 15s
  timeout http-keep-alive 15s

frontend monitor-in
  bind *:33305
  mode http
  option httplog
  monitor-uri /monitor

frontend prod-k8s-master  # 和主机名保持一致
  bind 0.0.0.0:16443
  bind 127.0.0.1:16443
  mode tcp
  option tcplog
  tcp-request inspect-delay 5s
  default_backend prod-k8s-master # 和主机名保持一致

backend prod-k8s-master # 和主机名保持一致
  mode tcp
  option tcplog
  option tcp-check
  balance roundrobin
  default-server inter 10s downinter 5s rise 2 fall 2 slowstart 60s maxconn 250 maxqueue 256 weight 100
  # 和你的master节点保持一致
  server prod-k8s-master01	192.168.9.150:6443  check 
  server prod-k8s-master02	192.168.9.151:6443  check
  server prod-k8s-master03	192.168.9.152:6443  check

2.3.2 配置 Master 节点 keepalived 文件

2.3.2.1 prod-k8s-master01 配置文件修改
vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived
global_defs {
    router_id LVS_DEVEL
script_user root
    enable_script_security
}
vrrp_script chk_apiserver {
    script "/etc/keepalived/check_apiserver.sh" # 自己配置的健康检查脚本
    interval 5
    weight -5
    fall 2  
    rise 1
}
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    mcast_src_ip 192.168.98.21 # 本机IP
    virtual_router_id 51
    priority 101
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass K8SHA_KA_AUTH
    }
    virtual_ipaddress {
        192.168.98.222 # VIP地址
    }
    track_script {
       chk_apiserver
    }
}
2.3.2.2 prod-k8s-master02 配置文件修改
vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived
global_defs {
    router_id LVS_DEVEL
script_user root
    enable_script_security
}
vrrp_script chk_apiserver {
    script "/etc/keepalived/check_apiserver.sh" # 自己配置的健康检查脚本
    interval 5
    weight -5
    fall 2  
    rise 1
}
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    mcast_src_ip 192.168.9.151 # 本机IP
    virtual_router_id 51
    priority 100
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass K8SHA_KA_AUTH
    }
    virtual_ipaddress {
        192.168.9.222 # VIP地址
    }
    track_script {
       chk_apiserver
    }
}
2.3.2.3 prod-k8s-master03 配置文件修改
vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived
global_defs {
    router_id LVS_DEVEL
script_user root
    enable_script_security
}
vrrp_script chk_apiserver {
    script "/etc/keepalived/check_apiserver.sh" # 自己配置的健康检查脚本
    interval 5
    weight -5
    fall 2  
    rise 1
}
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    mcast_src_ip 192.168.9.152 # 本机IP
    virtual_router_id 51
    priority 100
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass K8SHA_KA_AUTH
    }
    virtual_ipaddress {
        192.168.9.222 # VIP地址
    }
    track_script {
       chk_apiserver
    }
}
2.3.2.4 配置 Master 节点健康检查脚本
vim /etc/keepalived/check_apiserver.sh 

#!/bin/bash

err=0
for k in $(seq 1 3)
do
    check_code=$(pgrep haproxy)
    if [[ $check_code == "" ]]; then
        err=$(expr $err + 1)
        sleep 1
        continue
    else
        err=0
        break
    fi
done

if [[ $err != "0" ]]; then
    echo "systemctl stop keepalived"
    /usr/bin/systemctl stop keepalived
    exit 1
else
    exit 0
fi

# 给与执行权限
chmod +x /etc/keepalived/check_apiserver.sh
2.3.2.5 所有Master节点启动KeepalivedHaproxy
systemctl daemon-reload
systemctl enable --now keepalived haproxy

ping 192.168.9.222

2.4 安装 kubernetes 组件

#>>> Master节点执行
yum install kubeadm-1.28* kubelet-1.28* kubectl-1.28* -y

#>>> Node节点执行
yum install kubeadm-1.28* kubelet-1.28* -y

#>>> 查看kubeadm版本(Master01)
kubeadm version

#>>> 将所有kubelet配置成systemd作为cgroug驱动,保持系统稳定。(如果使用containerd作为容器运行时,不需要配置)
cat  >/etc/sysconfig/kubelet << EOF
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
EOF
#`Kubernetes`默认设置`cgroup驱动(cgroupdriver)` 为“`systemd`”,而`Docker`服务的`cgroup`驱动默认值为“`cgroupfs`,建议将其修改为“`systemd`”,与`Kubernetes`保持一致。

#>>> 所有节点启动kubelet(查看状态时,失败正常,因为此时 kubelet 没有配置文件)
systemctl daemon-reload && systemctl enable --now kubelet

2.5 集群初始化

2.5.1-1 初始化yaml文件(Master01)(使用docker-ce作为容器运行时操作)

kubeadm的初始化控制平面(init)命令和加入节点(join)命令均可以通过指定的配置文件修改默认参数的值。kubeadm将配置文件以ConfigMap形式保存到集群中,便于后续的查询和升级工作。

kubeadm config子命令提供了对这组功能的支持。

  • kubeadm config print init-defaults:输出kubeadm init命令默认参数的内容。
  • kubeadm config print join-defaults:输出kubeadm join命令默认参数的内容。
  • kubeadm config migrate:在新旧版本之间进行配置转换。
  • kubeadm config images list:列出所需的镜像列表。
  • kubeadm config images pull:拉取镜像到本地。
$ vim /root/kubeadm-config.yaml
---
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: 7t2weq.bjbawausm0jaxury
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 192.168.9.150
  bindPort: 6443
nodeRegistration:
  criSocket: unix:///var/run/cri-dockerd.sock
  name: k8s-master01
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/control-plane
---
apiServer:
  certSANs:
  - 192.168.9.222
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controlPlaneEndpoint: 192.168.9.222:16443
controllerManager: {}
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: v1.28.15 # 更改此处的版本号和kubeadm version一致
networking:
  dnsDomain: cluster.local
  podSubnet: 172.16.0.0/16
  serviceSubnet: 10.96.0.0/16
scheduler: {}

⚠️:配置文件参数需要修改,修改前备份,或者直接用命令行直接生成新的配置文件,但是仍需要修改配置文件中的参数
  ⚠️配置文件需改参数 
      advertiseAddress: 192.168.174.30   # Master01 的ip地址
      name: k8s-master01                # Master01 的主机名
      - 192.168.174.99                  # VIP ip地址
      controlPlaneEndpoint: 192.168.174.99:16443   # VIP ip地址:端口
      imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers #镜像仓库地址(阿里)
      kubernetesVersion:  v1.28.15       # kubernetes的版本号
      podSubnet: 172.16.0.0/16           # Pod 的网段地址
      serviceSubnet: 10.96.0.0/16        # service 的网段地址 

#>>> 上述配置文件解析
---
# 指定 Kubernetes 配置文件的 API 版本,v1beta3 代表是 Kubernetes v1.28.x 版本的 kubeadm 配置。
apiVersion: kubeadm.k8s.io/v1beta3
# 用于集群引导时的身份认证信息。
bootstrapTokens:
# 指定 token 属于哪个组。
- groups:
  # system:bootstrappers:kubeadm:default-node-token 是默认的引导令牌组。
  - system:bootstrappers:kubeadm:default-node-token
  # 指定引导令牌,它的格式是 xxxxxx.xxxxxxxx。此 token 用于在集群中认证节点。
  token: 7t2weq.bjbawausm0jaxury
  # token 的过期时间,24h0m0s 表示 24 小时后过期。
  ttl: 24h0m0s
  # token 的使用场景,包括 signing 和 authentication,表示用于签名和身份验证。
  usages:
  - signing
  - authentication
# 资源类型。初始化配置
kind: InitConfiguration
# 本地 API 服务端点配置。也是就是当前主机apiserver的IP地址和端口,非VIP地址
localAPIEndpoint:
  # Kubernetes 控制平面节点(主节点)对外提供服务的 IP 地址,这里指定为 192.168.174.30。
  advertiseAddress: 192.168.174.30
  # API 服务器绑定的端口号,默认为 6443。
  bindPort: 6443
# 节点注册的相关配置。
nodeRegistration:
  # 指定容器运行时接口(CRI)socket,这里使用的是 cri-dockerd,它是 Docker 的 CRI 插件,路径为 unix:///var/run/cri-dockerd.sock。
  criSocket: unix:///var/run/cri-dockerd.sock
  # 节点的名称,这里是 k8s-master01,通常是主节点(控制平面)的名称。
  name: k8s-master01
  # 用于标记节点的污点。这里使用 NoSchedule 的效果,表示该节点只能调度控制平面组件,而不能调度其他类型的工作负载(如 pod)。key 表示污点的键值对,node-role.kubernetes.io/control-plane 是 Kubernetes 默认的控制平面标识。
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/control-plane
---
# Kubernetes API 服务器的配置。
apiServer:
  # 指定 API 服务器的 Subject Alternative Names(SANs),用于证书验证。这里设置了 192.168.174.99,即该 IP 地址将用于访问 API 服务器。
  certSANs:
  - 192.168.174.99
  # 设置控制平面组件的超时时间,4m0s 表示 4 分钟。该值控制控制平面组件启动的超时。
  timeoutForControlPlane: 4m0s
# api版本
apiVersion: kubeadm.k8s.io/v1beta3
# 证书存放的目录,这里是 /etc/kubernetes/pki。Kubernetes 集群的各种证书(如 API 服务器证书、etcd 证书等)都会存储在此目录下。
certificatesDir: /etc/kubernetes/pki
# 集群的名称。这里指定为 kubernetes。
clusterName: kubernetes
# 控制平面的外部访问端点,指定了 API 服务器的地址和端口。这里设置为 192.168.174.99:16443,表示集群的 API 服务器可以通过这个 IP 地址和端口进行访问。
controlPlaneEndpoint: 192.168.174.99:16443
# 控制器管理器的配置项,当前为空 {},表示使用默认配置。
controllerManager: {}
# etcd 配置,etcd 是 Kubernetes 的键值存储,存储了所有的集群状态。
etcd:
  # local:表示使用本地 etcd 实例。
  local:
    # 指定 etcd 数据目录,这里是 /var/lib/etcd。
    dataDir: /var/lib/etcd
# 指定 Kubernetes 控制平面组件(如 API 服务器、控制器管理器、调度器)镜像的仓库地址。这里使用的是阿里云的镜像仓库 registry.cn-hangzhou.aliyuncs.com/google_containers。
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
kind: ClusterConfiguration
# 指定 Kubernetes 的版本。这里是 v1.28.15,需要与 kubeadm 的版本一致。
kubernetesVersion: v1.28.15 # 更改此处的版本号和kubeadm version一致
# 集群网络配置。
networking:
  # DNS 域名,用于集群内部服务的 DNS 名称。这里是 cluster.local。
  dnsDomain: cluster.local
  # Pod 网络子网,指定为 172.16.0.0/16,表示 Pod IP 地址范围。
  podSubnet: 172.16.0.0/16
  # 服务网络子网,指定为 10.96.0.0/16,表示服务 IP 地址范围。
  serviceSubnet: 10.96.0.0/16
# 调度器的配置项,当前为空 {},表示使用默认配置。
scheduler: {}


#>>> 更新的初始化文件(Master01)
$ kubeadm config migrate --old-config kubeadm-config.yaml --new-config new.yaml

#>>> 将new.yaml 拷贝至其他master节点(Master01)
$ for i in k8s-master02 k8s-master03; do scp new.yaml $i:/root/; done

2.5.1-2 初始化yaml文件(Master01)(使用containerd作为容器运行时操作)

$ vim /root/kubeadm-config.yaml
---
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: 7t2weq.bjbawausm0jaxury
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 192.168.174.30
  bindPort: 6443
nodeRegistration:
  criSocket: unix:///var/run/containerd/containerd.sock
  name: k8s-master01
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/control-plane
---
apiServer:
  certSANs:
  - 192.168.174.99
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controlPlaneEndpoint: 192.168.174.99:16443
controllerManager: {}
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: v1.28.15 # 更改此处的版本号和kubeadm version一致
networking:
  dnsDomain: cluster.local
  podSubnet: 172.16.0.0/16
  serviceSubnet: 10.96.0.0/16
scheduler: {}

⚠️:配置文件参数需要修改,修改前备份,或者直接用命令行直接生成新的配置文件,但是仍需要修改配置文件中的参数
  ⚠️配置文件需改参数 
      advertiseAddress: 192.168.174.30   # Master01 的ip地址
      name: k8s-master01                # Master01 的主机名
      - 192.168.174.99                  # VIP ip地址
      controlPlaneEndpoint: 192.168.174.99:16443   # VIP ip地址:端口
      imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers #镜像仓库地址(阿里)
      kubernetesVersion:  v1.28.15       # kubernetes的版本号
      podSubnet: 172.16.0.0/16           # Pod 的网段地址
      serviceSubnet: 10.96.0.0/16        # service 的网段地址 
 
#>>> 更新的初始化文件(Master01)
$ kubeadm config migrate --old-config kubeadm-config.yaml --new-config new.yaml

#>>> 将new.yaml 拷贝至其他master节点(Master01)
$ for i in k8s-master02 k8s-master03; do scp new.yaml $i:/root/; done


2.6 拉取 kubuernetes 组件镜像

#>>> 拉取初始化所需要的镜像文件(根据当前配置文件拉去所需要的镜像)(所有Master节点)
kubeadm config images pull --config new.yaml

#>>> 初始化集群(生成安全证书并且生成node节点加入集群中的哈希码)(Master01)
kubeadm init --config new.yaml --upload-certs

#>>> 如果初始化失败,重置后再次初始化,命令如下(没有失败不要执行)
$ kubeadm reset -f ; ipvsadm --clear  ; rm -rf ~/.kube

#>>> 另外两个 master 节点执行
kubeadm join 192.168.174.122:16443 --token 7t2weq.bjbawausm0jaxury \
	--discovery-token-ca-cert-hash sha256:d30b11256f574adc45ee1c9cbf1925054bd28c53b39044316ba5f41c38c9829d \
	--control-plane --certificate-key e7947922e80dcef1a21b6eec92ddd44c2e05eacff88c61eab648cfb8afbd1662 --cri-socket=unix:///var/run/cri-dockerd.sock


#>>> 所有 Node节点执行
kubeadm join 192.168.174.122:16443 --token 7t2weq.bjbawausm0jaxury \
	--discovery-token-ca-cert-hash sha256:d30b11256f574adc45ee1c9cbf1925054bd28c53b39044316ba5f41c38c9829d --cri-socket=unix:///var/run/cri-dockerd.sock

#>>> k8s-master01执行
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

#>>> Master01执行查看node状态
$ kubectl get nodes

2.7 Calico网络插件安装(Master01)

Calico官方链接:Calico Documentation | Calico Documentation

Calico资源清单:https://raw.githubusercontent.com/projectcalico/calico/v3.28.2/manifests/calico.yaml

Calico安装方式:https://docs.tigera.io/calico/3.28/getting-started/kubernetes/self-managed-onprem/onpremises#install-calico

⚠️ :注意kubernetescalico之间的版本关联;详细信息去官网查看:System requirements | Calico Documentation

cd /root/ && git clone  https://gitee.com/BRWYZ/kubernetes_install.git
cd /root/kubernetes_install && git checkout v1.28+  && cd calico/

#>>> 修改calico配置文件中Pod的网段
POD_SUBNET=`cat /etc/kubernetes/manifests/kube-controller-manager.yaml | grep cluster-cidr= | awk -F= '{print $NF}'`
sed -i "s#POD_CIDR#${POD_SUBNET}#g" calico.yaml

#>>> 创建calico容器
kubectl apply -f calico.yaml

#>>> 查看Pod的信息
kubectl get po -n kube-system
#>>> 取消所有master节点污点
kubectl taint node k8s-master01 k8s-master02 k8s-master03 node-role.kubernetes.io/control-plane-

2.8 生成新的token key值(Master01)(略)

⚠️:由于生成的token值有效期较短,或者有新的master或者node节点需要添加集群当中,所以需要获取新的token

#>>> 生成新的master的token值(一般不需要,三台master足够支撑)
kubeadm init phase upload-cers --upload-certs

#>>> 生成新的node的token值
kubeadm token create --print-join-command

#>>> 查看token值过期时间(在/root/new.yaml文件中token: abcdef.0123456789abcdef对应bootstrap-token-abcdef)
$ kubectl get secret -n kube-system
 bootstrap-token-abcdef
$ kubectl get secret bootstrap-token-abcdef -n kube-system -oyaml
  找到 expiration: MjAyMi0xMS0yM1QxNDowNjowOFo=
$ echo "MjAyMi0xMS0yM1QxNDowNjowOFo=" | base64 --decode

2.9 Metrics server部署(Master01)

#>>> 将Master01节点的front-proxy-ca.crt复制到所有节点(master01)
scp /etc/kubernetes/pki/front-proxy-ca.crt k8s-node01:/etc/kubernetes/pki/front-proxy-ca.crt
scp /etc/kubernetes/pki/front-proxy-ca.crt k8s-node02:/etc/kubernetes/pki/front-proxy-ca.crt
scp /etc/kubernetes/pki/front-proxy-ca.crt k8s-master02:/etc/kubernetes/pki/front-proxy-ca.crt
scp /etc/kubernetes/pki/front-proxy-ca.crt k8s-master03:/etc/kubernetes/pki/front-proxy-ca.crt

#>>> 安装Metrics server(master01)
cd ~/kubernetes_install/kubeadm-metrics-server/  && kubectl  create -f comp.yaml

#>>> 查看Metrics server状态(master01)
kubectl get po -n kube-system -l k8s-app=metrics-server

#>>> 查看节点状态(master01)
kubectl top node  

#>>> 查看pod的状态(master01)
kubectl top po -A

2.10 修改Kube-proxy改为ipvs模式(master01)

初始化集群的时注释了ipvs配置(Master01),将 kube-proxy 模式从 iptables 修改为 ipvs 是为了提升性能和功能。

  1. 性能优势ipvs可以更有效地处理大量并发连接。这使得它在高流量场景下表现更佳。更好地扩展以处理更多的服务和后端pod,而 iptables 在规则数量非常多时,性能可能会显著下降。
  2. 低延迟和高吞吐量ipvs 通过在内核空间处理数据包,减少了用户空间和内核空间之间的切换,从而提高了数据包处理的效率,带来更低的延迟和更高的吞吐量。
  3. 快速规则应用ipvs 在处理和应用网络规则时速度更快,特别是在规则变更频繁的情况下。
  4. 多种调度算法ipvs 提供了多种负载均衡算法(如轮询、最小连接、最短延迟等),可以根据具体需求选择最合适的算法,而 iptables 则缺乏这种灵活性。
  5. 稳定性ipvs 的实现更加稳定,尤其是在大型集群中,它能更好地应对复杂的网络环境和高负载。
  6. 简化的规则管理ipvs 使用专用的内核模块管理规则,相比 iptables 更加简洁和高效。iptables 规则在处理和管理上会更加复杂,特别是当规则数量增多时。
  7. 维护方便ipvs 的规则结构更清晰,维护起来更为方便,不像 iptables 那样需要处理大量的规则链和复杂的规则匹配逻辑。
kubectl edit cm kube-proxy -n kube-system
    # 找到mode字段添加ipvs

#>>> 更新Kube-Proxy的Pod
kubectl patch daemonset kube-proxy -p "{\"spec\":{\"template\":{\"metadata\":{\"annotations\":{\"date\":\"`date +'%s'`\"}}}}}" -n kube-system

#>>> 验证Kube-Proxy模式
curl 127.0.0.1:10249/proxyMode
ipvs

2.11 集群可用性验证

#>>> 安装pod,测试集群连通性
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: busybox
  namespace: default
spec:
  containers:
  - name: busybox
    image: registry.cn-hangzhou.aliyuncs.com/hujiaming/busybox:latest
    command:
      - sleep
      - "3600"
    imagePullPolicy: IfNotPresent
  restartPolicy: Always
EOF

#>>> 查看kubernetes下的service
kubectl get svc

#>>> busybox解析同namespace下的service
kubectl exec  busybox -n default -- nslookup kubernetes.default.svc.cluster.local
    # 执行结果:(成功)
    Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local
     Name:      kubernetes
Address 1: 10.96.0.1 kubernetes.default.svc.cluster.local

#>>> busybox跨namespace解析kube-system下的namespace
kubectl exec  busybox -n default -- nslookup kube-dns.kube-system.svc.cluster.local
Server:     10.96.0.10
Address:    10.96.0.10:53
Name:   kube-dns.kube-system.svc.cluster.local
Address: 10.96.0.10

#>>> 每个节点都必须要访问kubernetes的service:443和kube-dns的service:53
telnet 10.96.0.1 443   #kubernetes下的service(kubectl get svc)
    # 返回结果:
Trying 10.96.0.1...
Connected to 10.96.0.1.
Escape character is '^]'.

telnet 10.96.0.10 53   #kube-system下的service (kubectl get svc -n kube-system)
    # 执行结果:
Trying 10.96.0.10...
Connected to 10.96.0.10.
Escape character is '^]'.
Connection closed by foreign host.

#>>> Pod和Pod之间通信测试
  #>>> 进入一个Pod当中
  kubectl exec -it busybox -- sh
  #>>> ping其他Pod
  / # ping 172.25.244.193
  #>>> ping宿主机
  / # ping 192.168.174.30

#>>> 创建一个deployment副本
kubectl create deploy nginx --image=registry.cn-hangzhou.aliyuncs.com/hujiaming/nginx:1.24.0 --replicas=1

#>>> 查看创建的副本
kubectl get deploy
执行结果:
    NAME    READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES        SELECTOR
nginx   0/1     1            0           7m35s   nginx        nginx:v1.21   app=nginx
#>>> 删除创建的deployment副本
kubectl delete deploy nginx

集群验证步骤:

  • Pod必须解析servicePod必须能解析跨namespaceservice
  • 每个节点都必须要访问kubernetesservice:443kube-dnsservice:53
  • 每个PodPod之间能通信(同namespace能通信,跨namespace能通信,跨主机通信)

2.12 部署Dashboard

#>>> 切换目录
cd /root/kubernetes_install/dashboard

#>>> 创建Dashboard
kubectl  create -f . 

#>>> 查看Dashborad
kubectl get po -n kubernetes-dashboard

#>>> 查看Dashdoard暴露的端口号
kubectl get svc -n kubernetes-dashboard

#>>> 创建Token值
kubectl create token admin-user -n kube-system

火狐浏览器访问:https://宿主机 IP:30164

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐