Kubernetes_1.32.4高可用集群部署


安装一些必备工具

apt update && apt upgrade -y && apt install -y wget psmisc vim net-tools telnet lvm2 tar curl ipvsadm

关闭交换分区&防护墙

sed -ri 's/.*swap.*/#&/' /etc/fstab
swapoff -a && sysctl -w vm.swappiness=0
cat /etc/fstab
systemctl disable ufw --now && systemctl stop ufw 

时间同步

# 服务端
# yum install chrony -y
apt install chrony -y
cat > /etc/chrony.conf << EOF 
pool ntp.aliyun.com iburst
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
allow 192.168.1.0/24
local stratum 10
keyfile /etc/chrony.keys
leapsectz right/UTC
logdir /var/log/chrony
EOF

systemctl restart chronyd ; systemctl enable chronyd --now

# 客户端
# yum install chrony -y
apt install chrony -y
cat > /etc/chrony.conf << EOF 
pool 192.168.1.21 iburst
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
keyfile /etc/chrony.keys
leapsectz right/UTC
logdir /var/log/chrony
EOF

systemctl restart chronyd ; systemctl enable chronyd --now

#使用客户端进行验证
chronyc sources -v

参数解释

  1. pool ntp.aliyun.com iburst

    #指定使用ntp.aliyun.com作为时间服务器池,iburst选项表示在初始同步时会发送多个请求以加快同步速度。

  2. driftfile /var/lib/chrony/drift

    #指定用于保存时钟漂移信息的文件路径。

  3. makestep 1.0 3

    #设置当系统时间与服务器时间偏差大于1秒时,会以1秒的步长进行调整。如果偏差超过3秒,则立即进行时间调整。

  4. rtcsync

    #启用硬件时钟同步功能,可以提高时钟的准确性。

  5. allow 192.168.0.0/24

    #允许192.168.0.0/24网段范围内的主机与chrony进行时间同步。

  6. local stratum 10

    #将本地时钟设为stratum 10,stratum值表示时钟的准确度,值越小表示准确度越高。

  7. keyfile /etc/chrony.keys

    #指定使用的密钥文件路径,用于对时间同步进行身份验证。

  8. leapsectz right/UTC

    #指定时区为UTC。

  9. logdir /var/log/chrony

    #指定日志文件存放目录。

免密登录

#yum install -y sshpass
apt install -y sshpass
ssh-keygen -f /root/.ssh/id_rsa -P ''
export IP="192.168.1.21 192.168.1.22 192.168.1.23 192.168.1.24 192.168.1.25"
export SSHPASS=123123
for HOST in $IP;do
  sshpass -e ssh-copy-id -o StrictHostKeyChecking=no $HOST
done

这段脚本的作用是在一台机器上安装sshpass工具,并通过sshpass自动将本机的SSH公钥复制到多个远程主机上,以实现无需手动输入密码的SSH登录。
具体解释如下:

  1. apt install -y sshpassyum install -y sshpass:通过包管理器(apt或yum)安装sshpass工具,使得后续可以使用sshpass命令。
  2. ssh-keygen -f /root/.ssh/id_rsa -P '':生成SSH密钥对。该命令会在/root/.ssh目录下生成私钥文件id_rsa和公钥文件id_rsa.pub,同时不设置密码(即-P参数后面为空),方便后续通过ssh-copy-id命令自动复制公钥。
  3. export IP="192.168.1.21 192.168.1.22 192.168.1.23 192.168.1.24 192.168.1.25":设置一个包含多个远程主机IP地址的环境变量IP,用空格分隔开,表示要将SSH公钥复制到这些远程主机上。
  4. export SSHPASS=123123:设置环境变量SSHPASS,将sshpass所需的SSH密码(在这里是”123123”)赋值给它,这样sshpass命令可以自动使用这个密码进行登录。
  5. for HOST in$IP;do:遍历环境变量IP中的每个IP地址,并将当前IP地址赋值给变量HOST。
  6. sshpass -e ssh-copy-id -o StrictHostKeyChecking=no $HOST:使用sshpass工具复制本机的SSH公钥到远程主机。其中,-e选项表示使用环境变量中的密码(即SSHPASS)进行登录,-o StrictHostKeyChecking=no 选项表示连接时不检查远程主机的公钥,以避免交互式确认。
  7. 通过这段脚本,可以方便地将本机的SSH公钥复制到多个远程主机上,实现无需手动输入密码的SSH登录。

配置ulimit

ulimit -SHn 65535
cat >> /etc/security/limits.conf <<EOF
soft nofile 655360
hard nofile 131072
soft nproc 655350
hard nproc 655350
seft memlock unlimited
hard memlock unlimitedd
EOF

所有节点hosts配置

cat > /etc/hosts <<EOF
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.1.21 k8s-master01
192.168.1.22 k8s-master02
192.168.1.23 k8s-master03
192.168.1.24 k8s-node01
192.168.1.25 k8s-node02
192.168.1.36 lb-vip

EOF

安装ipvsadm

apt install ipvsadm ipset sysstat conntrack -y
cat >> /etc/modules-load.d/ipvs.conf <<EOF
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
ip_tables
ip_set
xt_set
ipt_set
ipt_rpfilter
ipt_REJECT
ipip
EOF

systemctl restart systemd-modules-load.service
lsmod | grep -e ip_vs -e nf_conntrack

参数解释

  • ip_vs
    • IPVS 是 Linux 内核中的一个模块,用于实现负载均衡和高可用性。它通过在前端代理服务器上分发传入请求到后端实际服务器上,提供了高性能和可扩展的网络服务。
  • ip_vs_rr
    • IPVS 的一种调度算法之一,使用轮询方式分发请求到后端服务器,每个请求按顺序依次分发。
  • ip_vs_wrr
    • IPVS 的一种调度算法之一,使用加权轮询方式分发请求到后端服务器,每个请求按照指定的权重比例分发。
  • ip_vs_sh
    • IPVS 的一种调度算法之一,使用哈希方式根据源 IP 地址和目标 IP 地址来分发请求。
  • nf_conntrack
    • 这是一个内核模块,用于跟踪和管理网络连接,包括 TCP、UDP 和 ICMP 等协议。它是实现防火墙状态跟踪的基础。
  • ip_tables
    • 这是一个内核模块,提供了对 Linux 系统 IP 数据包过滤和网络地址转换(NAT)功能的支持。
  • ip_set
    • 这是一个内核模块,扩展了 iptables 的功能,支持更高效的 IP 地址集合操作。
  • xt_set
    • 这是一个内核模块,扩展了 iptables 的功能,支持更高效的数据包匹配和操作。
  • ipt_set
    • 这是一个用户空间工具,用于配置和管理 xt_set 内核模块。
  • ipt_rpfilter
    • 这是一个内核模块,用于实现反向路径过滤,用于防止 IP 欺骗和 DDoS 攻击。
  • ipt_REJECT
    • 这是一个 iptables 目标,用于拒绝 IP 数据包,并向发送方发送响应,指示数据包被拒绝。
  • ipip
    • 这是一个内核模块,用于实现 IP 封装在 IP(IP-over-IP)的隧道功能。它可以在不同网络之间创建虚拟隧道来传输 IP 数据包。

修改内核参数

cat <<EOF > /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
fs.may_detach_mounts = 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_max_syn_backlog = 16384
net.ipv4.tcp_timestamps = 0
net.core.somaxconn = 16384

net.ipv6.conf.all.disable_ipv6 = 0
net.ipv6.conf.default.disable_ipv6 = 0
net.ipv6.conf.lo.disable_ipv6 = 0
net.ipv6.conf.all.forwarding = 1
EOF

sysctl --system

这些是Linux系统的一些参数设置,用于配置和优化网络、文件系统和虚拟内存等方面的功能。以下是每个参数的详细解释:

  1. net.ipv4.ip_forward = 1
  • 这个参数启用了IPv4的IP转发功能,允许服务器作为网络路由器转发数据包。
  1. net.bridge.bridge-nf-call-iptables = 1
  • 当使用网络桥接技术时,将数据包传递到iptables进行处理。
  1. fs.may_detach_mounts = 1
  • 允许在挂载文件系统时,允许被其他进程使用。
  1. vm.overcommit_memory=1
  • 该设置允许原始的内存过量分配策略,当系统的内存已经被完全使用时,系统仍然会分配额外的内存。
  1. vm.panic_on_oom=0
  • 当系统内存不足(OOM)时,禁用系统崩溃和重启。
  1. fs.inotify.max_user_watches=89100
  • 设置系统允许一个用户的inotify实例可以监控的文件数目的上限。
  1. fs.file-max=52706963
  • 设置系统同时打开的文件数的上限。
  1. fs.nr_open=52706963
  • 设置系统同时打开的文件描述符数的上限。
  1. net.netfilter.nf_conntrack_max=2310720
  • 设置系统可以创建的网络连接跟踪表项的最大数量。
  1. net.ipv4.tcp_keepalive_time = 600
  • 设置TCP套接字的空闲超时时间(秒),超过该时间没有活动数据时,内核会发送心跳包。
  1. net.ipv4.tcp_keepalive_probes = 3
  • 设置未收到响应的TCP心跳探测次数。
  1. net.ipv4.tcp_keepalive_intvl = 15
  • 设置TCP心跳探测的时间间隔(秒)。
  1. net.ipv4.tcp_max_tw_buckets = 36000
  • 设置系统可以使用的TIME_WAIT套接字的最大数量。
  1. net.ipv4.tcp_tw_reuse = 1
  • 启用TIME_WAIT套接字的重新利用,允许新的套接字使用旧的TIME_WAIT套接字。
  1. net.ipv4.tcp_max_orphans = 327680
  • 设置系统可以同时存在的TCP套接字垃圾回收包裹数的最大数量。
  1. net.ipv4.tcp_orphan_retries = 3
  • 设置系统对于孤立的TCP套接字的重试次数。
  1. net.ipv4.tcp_syncookies = 1
  • 启用TCP SYN cookies保护,用于防止SYN洪泛攻击。
  1. net.ipv4.tcp_max_syn_backlog = 16384
  • 设置新的TCP连接的半连接数(半连接队列)的最大长度。
  1. net.ipv4.ip_conntrack_max = 65536
  • 设置系统可以创建的网络连接跟踪表项的最大数量。
  1. net.ipv4.tcp_timestamps = 0
  • 关闭TCP时间戳功能,用于提供更好的安全性。
  1. net.core.somaxconn = 16384
  • 设置系统核心层的连接队列的最大值。
  1. net.ipv6.conf.all.disable_ipv6 = 0
  • 启用IPv6协议。
  1. net.ipv6.conf.default.disable_ipv6 = 0
  • 启用IPv6协议。
  1. net.ipv6.conf.lo.disable_ipv6 = 0
  • 启用IPv6协议。
  1. net.ipv6.conf.all.forwarding = 1
  • 允许IPv6数据包转发。

配置kubernetes安装源Debian / Ubuntu在配置中添加镜像(注意修改为自己需要的版本号):

#curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.33/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
#cat <<EOF | tee /etc/apt/sources.list.d/kubernetes.list
#deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.tuna.tsinghua.edu.cn/kubernetes/core:/stable:/v1.33/deb/ /
##deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.tuna.tsinghua.edu.cn/kubernetes/addons:/cri-o:/stable:/v1.33/deb/ /
#EOF
#安装必要应用:
#apt-get update
#apt-get install -y kubelet kubeadm kubectl
#systemctl enable kubelet && systemctl start kubelet
#如安装指定版本
#apt install kubelet=1.33.0-1.1 kubeadm=1.33.0-1.1 kubectl=1.33.0-1.1

#阿里源
apt-get update && apt-get install -y apt-transport-https
curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.32/deb/Release.key |  gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.32/deb/ /" |
    tee /etc/apt/sources.list.d/kubernetes.list

#如安装指定版本
apt-get update
apt install -y kubelet=1.32.4-1.1  kubeadm=1.32.4-1.1  kubectl=1.32.4-1.1 
systemctl enable kubelet && systemctl start kubelet

安装Containerd作为Runtime

#https://github.com/containernetworking/plugins/releases/
wget https://github.com/containernetworking/plugins/releases/download/v1.7.1/cni-plugins-linux-amd64-v1.7.1.tgz
#创建cni插件所需目录
mkdir -p /etc/cni/net.d /opt/cni/bin
#解压cni二进制包
tar -xvf cni-plugins-linux-amd64-v*.tgz -C /opt/cni/bin/

#https://github.com/containerd/containerd/releases/
wget https://github.com/containerd/containerd/releases/download/v2.0.0/containerd-2.0.0-linux-amd64.tar.gz

#解压
tar -xzf containerd-*-linux-amd64.tar.gz -C /usr/local/

创建服务启动文件

cat > /etc/systemd/system/containerd.service <<EOF
[Unit]
Description=containerd container runtime
Documentation=https://containerd.io
After=network.target local-fs.target

[Service]
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/local/bin/containerd
Type=notify
Delegate=yes
KillMode=process
Restart=always
RestartSec=5
LimitNPROC=infinity
LimitCORE=infinity
LimitNOFILE=infinity
TasksMax=infinity
OOMScoreAdjust=-999

[Install]
WantedBy=multi-user.target
EOF

参数解释:
#这是一个用于启动containerd容器运行时的systemd unit文件。下面是对该文件不同部分的详细解释:
#[Unit]
#Description=containerd container runtime
#描述该unit的作用是作为containerd容器运行时。
#Documentation=https://containerd.io
#指向容器运行时的文档的URL。
#After=network.targetlocal-fs.target
#定义了在哪些依赖项之后该unit应该被启动。在网络和本地文件系统加载完成后启动,确保了容器运行时在这些依赖项可用时才会启动。
#[Service]
#ExecStartPre=-/sbin/modprobe overlay
#在启动containerd之前执行的命令。这里的命令是尝试加载内核的overlay模块,如果失败则忽略错误继续执行下面的命令。
#ExecStart=/usr/local/bin/containerd
#实际执行的命令,用于启动containerd容器运行时。
#Type=notify
#指定服务的通知类型。这里使用notify类型,表示当服务就绪时会通过通知的方式告知systemd。
#Delegate=yes
#允许systemd对此服务进行重启和停止操作。
#KillMode=process
#在终止容器运行时时使用的kill模式。这里使用process模式,表示通过终止进程来停止容器运行时。
#Restart=always
#定义了当容器运行时终止后的重启策略。这里设置为always,表示无论何时终止容器运行时,都会自动重新启动。
#RestartSec=5
#在容器运行时终止后重新启动之前等待的秒数。
#LimitNPROC=infinity
#指定容器运行时可以使用的最大进程数量。这里设置为无限制。
#LimitCORE=infinity
#指定容器运行时可以使用的最大CPU核心数量。这里设置为无限制。
#LimitNOFILE=infinity
#指定容器运行时可以打开的最大文件数。这里设置为无限制。
#TasksMax=infinity
#指定容器运行时可以创建的最大任务数。这里设置为无限制。
#OOMScoreAdjust=-999
#指定容器运行时的OOM(Out-Of-Memory)分数调整值。负数值表示容器运行时的优先级较高。
#[Install]
#WantedBy=multi-user.target
#定义了服务的安装位置。这里指定为multi-user.target,表示将服务安装为多用户模式下的启动项。

配置Containerd所需的模块

cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF

参数解释:

  • containerd是一个容器运行时,用于管理和运行容器。它支持多种不同的参数配置来自定义容器运行时的行为和功能。
  1. overlay:overlay是容器默认使用的存储驱动,它提供了一种轻量级的、可堆叠的、逐层增量的文件系统。它通过在现有文件系统上叠加文件系统层来创建容器的文件系统视图。每个容器可以有自己的一组文件系统层,这些层可以共享基础镜像中的文件,并在容器内部进行修改。使用overlay可以有效地使用磁盘空间,并使容器更加轻量级。

  2. br_netfilter:br_netfilter是Linux内核提供的一个网络过滤器模块,用于在容器网络中进行网络过滤和NAT转发。当容器和主机之间的网络通信需要进行DNAT或者SNAT时,br_netfilter模块可以将IP地址进行转换。它还可以提供基于iptables规则的网络过滤功能,用于限制容器之间或容器与外部网络之间的通信。

这些参数可以在containerd的配置文件或者命令行中指定。例如,可以通过设置–storage-driver参数来选择使用overlay作为存储驱动,通过设置–iptables参数来启用或禁用br_netfilter模块。具体的使用方法和配置细节可以参考containerd的官方文档。

加载模块

systemctl restart systemd-modules-load.service

参数解释:

  • systemctl: 是Linux系统管理服务的命令行工具,可以管理systemd init系统。
  • restart: 是systemctl命令的一个选项,用于重新启动服务。
  • systemd-modules-load.service: 是一个系统服务,用于加载内核模块。

将上述参数结合在一起来解释systemctl restart systemd-modules-load.service的含义:
这个命令用于重新启动系统服务systemd-modules-load.service,它是负责加载内核模块的服务。在重新启动该服务后,系统会重新加载所有的内核模块。

配置Containerd所需的内核

cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward  = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF

#加载内核
sysctl --system

参数解释:
这些参数是Linux操作系统中用于网络和网络桥接设置的参数。

  • net.bridge.bridge-nf-call-iptables:这个参数控制网络桥接设备是否调用iptables规则处理网络数据包。当该参数设置为1时,网络数据包将被传递到iptables进行处理;当该参数设置为0时,网络数据包将绕过iptables直接传递。默认情况下,这个参数的值是1,即启用iptables规则处理网络数据包。

  • net.ipv4.ip_forward:这个参数用于控制是否启用IP转发功能。IP转发使得操作系统可以将接收到的数据包从一个网络接口转发到另一个网络接口。当该参数设置为1时,启用IP转发功能;当该参数设置为0时,禁用IP转发功能。在网络环境中,通常需要启用IP转发功能来实现不同网络之间的通信。默认情况下,这个参数的值是0,即禁用IP转发功能。

  • net.bridge.bridge-nf-call-ip6tables:这个参数与net.bridge.bridge-nf-call-iptables类似,但是它用于IPv6数据包的处理。当该参数设置为1时,IPv6数据包将被传递到ip6tables进行处理;当该参数设置为0时,IPv6数据包将绕过ip6tables直接传递。默认情况下,这个参数的值是1,即启用ip6tables规则处理IPv6数据包。

这些参数的值可以通过修改操作系统的配置文件(通常是’/etc/sysctl.conf’)来进行设置。修改完成后,需要使用’sysctl -p’命令重载配置文件使参数生效。

参数解释:
这段代码是用于修改并配置containerd的参数。

  1. 首先使用命令mkdir -p /etc/containerd创建/etc/containerd目录,如果该目录已存在,则不进行任何操作。
  2. 使用命令containerd config default | tee /etc/containerd/config.toml创建默认配置文件,并将输出同时传递给/etc/containerd/config.toml文件。
  3. 使用sed命令修改/etc/containerd/config.toml文件,将SystemdCgroup参数的值从false改为true。-i参数表示直接在原文件中进行编辑。
  4. 使用cat命令结合grep命令查看/etc/containerd/config.toml文件中SystemdCgroup参数的值是否已修改为true。
  5. 使用sed命令修改/etc/containerd/config.toml文件,将registry.k8s.io的地址替换为m.daocloud.io/registry.k8s.io。-i参数表示直接在原文件中进行编辑。
  6. 使用cat命令结合grep命令查看/etc/containerd/config.toml文件中sandbox_image参数的值是否已修改为m.daocloud.io/registry.k8s.io。
  7. 使用sed命令修改/etc/containerd/config.toml文件,将config_path参数的值从””改为”/etc/containerd/certs.d”。-i参数表示直接在原文件中进行编辑。
  8. 使用cat命令结合grep命令查看/etc/containerd/config.toml文件中certs.d参数的值是否已修改为/etc/containerd/certs.d。
  9. 使用mkdir命令创建/etc/containerd/certs.d/docker.io目录,如果目录已存在,则不进行任何操作。-p参数表示创建目录时,如果父级目录不存在,则自动创建父级目录。
  10. 最后,使用cat重定向操作符将内容写入/etc/containerd/certs.d/docker.io/hosts.toml文件。该文件会配置加速器,其中server参数设置为”https://docker.io",host参数设置为"https://hub-mirror.c.163.com",并添加capabilities参数。

#创建cni插件所需目录
mkdir -p /etc/cni/net.d /opt/cni/bin
#解压cni二进制包
tar xf cni-plugins-linux-amd64-v*.tgz -C /opt/cni/bin/
mkdir -p /etc/containerd

创建Containerd的配置文件

#创建默认配置文件
containerd config default | tee /etc/containerd/config.toml

#修改Containerd的配置文件

sed -i -e "s#SystemdCgroup\ \=\ false#SystemdCgroup\ \=\ true#g" /etc/containerd/config.toml
cat /etc/containerd/config.toml | grep SystemdCgroup

#沙箱pause镜像
sed -i "s#registry.k8s.io#registry.aliyuncs.com/google_containers#g" /etc/containerd/config.toml
cat /etc/containerd/config.toml | grep sandbox

配置加速器

cat /etc/containerd/config.toml | grep certs.d -C 5

  [plugins.'io.containerd.cri.v1.images'.pinned_images]
   sandbox = 'registry.aliyuncs.com/chenby/pause:3.10'

  [plugins.'io.containerd.cri.v1.images'.registry]
   config_path = '/etc/containerd/certs.d'

  [plugins.'io.containerd.cri.v1.images'.image_decryption]
   key_model = 'node'

 [plugins.'io.containerd.cri.v1.runtime']
mkdir /etc/containerd/certs.d/docker.io -pv
cat > /etc/containerd/certs.d/docker.io/hosts.toml << EOF
server = "https://docker.io"

[host."https://docker.1ms.run"]
  capabilities = ["pull", "resolve"]
[host."https://dockerproxy.com/"]
  capabilities = ["pull", "resolve"]
EOF
  • SystemdCgroup参数是containerd中的一个配置参数,用于设置containerd在运行过程中使用的Cgroup(控制组)路径。Containerd使用SystemdCgroup参数来指定应该使用哪个Cgroup来跟踪和管理容器的资源使用。
  • Cgroup是Linux内核提供的一种资源隔离和管理机制,可以用于限制、分配和监控进程组的资源使用。使用Cgroup,可以将容器的资源限制和隔离,以防止容器之间的资源争用和不公平的竞争。
  • 通过设置SystemdCgroup参数,可以确保containerd能够找到正确的Cgroup路径,并正确地限制和隔离容器的资源使用,确保容器可以按照预期的方式运行。如果未正确设置SystemdCgroup参数,可能会导致容器无法正确地使用资源,或者无法保证资源的公平分配和隔离。

SystemdCgroup参数的作用是为了确保containerd能够正确地管理容器的资源使用,以实现资源的限制、隔离和公平分配。

启动并设置为开机启动

systemctl daemon-reload
#用于重新加载systemd管理的单位文件。当你新增或修改了某个单位文件(如.service文件、.socket文件等),需要运行该命令来刷新systemd对该文件的配置。
systemctl enable --now containerd.service
#启用并立即启动docker.service单元。docker.service是Docker守护进程的systemd服务单元。

systemctl stop containerd.service
#停止运行中的docker.service单元,即停止Docker守护进程。

systemctl start containerd.service
#启动docker.service单元,即启动Docker守护进程。

systemctl restart containerd.service
#重启docker.service单元,即重新启动Docker守护进程。

systemctl status containerd.service
#显示docker.service单元的当前状态,包括运行状态、是否启用等信息。

配置crictl客户端连接的运行时位置
#https://github.com/kubernetes-sigs/cri-tools/releases/
wget https://github.com/kubernetes-sigs/cri-tools/releases/download/v1.33.0/crictl-v1.33.0-linux-amd64.tar.gz

#解压
tar xf crictl-v*-linux-amd64.tar.gz -C /usr/bin/
#生成配置文件
cat > /etc/crictl.yaml <<EOF
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF

#测试
systemctl restart containerd
crictl info

#下面是参数crictl的详细解释
#crictl是一个用于与容器运行时通信的命令行工具。它是容器运行时接口(CRI)工具的一个实现,可以对容器运行时进行管理和操作。

  1. runtime-endpoint: unix:///run/containerd/containerd.sock
    #指定容器运行时的终端套接字地址。在这个例子中,指定的地址是unix:///run/containerd/containerd.sock,这是一个Unix域套接字地址。

  2. image-endpoint: unix:///run/containerd/containerd.sock
    #指定容器镜像服务的终端套接字地址。在这个例子中,指定的地址是unix:///run/containerd/containerd.sock,这是一个Unix域套接字地址。

  3. timeout: 10
    #设置与容器运行时通信的超时时间,单位是秒。在这个例子中,超时时间被设置为10秒。

  4. debug:false
    #指定是否开启调式模式。在这个例子中,调式模式被设置为关闭,即false。如果设置为true,则会输出更详细的调试信息。

#这些参数可以根据需要进行修改,以便与容器运行时进行有效的通信和管理。

高可用配置keepalive和haproxy

apt -y install keepalived haproxy

修改haproxy配置文件

(配置文件一样)

#cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak

cat >/etc/haproxy/haproxy.cfg<<"EOF"
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 k8s-master
  bind 0.0.0.0:9443
  bind 127.0.0.1:9443
  mode tcp
  option tcplog
  tcp-request inspect-delay 5s
  default_backend k8s-master


backend 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
  server k8s-master01 192.168.1.21:6443 check
  server k8s-master02 192.168.1.22:6443 check
  server k8s-master03 192.168.1.23:6443 check
EOF

参数
这段配置代码是指定了一个HAProxy负载均衡器的配置。下面对各部分进行详细解释:

  1. global:
  • maxconn 2000: 设置每个进程的最大连接数为2000。
  • ulimit-n 16384: 设置每个进程的最大文件描述符数为16384。
  • log 127.0.0.1 local0 err: 指定日志的输出地址为本地主机的127.0.0.1,并且只记录错误级别的日志。
  • stats timeout 30s: 设置查看负载均衡器统计信息的超时时间为30秒。
  1. defaults:
  • log global: 使默认日志与global部分相同。
  • mode http: 设定负载均衡器的工作模式为HTTP模式。
  • option httplog: 使负载均衡器记录HTTP协议的日志。
  • timeout connect 5000: 设置与后端服务器建立连接的超时时间为5秒。
  • timeout client 50000: 设置与客户端的连接超时时间为50秒。
  • timeout server 50000: 设置与后端服务器连接的超时时间为50秒。
  • timeout http-request 15s: 设置处理HTTP请求的超时时间为15秒。
  • timeout http-keep-alive 15s: 设置保持HTTP连接的超时时间为15秒。
  1. frontend monitor-in:
  • bind *:33305: 监听所有IP地址的33305端口。
  • mode http: 设定frontend的工作模式为HTTP模式。
  • option httplog: 记录HTTP协议的日志。
  • monitor-uri /monitor: 设置监控URI为/monitor。
  1. frontend k8s-master:
  • bind 0.0.0.0:9443: 监听所有IP地址的9443端口。
  • bind 127.0.0.1:9443: 监听本地主机的9443端口。
  • mode tcp: 设定frontend的工作模式为TCP模式。
  • option tcplog: 记录TCP协议的日志。
  • tcp-request inspect-delay 5s: 设置在接收到请求后延迟5秒进行检查。
  • default_backend k8s-master: 设置默认的后端服务器组为k8s-master。
  1. backend k8s-master:
  • mode tcp: 设定backend的工作模式为TCP模式。
  • option tcplog: 记录TCP协议的日志。
  • option tcp-check: 启用TCP检查功能。
  • balance roundrobin: 使用轮询算法进行负载均衡。
  • default-server inter 10s downinter 5s rise 2 fall 2 slowstart 60s maxconn 250 maxqueue 256 weight 100: 设置默认的服务器参数。
  • server k8s-master01 192.168.1.21:6443 check: 增加一个名为k8s-master01的服务器,IP地址为192.168.1.21,端口号为6443,并对其进行健康检查。
  • server k8s-master02 192.168.1.22:6443 check: 增加一个名为k8s-master02的服务器,IP地址为192.168.1.22,端口号为6443,并对其进行健康检查。
  • server k8s-master03 192.168.1.23:6443 check: 增加一个名为k8s-master03的服务器,IP地址为192.168.1.23,端口号为6443,并对其进行健康检查。

以上就是这段配置代码的详细解释。它主要定义了全局配置、默认配置、前端监听和后端服务器组的相关参数和设置。通过这些配置,可以实现负载均衡和监控功能。

Master01配置keepalived master节点

#cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak

cat > /etc/keepalived/keepalived.conf << EOF
! Configuration File for keepalived

global_defs {
 router_id LVS_DEVEL
}
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 ens160
 mcast_src_ip 192.168.1.21
 virtual_router_id 51
 priority 100
 nopreempt
 advert_int 2
 authentication {
  auth_type PASS
  auth_pass K8SHA_KA_AUTH
 }
 virtual_ipaddress {
  192.168.1.36
 }
 track_script {
  chk_apiserver
} }

EOF

参数
这是一个用于配置keepalived的配置文件。下面是对每个部分的详细解释:

  • global_defs部分定义了全局参数。
  • router_id参数指定了当前路由器的标识,这里设置为”LVS_DEVEL”。
  • vrrp_script部分定义了一个VRRP脚本。chk_apiserver是脚本的名称,
  • script参数指定了脚本的路径。该脚本每5秒执行一次,返回值为0表示服务正常,返回值为1表示服务异常。
  • weight参数指定了根据脚本返回的值来调整优先级,这里设置为-5。
  • fall参数指定了失败阈值,当连续2次脚本返回值为1时认为服务异常。
  • rise参数指定了恢复阈值,当连续1次脚本返回值为0时认为服务恢复正常。
  • vrrp_instance部分定义了一个VRRP实例。VI_1是实例的名称。
  • state参数指定了当前实例的状态,这里设置为MASTER表示当前实例是主节点。
  • interface参数指定了要监听的网卡,这里设置为ens160。
  • mcast_src_ip参数指定了VRRP报文的源IP地址,这里设置为192.168.1.21。
  • virtual_router_id参数指定了虚拟路由器的ID,这里设置为51。
  • priority参数指定了实例的优先级,优先级越高(数值越大)越有可能被选为主节点。
  • nopreempt参数指定了当主节点失效后不要抢占身份,即不要自动切换为主节点。
  • advert_int参数指定了发送广播的间隔时间,这里设置为2秒。
  • authentication部分指定了认证参数
  • auth_type参数指定了认证类型,这里设置为PASS表示使用密码认证,
  • auth_pass参数指定了认证密码,这里设置为K8SHA_KA_AUTH。
  • virtual_ipaddress部分指定了虚拟IP地址,这里设置为192.168.1.36。
  • track_script部分指定了要跟踪的脚本,这里跟踪了chk_apiserver脚本。

Master02配置keepalived backup节点

# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak

cat > /etc/keepalived/keepalived.conf << EOF
! Configuration File for keepalived

global_defs {
    router_id LVS_DEVEL
}
vrrp_script chk_apiserver {
    script "/etc/keepalived/check_apiserver.sh"
    interval 5 
    weight -5
    fall 2
    rise 1

}
vrrp_instance VI_1 {
    state BACKUP
    # 注意网卡名
    interface ens160
    mcast_src_ip 192.168.1.22
    virtual_router_id 51
    priority 80
    nopreempt
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass K8SHA_KA_AUTH
    }
    virtual_ipaddress {
        192.168.1.36
    }
    track_script {
      chk_apiserver 
} }

EOF

Master03配置keepalived backup节点

# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak

cat > /etc/keepalived/keepalived.conf << EOF
! Configuration File for keepalived

global_defs {
    router_id LVS_DEVEL
}
vrrp_script chk_apiserver {
    script "/etc/keepalived/check_apiserver.sh"
    interval 5 
    weight -5
    fall 2
    rise 1

}
vrrp_instance VI_1 {
    state BACKUP
    # 注意网卡名
    interface ens160
    mcast_src_ip 192.168.1.23
    virtual_router_id 51
    priority 50
    nopreempt
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass K8SHA_KA_AUTH
    }
    virtual_ipaddress {
        192.168.1.36
    }
    track_script {
      chk_apiserver 
} }

EOF

参数

这是一个用于配置keepalived的配置文件。下面是对每个部分的详细解释:

  • global_defs部分定义了全局参数。

  • router_id参数指定了当前路由器的标识,这里设置为”LVS_DEVEL”。

  • vrrp_script部分定义了一个VRRP脚本。chk_apiserver是脚本的名称,

  • script参数指定了脚本的路径。该脚本每5秒执行一次,返回值为0表示服务正常,返回值为1表示服务异常。

  • weight参数指定了根据脚本返回的值来调整优先级,这里设置为-5。

  • fall参数指定了失败阈值,当连续2次脚本返回值为1时认为服务异常。

  • rise参数指定了恢复阈值,当连续1次脚本返回值为0时认为服务恢复正常。

  • vrrp_instance部分定义了一个VRRP实例。VI_1是实例的名称。

    • state参数指定了当前实例的状态,这里设置为MASTER表示当前实例是主节点。

    • interface参数指定了要监听的网卡,这里设置为ens160。

    • mcast_src_ip参数指定了VRRP报文的源IP地址,这里设置为192.168.1.21。

    • virtual_router_id参数指定了虚拟路由器的ID,这里设置为51。

    • priority参数指定了实例的优先级,优先级越高(数值越大)越有可能被选为主节点。

    • nopreempt参数指定了当主节点失效后不要抢占身份,即不要自动切换为主节点。

    • advert_int参数指定了发送广播的间隔时间,这里设置为2秒。

    • authentication部分指定了认证参数

      • auth_type参数指定了认证类型,这里设置为PASS表示使用密码认证,
      • auth_pass参数指定了认证密码,这里设置为K8SHA_KA_AUTH。
    • virtual_ipaddress部分指定了虚拟IP地址,这里设置为192.168.1.36。

    • track_script部分指定了要跟踪的脚本,这里跟踪了chk_apiserver脚本。

健康检查脚本配置(lb主机)

cat > /etc/keepalived/check_apiserver.sh << EOF
#!/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
EOF

#给脚本授权

chmod +x /etc/keepalived/check_apiserver.sh

#这段脚本是一个简单的bash脚本,主要用来检查是否有名为haproxy的进程正在运行。
#脚本的主要逻辑如下:

  1. 首先设置一个变量err为0,用来记录错误次数。

  2. 使用一个循环,在循环内部执行以下操作:

    1. 使用pgrep命令检查是否有名为haproxy的进程在运行。如果不存在该进程,将err加1,并暂停1秒钟,然后继续下一次循环。
    2. 如果存在haproxy进程,将err重置为0,并跳出循环。
  3. 检查err的值,如果不为0,表示检查失败,输出一条错误信息并执行“systemctl stop keepalived”命令停止keepalived进程,并退出脚本返回1。

  4. 如果err的值为0,表示检查成功,退出脚本返回0。

  5. 该脚本的主要作用是检查是否存在运行中的haproxy进程,如果无法检测到haproxy进程,将停止keepalived进程并返回错误状态。如果haproxy进程存在,则返回成功状态。这个脚本可能是作为一个健康检查脚本的一部分,在确保haproxy服务可用的情况下,才继续运行其他操作。

启动服务

systemctl daemon-reload
#用于重新加载systemd管理的单位文件。当你新增或修改了某个单位文件(如.service文件、.socket文件等),需要运行该命令来刷新systemd对该文件的配置。
systemctl enable --now haproxy.service
#启用并立即启动haproxy.service单元。haproxy.service是haproxy守护进程的systemd服务单元。
systemctl enable --now keepalived.service
#启用并立即启动keepalived.service单元。keepalived.service是keepalived守护进程的systemd服务单元。
systemctl status haproxy.service
#haproxy.service单元的当前状态,包括运行状态、是否启用等信息。
systemctl status keepalived.service
#keepalived.service单元的当前状态,包括运行状态、是否启用等信息。

初始化安装整改镜像

#查看最新版本有那些镜像
[root@k8s-master01 ~]# kubeadm config images list --image-repository registry.aliyuncs.com/google_containers
registry.aliyuncs.com/google_containers/kube-apiserver:v1.32.3
registry.aliyuncs.com/google_containers/kube-controller-manager:v1.32.3
registry.aliyuncs.com/google_containers/kube-scheduler:v1.32.3
registry.aliyuncs.com/google_containers/kube-proxy:v1.32.3
registry.aliyuncs.com/google_containers/coredns:v1.11.3
registry.aliyuncs.com/google_containers/pause:3.10
registry.aliyuncs.com/google_containers/etcd:3.5.16-0
[root@k8s-master01 ~]#
#只有一个CRI的情况下
kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers
#指定CRI拉取镜像
kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers --cri-socket unix:///var/run/cri-dockerd.sock
kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers --cri-socket unix:///var/run/containerd/containerd.sock

修改初始化配置创建默认配置

kubeadm config print init-defaults > kubeadm-init.yaml

#这是我使用的配置文件

初始化Master01

cat > kubeadm.yaml << EOF
apiVersion: kubeadm.k8s.io/v1beta4
bootstrapTokens:
- groups:
 - system:bootstrappers:kubeadm:default-node-token
 token: abcdef.0123456789abcdef
 ttl: 24h0m0s
 usages:
 - signing
 - authentication
kind: InitConfiguration
localAPIEndpoint:
 advertiseAddress: 192.168.1.21
 bindPort: 6443
nodeRegistration:
 #criSocket: unix:///run/containerd/containerd.sock
 criSocket: unix:///var/run/cri-dockerd.sock
 imagePullPolicy: IfNotPresent
 imagePullSerial: true
 kubeletExtraArgs:
 - name: "node-ip"
 value: "192.168.1.21,fc00::21"
 name: k8s-master01
 taints:
 - effect: PreferNoSchedule
 key: node-role.kubernetes.io/master
timeouts:
 controlPlaneComponentHealthCheck: 4m0s
 discovery: 5m0s
 etcdAPICall: 2m0s
 kubeletHealthCheck: 4m0s
 kubernetesAPICall: 1m0s
 tlsBootstrap: 5m0s
 upgradeManifests: 5m0s
---
apiServer:
 certSANs:
 - x.oiox.cn
 - z.oiox.cn
 - k8s-master01
 - k8s-master02
 - k8s-master03
 - 192.168.1.21
 - 192.168.1.22
 - 192.168.1.23
 - 192.168.1.24
 - 192.168.1.25
 - 192.168.1.26
 - 192.168.1.27
 - 192.168.1.28
 - 192.168.1.29
 - 127.0.0.1
 timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta4
caCertificateValidityPeriod: 87600h0m0s
certificateValidityPeriod: 8760h0m0s
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
encryptionAlgorithm: RSA-2048
etcd:
 local:
 dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: 1.32.3
networking:
 dnsDomain: cluster.local
 podSubnet: 172.16.0.0/12
 serviceSubnet: 10.96.0.0/16
proxy: {}
scheduler: {}
controlPlaneEndpoint: "192.168.1.36:9443"
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
---
apiVersion: kubelet.config.k8s.io/v1beta1
authentication:
 anonymous:
 enabled: false
 webhook:
 cacheTTL: 0s
 enabled: true
 x509:
 clientCAFile: /etc/kubernetes/pki/ca.crt
authorization:
 mode: Webhook
 webhook:
 cacheAuthorizedTTL: 0s
 cacheUnauthorizedTTL: 0s
clusterDNS:
- 10.96.0.10
clusterDomain: cluster.local
cpuManagerReconcilePeriod: 0s
evictionPressureTransitionPeriod: 0s
fileCheckFrequency: 0s
healthzBindAddress: 127.0.0.1
healthzPort: 10248
httpCheckFrequency: 0s
imageMinimumGCAge: 0s
kind: KubeletConfiguration
cgroupDriver: systemd
logging: {}
memorySwap: {}
nodeStatusReportFrequency: 0s
nodeStatusUpdateFrequency: 0s
rotateCertificates: true
runtimeRequestTimeout: 0s
shutdownGracePeriod: 0s
shutdownGracePeriodCriticalPods: 0s
staticPodPath: /etc/kubernetes/manifests
streamingConnectionIdleTimeout: 0s
syncFrequency: 0s
volumeStatsAggPeriod: 0s
EOF

开始初始化部署

kubeadm init --config kubeadm.yaml

配置证书

# 使用脚本将这如果你睡拷贝到其他maser节点
USER=root
CONTROL_PLANE_IPS="192.168.1.22 192.168.1.23"
for host in ${CONTROL_PLANE_IPS}; do
    scp /etc/kubernetes/pki/ca.crt "${USER}"@$host:
    scp /etc/kubernetes/pki/ca.key "${USER}"@$host:
    scp /etc/kubernetes/pki/sa.key "${USER}"@$host:
    scp /etc/kubernetes/pki/sa.pub "${USER}"@$host:
    scp /etc/kubernetes/pki/front-proxy-ca.crt "${USER}"@$host:
    scp /etc/kubernetes/pki/front-proxy-ca.key "${USER}"@$host:
    scp /etc/kubernetes/pki/etcd/ca.crt "${USER}"@$host:etcd-ca.crt
    # 如果你正使用外部 etcd,忽略下一行
    scp /etc/kubernetes/pki/etcd/ca.key "${USER}"@$host:etcd-ca.key
done

# 在其他的maser上面执行 ,将证书文件放入所需目录
USER=root
mkdir -p /etc/kubernetes/pki/etcd
mv /${USER}/ca.crt /etc/kubernetes/pki/
mv /${USER}/ca.key /etc/kubernetes/pki/
mv /${USER}/sa.pub /etc/kubernetes/pki/
mv /${USER}/sa.key /etc/kubernetes/pki/
mv /${USER}/front-proxy-ca.crt /etc/kubernetes/pki/
mv /${USER}/front-proxy-ca.key /etc/kubernetes/pki/
mv /${USER}/etcd-ca.crt /etc/kubernetes/pki/etcd/ca.crt
# 如果你正使用外部 etcd,忽略下一行
mv /${USER}/etcd-ca.key /etc/kubernetes/pki/etcd/ca.key

初始化Master2

# 在maser02上执行操作,将加入控制节点
kubeadm config print join-defaults > kubeadm-join-master-02.yaml
cat > kubeadm-join-master-02.yaml << EOF
apiVersion: kubeadm.k8s.io/v1beta4
caCertPath: /etc/kubernetes/pki/ca.crt
discovery:
  bootstrapToken:
    apiServerEndpoint: 192.168.1.36:9443
    token: abcdef.0123456789abcdef
    caCertHashes:
    - "sha256:1a6196cd63edf4e78f39d34d448d6333d25e1ad0ff650839260fc7df25ec8a92"
    unsafeSkipCAVerification: true
  tlsBootstrapToken: abcdef.0123456789abcdef
kind: JoinConfiguration
controlPlane:
  localAPIEndpoint:
    advertiseAddress: "192.168.1.22"
    bindPort: 6443
nodeRegistration:
  # criSocket: unix:///run/containerd/containerd.sock
  criSocket: unix:///var/run/cri-dockerd.sock
  imagePullPolicy: IfNotPresent
  imagePullSerial: true
  name: k8s-master02
  taints:
  - effect: PreferNoSchedule
    key: node-role.kubernetes.io/master
  kubeletExtraArgs:
  - name: "node-ip"
    value: "192.168.1.22,fc00::22"
timeouts:
  controlPlaneComponentHealthCheck: 4m0s
  discovery: 5m0s
  etcdAPICall: 2m0s
  kubeletHealthCheck: 4m0s
  kubernetesAPICall: 1m0s
  tlsBootstrap: 5m0s
  upgradeManifests: 5m0s
EOF

kubeadm join --config=kubeadm-join-master-02.yaml

初始化Master3

# 在maser03上执行操作,将加入控制节点
kubeadm config print join-defaults > kubeadm-join-master-03.yaml
cat > kubeadm-join-master-03.yaml << EOF
apiVersion: kubeadm.k8s.io/v1beta4
caCertPath: /etc/kubernetes/pki/ca.crt
discovery:
  bootstrapToken:
    apiServerEndpoint: 192.168.1.36:9443
    token: abcdef.0123456789abcdef
    caCertHashes:
    - "sha256:1a6196cd63edf4e78f39d34d448d6333d25e1ad0ff650839260fc7df25ec8a92"
    unsafeSkipCAVerification: true
  tlsBootstrapToken: abcdef.0123456789abcdef
kind: JoinConfiguration
controlPlane:
  localAPIEndpoint:
    advertiseAddress: "192.168.1.23"
    bindPort: 6443
nodeRegistration:
  # criSocket: unix:///run/containerd/containerd.sock
  criSocket: unix:///var/run/cri-dockerd.sock
  imagePullPolicy: IfNotPresent
  imagePullSerial: true
  name: k8s-master03
  taints:
  - effect: PreferNoSchedule
    key: node-role.kubernetes.io/master
  kubeletExtraArgs:
  - name: "node-ip"
    value: "192.168.1.23,fc00::23"
timeouts:
  controlPlaneComponentHealthCheck: 4m0s
  discovery: 5m0s
  etcdAPICall: 2m0s
  kubeletHealthCheck: 4m0s
  kubernetesAPICall: 1m0s
  tlsBootstrap: 5m0s
  upgradeManifests: 5m0s
EOF

kubeadm join --config=kubeadm-join-master-03.yaml

初始化Node1

# 在node01上执行操作,将加入工作节点
kubeadm config print join-defaults > kubeadm-join-node-01.yaml
cat > kubeadm-join-node-01.yaml << EOF
apiVersion: kubeadm.k8s.io/v1beta4
caCertPath: /etc/kubernetes/pki/ca.crt
discovery:
  bootstrapToken:
    apiServerEndpoint: 192.168.1.36:9443
    token: abcdef.0123456789abcdef
    caCertHashes:
    - "sha256:1a6196cd63edf4e78f39d34d448d6333d25e1ad0ff650839260fc7df25ec8a92"
    unsafeSkipCAVerification: true
  tlsBootstrapToken: abcdef.0123456789abcdef
kind: JoinConfiguration
nodeRegistration:
  # criSocket: unix:///run/containerd/containerd.sock
  criSocket: unix:///var/run/cri-dockerd.sock
  imagePullPolicy: IfNotPresent
  imagePullSerial: true
  name: k8s-node01
  taints: null
  kubeletExtraArgs:
  - name: "node-ip"
    value: "192.168.1.24,fc00::24"
timeouts:
  controlPlaneComponentHealthCheck: 4m0s
  discovery: 5m0s
  etcdAPICall: 2m0s
  kubeletHealthCheck: 4m0s
  kubernetesAPICall: 1m0s
  tlsBootstrap: 5m0s
  upgradeManifests: 5m0s
EOF

kubeadm join --config=kubeadm-join-node-01.yaml

初始化Node2

# 在node02上执行操作,将加入工作节点
kubeadm config print join-defaults > kubeadm-join-node-02.yaml
cat > kubeadm-join-node-02.yaml << EOF
apiVersion: kubeadm.k8s.io/v1beta4
caCertPath: /etc/kubernetes/pki/ca.crt
discovery:
  bootstrapToken:
    apiServerEndpoint: 192.168.1.36:9443
    token: abcdef.0123456789abcdef
    caCertHashes:
    - "sha256:1a6196cd63edf4e78f39d34d448d6333d25e1ad0ff650839260fc7df25ec8a92"
    unsafeSkipCAVerification: true
  tlsBootstrapToken: abcdef.0123456789abcdef
kind: JoinConfiguration
nodeRegistration:
  # criSocket: unix:///run/containerd/containerd.sock
  criSocket: unix:///var/run/cri-dockerd.sock
  imagePullPolicy: IfNotPresent
  imagePullSerial: true
  name: k8s-node02
  taints: null
  kubeletExtraArgs:
  - name: "node-ip"
    value: "192.168.1.25,fc00::25"
timeouts:
  controlPlaneComponentHealthCheck: 4m0s
  discovery: 5m0s
  etcdAPICall: 2m0s
  kubeletHealthCheck: 4m0s
  kubernetesAPICall: 1m0s
  tlsBootstrap: 5m0s
  upgradeManifests: 5m0s
EOF

kubeadm join --config=kubeadm-join-node-02.yaml

查看集群状态

kubectl get no -O wide 

文章作者: IW
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 IW !
  目录