003-基于Rocky9.3系统使用kubeadm安装k8s1.29集群

  1. 1、集群规划
  2. 2、集群基础环境配置
    1. 2.1 主机名设置
    2. 2.2 修改hosts文件
    3. 2.3 修改终端颜色
    4. 2.4 更换系统软件源
    5. 2.5 修改防火墙
    6. 2.6 禁用 Selinux
    7. 2.7 设置时区
    8. 2.8 集群时间同步设置
    9. 2.9 修改系统最大打开文件数
    10. 2.10 安装必要的库和修改 sysctl.conf 内核参数配置
    11. 2.11 关闭 swap 分区
  3. 3、集群各个节点安装Docker服务
    1. 3.1 添加 docker-ce yum 源
    2. 3.2 开启Docker服务
    3. 3.3 配置 daemon.json
    4. 3.4 创建 Docker 服务的自定义配置目录
    5. 3.5 重新加载 Docker 配置
  4. 4、安装 cri-docker
    1. 4.1 下载 cri-docker
    2. 4.2 解压 cri-docker
    3. 4.3 下载并修改 cri-docker 配置文件
      1. 4.3.1 下载 cri-docker 配置文件
      2. 4.3.2 修改 cri-docker 配置文件
    4. 4.4 启动 cri-docker 对应服务
  5. 5、使用 kubeadm 基于 Docker Runtime 部署 kubernetes 集群
    1. 5.1 配置阿里云K8S源
    2. 5.2 安装K8S集群管理工具
    3. 5.3 配置k8s Cgoup控制组
    4. 5.4 配置kubelet自启动
    5. 5.5 初始化集群
      1. 5.5.1 打印 master 节点所需的镜像文件
      2. 5.5.2 打印集群初始化配置文件
      3. 5.5.3 修改集群初始化配置文件
      4. 5.5.4 使用以上配置文件进行集群初始化
      5. 5.5.5 配置环境变量
      6. 5.5.6 所有woker节点加入到集群中
  6. 6、部署网络插件
    1. 6.1 calico安装
    2. 6.2 创建calico网络
    3. 6.3 验证集群可用性
    4. 6.4 查看集群健康情况
    5. 6.5 查看kubernetes集群pod运行情况
    6. 6.6 worker节点配置
  7. 7、K8S集群的启停管理
    1. 7.1 停止K8S集群
    2. 7.2 启动K8S集群

系统环境

RockyLinux:9.3

K8s版本:1.29

Docker版本:27.4.1

软件包来源

系统镜像下载官网:https://rockylinux.org/zh-CN/download

镜像下载地址:https://dl.rockylinux.org/vault/rocky/9.3/isos/x86_64/

安装镜像文件:Rocky-9.3-x86_64-minimal.iso

1、集群规划

基于 Linux Rocky 9.3 系统使用 kubeadm 搭建一主两从的 k8s 集群。

IP地址 主机名 角色 系统版本 CPU/内存/磁盘
192.168.6.223 k8s-master01 管理节点 Rocky Linux 9.3 2U/4G/100G
192.168.6.225 k8s-node01 部署节点 Rocky Linux 9.3 2U/4G/100G
192.168.6.226 k8s-node02 部署节点 Rocky Linux 9.3 2U/4G/100G

2、集群基础环境配置

2.1 主机名设置

设置集群中各个节点的主机名

master01 节点执行

hostnamectl set-hostname k8s-master01

node01 节点执行

hostnamectl set-hostname k8s-node01

node02 节点执行

hostnamectl set-hostname k8s-node02

2.2 修改hosts文件

配置集群各节点 hostname 和 ip 的映射

在 master01、node01、node02 三台服务器分别执行

cat >> /etc/hosts << "EOF"
192.168.6.223 k8s-master01
192.168.6.225 k8s-node01
192.168.6.226 k8s-node02
EOF

2.3 修改终端颜色

这里只是修改shell终端显示文本的颜色,非必要步骤。

在 master01、node01、node02 三台服务器分别执行

cat << EOF >> ~/.bashrc
PS1="\[\e[37;47m\][\[\e[32;47m\]\u\[\e[34;47m\]@\h \[\e[36;47m\]\w\[\e[0m\]]\\$ "
EOF

# 让修改立即见效
source ~/.bashrc

命令解析:这段命令用于修改当前用户的 Bash Shell 提示符PS1),并将其设置写入到 ~/.bashrc 文件中,以便在每次登录或启动 Shell 时自动加载该配置。

PS1="..."
定义 Shell 的主提示符格式(Prompt String 1),即你在终端中输入命令时显示的提示符。

最终效果如下:

终端颜色修改

2.4 更换系统软件源

在 master01、node01、node02 三台服务器分别执行

# 更新源
sed -e 's|^mirrorlist=|#mirrorlist=|g' \
    -e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.aliyun.com/rockylinux|g' \
    -i.bak /etc/yum.repos.d/[Rr]ocky*.repo
    

# 刷新dnf缓存
dnf makecache

# 验证源更新
dnf repolist
  • 命令解析

    # 使用 sed 命令修改 Rocky Linux 的 YUM/DNF 源配置文件,切换到阿里云的镜像源。
    sed -e 's|^mirrorlist=|#mirrorlist=|g' \
        -e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.aliyun.com/rockylinux|g' \
        -i.bak /etc/yum.repos.d/[Rr]ocky*.repo
        
    # 将以 mirrorlist= 开头的行注释掉(在前面加 #)
    -e 's|^mirrorlist=|#mirrorlist=|g'
    
    # 将以 #baseurl= 开头并指向默认 Rocky Linux 源的行取消注释,并替换为阿里云镜像源 URL。
    's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.aliyun.com/rockylinux|g'
    
    # -i.bak:直接修改文件,并为原文件创建备份(扩展名为 .bak)。
    # 修改 /etc/yum.repos.d/ 目录下所有以 rocky 或 Rocky 开头的 .repo 文件。
    # 修改完成后,原始文件会被备份为 .bak 文件。
    -i.bak /etc/yum.repos.d/[Rr]ocky*.repo
    
    
    
    # 更新本地缓存,确保系统可以快速查询软件包信息。
    dnf makecache

2.5 修改防火墙

防火墙修改 firewalld 为 iptables

在 master01、node01、node02 三台服务器分别执行

systemctl stop firewalld
systemctl disable firewalld
yum -y install iptables-services
systemctl start iptables
iptables -F
systemctl enable iptables
service iptables save
  • 命令解析

    # 停止运行 firewalld
    systemctl stop firewalld
    
    # 禁止 firewalld 开机自启
    systemctl disable firewalld
    
    # 安装 iptables 服务,用于管理 Linux 的防火墙规则
    yum -y install iptables-services
    
    # 使防火墙规则立即生效,并开始运行 iptables 防火墙服务。
    systemctl start iptables
    
    # 删除当前的防火墙规则,通常用于重置或清理防火墙规则。
    iptables -F
    
    # 设置 iptables 服务开机自启动,确保服务器重启后,iptables 服务会自动加载防火墙规则。
    systemctl enable iptables
    
    # 将当前 iptables 的规则配置保存到文件中(通常是 /etc/sysconfig/iptables),以便在系统重启或 iptables 服务重新启动后,能够自动加载保存的规则。
    service iptables save

2.6 禁用 Selinux

在 master01、node01、node02 三台服务器分别执行

setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
grubby --update-kernel ALL --args selinux=0
  • 命令解析

    # 将 SELinux 的模式设置为 Permissive(宽容模式)。
    # 0:表示设置为 Permissive 模式,此模式下 SELinux 不会强制执行安全策略,而是记录违规日志。
    # 1:表示 Enforcing 模式,此模式下 SELinux 会强制执行安全策略。
    setenforce 0
    
    # 修改 SELinux 配置文件 /etc/selinux/config,将 SELINUX 设置为 disabled。永久禁用 SELinux,即使系统重启也不会再启用。
    sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
    
    # 通过 grubby 工具将 selinux=0 参数添加到所有内核启动配置中。
    grubby --update-kernel ALL --args selinux=0
    grubby --info DEFAULT
    
    # 查看是否禁用,
    grubby --info DEFAULT
    # 回滚内核层禁用操作,、
    grubby --update-kernel ALL --remove-args selinux
  • 修改完成后重启系统

    reboot

2.7 设置时区

在 master01、node01、node02 三台服务器分别执行

timedatectl set-timezone Asia/Shanghai

2.8 集群时间同步设置

在 master01、node01、node02 三台服务器分别执行

timedatectl
dnf install -y chrony
systemctl enable chronyd.service
systemctl restart chronyd.service
systemctl status chronyd.service
vim /etc/chrony.conf

# 修改完chrony配置后,重启chrony服务
systemctl enable chronyd  --now
  • chrony配置内容如下

    # 添加阿里云NTP服务器
    pool ntp1.aliyun.com iburst
    pool ntp2.aliyun.com iburst
    pool cn.pool.ntp.org iburst
        
    # 允许指定网段访问此时间服务器,不然只允许本地网络
    allow 192.168.0.0/16

    chrony配置内容

  • 命令解析

    # 检查时区和时间
    timedatectl
    
    # 安装chrony进行时间同步,ntpdate在Rocky 9中不再支持
    dnf install -y chrony
    
    # 启用chronyd服务
    systemctl enable chronyd.service
    
    # 重启chronyd服务
    systemctl restart chronyd.service
    
    # 查看chronyd服务状态
    systemctl status chronyd.service

2.9 修改系统最大打开文件数

在 master01、node01、node02 三台服务器分别执行

/etc/security/limits.conf 文件的末尾追加以下内容

*	soft	nofile	65535
*	hard	nofile	65535

目的:修改最大打开文件数限制

2.10 安装必要的库和修改 sysctl.conf 内核参数配置

在 master01、node01、node02 三台服务器分别执行

dnf install -y epel-release
dnf install -y bridge-utils
modprobe br_netfilter
echo 'br_netfilter' >> /etc/modules-load.d/bridge.conf

cat >> /etc/sysctl.conf <<EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_tw_buckets = 20480
net.ipv4.tcp_max_syn_backlog = 20480
net.core.netdev_max_backlog = 262144
net.ipv4.tcp_fin_timeout = 20
EOF

# 重新加载 /etc/sysctl.conf 中的所有内核参数配置,并使其立即生效。
sysctl -p
  • 命令解释

    # 安装 EPEL(Extra Packages for Enterprise Linux) 仓库的 Release 包。
    # EPEL 是由 Fedora 社区维护的一个软件仓库,提供许多额外的软件包,这些包在默认的 RHEL(或其衍生版如 CentOS、Rocky Linux 等)中没有包含。
    yum install -y epel-release
    
    # 安装 bridge-utils 软件包。
    # bridge-utils 是一个 Linux 工具集,用于创建和管理网络桥接(bridging)。
    yum install -y bridge-utils
    
    # 加载 br_netfilter 内核模块。
    # 该模块用于启用网络桥接(bridge)时的流量过滤功能。
    # 允许通过桥接的网络流量被 iptables 规则管理。
    # 在容器或虚拟化环境中,确保桥接网络的流量可以被正确处理。
    modprobe br_netfilter
    
    # 将 br_netfilter 模块名称添加到 /etc/modules-load.d/bridge.conf 文件中。
    # 配置系统在启动时自动加载 br_netfilter 模块。
    echo 'br_netfilter' >> /etc/modules-load.d/bridge.conf
    
    # 向 /etc/sysctl.conf 文件添加配置,使桥接流量可以通过 iptables 规则管理。
    # 启用桥接网络上的 IPv4 流量通过 iptables 的规则处理。
    net.bridge.bridge-nf-call-iptables=1
    
    # 向 /etc/sysctl.conf 文件添加配置,使桥接流量中的 IPv6 流量可以通过 ip6tables 规则管理。
    net.bridge.bridge-nf-call-ip6tables=1
    
    # 向 /etc/sysctl.conf 文件添加配置,启用 IP 转发功能。
    # 用途:在容器网络或 Kubernetes 集群中,允许跨子网通信。
    net.ipv4.ip_forward=1
    
    # 启用 TCP SYN Cookie 技术,用于防范 SYN Flood 攻击。
    # 在服务器收到大量的 TCP SYN 请求但无法分配足够资源时,启用 SYN Cookie 可通过一种临时编码方式验证连接合法性,避免资源耗尽。
    net.ipv4.tcp_syncookies = 1
    
    # 设置系统同时保持的 TCP TIME_WAIT 状态的连接数上限。达到上限后,系统会直接丢弃多余的连接(而不是继续占用资源)。
    # 默认值180000,对于高并发的 Web 服务器或反向代理,适当调低该值(如 20480)以避免 TIME_WAIT 数量过多。
    net.ipv4.tcp_max_tw_buckets = 20480
    
    # 设置 TCP 三次握手中 SYN 请求的队列长度上限。
    # 当服务器接收的 SYN 请求超过该值时,新的连接请求会被丢弃。
    # 如果服务器负载较高且连接数较多,可以调高到 20480 或更高。
    net.ipv4.tcp_max_syn_backlog = 20480
    
    # 设置网络设备接收队列的最大长度。
    # 如果接收队列中的数据包数量超过该值,内核将直接丢弃后续数据包。
    # 在高流量环境中,设置为较高值(如 262144)以避免丢包,提高吞吐量。
    net.core.netdev_max_backlog = 262144
    
    # 设置 TCP 连接处于 FIN_WAIT2 状态的超时时间(单位:秒)。
    # FIN_WAIT2 状态表示服务端已发送 FIN 包等待客户端确认,此状态会持续占用资源。
    # 默认值:通常为 60 秒。
    # 在高并发服务器上,将该值调低(如 20)以减少 FIN_WAIT2 状态的资源占用。
    net.ipv4.tcp_fin_timeout = 20
    
    # 重新加载 /etc/sysctl.conf 中的所有内核参数配置,并使其立即生效。
    sysctl -p

2.11 关闭 swap 分区

在 master01、node01、node02 三台服务器分别执行

swapoff -a
sed -i 's:/dev/mapper/rl-swap:#/dev/mapper/rl-swap:g' /etc/fstab
  • 命令解释

    #  立即关闭系统中所有的交换分区
    swapoff -a
    
    # 注释掉 /etc/fstab 文件中定义的交换分区挂载条目,防止系统在重启后重新启用交换分区。
    sed -i 's:/dev/mapper/rl-swap:#/dev/mapper/rl-swap:g' /etc/fstab
    
    # 验证交换分区是否关系
    free -h
    输出中 Swap 一栏的值会变为 0。

3、集群各个节点安装Docker服务

3.1 添加 docker-ce yum 源

在 master01、node01、node02 三台服务器分别执行

sudo dnf config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
  • 命令解析

    # 使用 dnf config-manager 命令添加 Docker 软件包的官方仓库(在这里是阿里云的镜像)。
    sudo dnf config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
    # 修改 docker-ce.repo 文件中的镜像源地址,将默认的 download.docker.com 替换为阿里云的镜像地址 mirrors.aliyun.com/docker-ce。
    sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
    
    # 安装最新版本docker
    sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

3.2 开启Docker服务

在 master01、node01、node02 三台服务器分别执行

systemctl start docker
systemctl enable docker

3.3 配置 daemon.json

在 master01、node01、node02 三台服务器分别执行

cat >>/etc/docker/daemon.json <<EOF
{
  "log-driver": "json-file",
  "log-opts": {
        "max-size": "100m",
        "max-file": "10"
  },
  "data-root":"/data/docker",
  "exec-opts": ["native.cgroupdriver=systemd"],
  "registry-mirrors": [
   "https://kfp63jaj.mirror.aliyuncs.com",
    "https://hub-mirror.c.163.com",
    "https://mirror.baidubce.com"
  ]
}
EOF
  • 配置解析

    "data-root": "/data/docker"
    指定 Docker 数据的存储目录为 /data/docker。
    包括容器、镜像、卷等内容。
    默认存储在 /var/lib/docker,此配置用于更改默认路径。
    
    
    "exec-opts": ["native.cgroupdriver=systemd"]
    配置 Docker 使用 systemd 作为 Cgroup 驱动程序。
    推荐在使用现代 Linux 发行版(如 Rocky Linux 9)或 Kubernetes 时采用此配置,以实现更好的资源管理和兼容性。
    
    
    "log-driver": "json-file"
    指定 Docker 的日志驱动为 json-file。
    json-file 是 Docker 默认的日志存储方式,将日志保存在 JSON 文件中。
    
    
    "log-opts": {}
    配置日志驱动的选项:
    "max-size": "100m":每个日志文件的最大大小为 100MB。
    "max-file": "100":最多保留 100 个日志文件(滚动日志机制)。
    
    
    "insecure-registries": ["harbor.xinxainghf.com"]
    配置不安全的私有镜像仓库地址(即未启用 HTTPS 的仓库)。
    例如,harbor.xinxainghf.com 是一个私有仓库地址。
    
    
    "registry-mirrors": ["https://kfp63jaj.mirror.aliyuncs.com"]
    配置 Docker 镜像加速器。
    镜像地址为阿里云镜像服务,加速从官方 Docker Hub 拉取镜像的速度。
    

3.4 创建 Docker 服务的自定义配置目录

在 master01、node01、node02 三台服务器分别执行

mkdir -p /etc/systemd/system/docker.service.d

用于存放 Docker 服务的自定义配置文件。

3.5 重新加载 Docker 配置

在 master01、node01、node02 三台服务器分别执行

systemctl daemon-reload
systemctl restart docker
  • 验证配置是否生效

    docker info

4、安装 cri-docker

从 kubernetes 1.24 开始,dockershim 已经从 kubelet 中移除( dockershim 是 Kubernetes 的一个组件,主要目的是为了通过 CRI 操作 Docker),但因为历史问题 docker 却不支持 kubernetes 主推的CRI(容器运行时接口)标准,所以 docker 不能再作为 kubernetes 的容器运行时了,即从 kubernetesv1.24 开始不再使用 docker 了,默认使用的容器运行时是 containerd 。目前 containerd 比较新,可能存在一些功能不稳定的情况,所以这里我们使用容器运行时还是选择 docker。

如果想继续使用 docker 的话,可以在 kubelet 和 docker 之间加上一个中间层 cri-docker 。cri-docker 是一个支持CRI标准的 shim(垫片)。一头通过CRI跟kubelet 交互,另一头跟 docker api 交互,从而间接的实现了 kubernetes 以 docker 作为容器运行时。这里需要在全部节点执行 cri-docker 安装。

4.1 下载 cri-docker

在 master01、node01、node02 三台服务器分别执行

# 创建目录,并下载 cri-docker 安装文件到目录中
mkdir -p /opt/software
cd /opt/software
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.16/cri-dockerd-0.3.16.amd64.tgz

4.2 解压 cri-docker

在 master01、node01、node02 三台服务器分别执行

tar -xvf /opt/software/cri-dockerd-0.3.16.amd64.tgz --strip-components=1 -C /usr/local/bin/

4.3 下载并修改 cri-docker 配置文件

4.3.1 下载 cri-docker 配置文件

在 master01、node01、node02 三台服务器分别执行

在浏览器下载文件,通过xftp传到服务器上

# 下载 cri-docker.service
# cri-docker.service 下载地址:https://github.com/Mirantis/cri-dockerd/blob/v0.3.16/packaging/systemd/cri-docker.service
mv /opt/software/cri-docker.service /etc/systemd/system/

# 下载 cri-docker.socket
# cri-docker.socket 下载地址:https://github.com/Mirantis/cri-dockerd/blob/v0.3.16/packaging/systemd/cri-docker.socket
mv /opt/software/cri-docker.socket /etc/systemd/system/

4.3.2 修改 cri-docker 配置文件

在 master01、node01、node02 三台服务器分别执行

修改 cri-docker.service 的启动命令 ExecStart

vim /etc/systemd/system/cri-docker.service
  • 修改内容如下:

    # 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=/data/dockershim --cri-dockerd-root-directory=/data/docker
    • 配置解析

      ExecStart
      作用: 定义 Systemd 启动服务时执行的命令。
      此命令会在服务启动时运行。
      
      /usr/local/bin/cri-dockerd
      解释: cri-dockerd 的可执行文件路径。
      作用: 启动 cri-dockerd 服务,为 Kubernetes 提供 CRI(容器运行时接口)支持。
      
      --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9
      解释: 定义 Pod 的基础容器镜像。
      
      --container-runtime-endpoint=unix:///var/run/cri-dockerd.sock
      解释: 定义 CRI 的监听端点。
      作用: cri-dockerd 使用 Unix Socket 文件 /var/run/cri-dockerd.sock 提供与 Kubernetes 的交互接口。
      
      --cri-dockerd-root-directory=/data/dockershim
      解释: 定义 cri-dockerd 的根目录,用于存储临时文件或配置数据。
      作用: /data/dockershim 是修改后的 cri-dockerd 数据目录,默认存放在 /var/lib/dockershim,用于存放与 Docker 和 Kubernetes 通信相关的数据。
      
      --cri-dockerd-root-directory=/data/docker
      解释: 定义 Docker 的根目录。
      作用: Docker 的所有容器数据、镜像数据都存放在 /data/docker 目录下。

cri-docker.service

  • 修改cri-docker.socket的ListenStream参数

    vim /etc/systemd/system/cri-docker.socket
    • 修改内容如下:

      # ListenStream=%t/cri-dockerd.sock
      ListenStream=/var/run/cri-dockerd.sock
      • 配置解析

        ListenStream
        	作用:
        		定义 cri-dockerd 服务监听的通信地址和端口。
        		在这里,指定了一个 Unix Socket 文件 /var/run/cri-dockerd.sock。
        
        /var/run/cri-dockerd.sock
        	解释:
        		这是一个 Unix Domain Socket 文件路径。
        		Unix Sockets 是一种轻量级的进程间通信(IPC)方式,通常用于本地通信(与网络无关)。
        		cri-dockerd 和 Kubernetes 的 kubelet 通过这个 Socket 文件进行交互。

    cri-dockerd.sock

注意每个节点 cri-docker 都需要这么配置

4.4 启动 cri-docker 对应服务

在 master01、node01、node02 三台服务器分别执行

systemctl daemon-reload
systemctl enable cri-docker
systemctl start cri-docker
systemctl is-active cri-docker
  • 命令解析

    # 告诉 Systemd 重新加载所有服务配置文件。
    systemctl daemon-reload
    
    # 设置 cri-docker 服务为 开机自启。
    systemctl enable cri-docker
    
    # 启动 cri-docker 服务。
    systemctl start cri-docker
    
    # 检查 cri-docker 服务是否正在运行。
    systemctl is-active cri-docker

5、使用 kubeadm 基于 Docker Runtime 部署 kubernetes 集群

5.1 配置阿里云K8S源

在 master01、node01、node02 三台服务器分别执行

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.29/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.29/rpm/repodata/repomd.xml.key
EOF

5.2 安装K8S集群管理工具

在 master01、node01、node02 三台服务器分别执行

yum install -y kubelet kubeadm kubectl

5.3 配置k8s Cgoup控制组

在 master01、node01、node02 三台服务器分别执行

vim /etc/sysconfig/kubelet
  • 配置内容如下:

    KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
  • 配置解析

    KUBELET_EXTRA_ARGS
    含义:
    	KUBELET_EXTRA_ARGS 是一个变量,用于为 kubelet 添加自定义的启动参数。
    	这些参数会被系统初始化脚本或服务文件加载并传递给 kubelet 进程。
    	
    --cgroup-driver=systemd
    作用:
    	指定 kubelet 使用的 cgroup 驱动(Cgroup Driver)。
    	Cgroup Driver 是 Kubernetes 用来与 Linux 内核 cgroup(控制组)交互的机制,负责资源(CPU、内存等)的限制和管理。
    	该参数将驱动类型设置为 systemd,表示使用 systemd 来管理 cgroup。

5.4 配置kubelet自启动

在 master01、node01、node02 三台服务器分别执行

systemctl enable kubelet.service

5.5 初始化集群

5.5.1 打印 master 节点所需的镜像文件

只在 master01 服务器节点执行

kubeadm config images list

所需的镜像文件

5.5.2 打印集群初始化配置文件

只在 master01 服务器节点执行

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

集群初始化配置文件

5.5.3 修改集群初始化配置文件

主要修改advertiseAddress,criSocket, imageRepositoryetcd.local.dataDir 这4个参数,如下:

只在 master01 服务器节点执行

vim /opt/software/kubeadm-config.yaml
  • 修改内容如下:

    apiVersion: kubeadm.k8s.io/v1beta3
    bootstrapTokens:
    - groups:
      - system:bootstrappers:kubeadm:default-node-token
      token: abcdef.0123456789abcdef
      ttl: 24h0m0s
      usages:
      - signing
      - authentication
    kind: InitConfiguration
    localAPIEndpoint:
      advertiseAddress: 192.168.6.223 # 修改为集群初始化的master节点IP地址
      bindPort: 6443
    nodeRegistration:
      criSocket: unix:///var/run/cri-dockerd.sock # 高版本默认使用containerd,这里修改成使用dcoker
      imagePullPolicy: IfNotPresent
      name: node
      taints: null
    ---
    apiServer:
      timeoutForControlPlane: 4m0s
    apiVersion: kubeadm.k8s.io/v1beta3
    certificatesDir: /etc/kubernetes/pki
    clusterName: kubernetes
    controllerManager: {}
    dns: {}
    etcd:
      local:
        dataDir: /data/etcd # 修改 etcd 的数据存储目录
    #imageRepository: registry.k8s.io
    imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers # 这里修改成使用阿里云容器镜像
    kind: ClusterConfiguration
    kubernetesVersion: 1.29.0
    networking:
      dnsDomain: cluster.local
      serviceSubnet: 10.96.0.0/12
    scheduler: {}
  • 配置解析

    # 指定配置文件的 API 版本,这里使用的是 v1beta3(Kubernetes 1.22+ 支持)。
    apiVersion: kubeadm.k8s.io/v1beta3
    bootstrapTokens:
    - groups:
      # 设置令牌的用户组,用于节点加入时的权限分配。
      - system:bootstrappers:kubeadm:default-node-token
      # 定义用于节点加入的令牌,由两部分组成:6 位前缀 + 16 位随机数。
      token: abcdef.0123456789abcdef
      # 定义令牌的有效期,这里设置为 24 小时。
      ttl: 24h0m0s
      usages:
      # signing:用于签署客户端证书请求。
      - signing
      # authentication:用于身份验证。
      - authentication
    kind: InitConfiguration
    localAPIEndpoint: # 配置本地 API 服务器的监听地址和端口:
      advertiseAddress: 192.168.6.223 # 修改为集群初始化的master节点IP地址
      # API 服务器的监听端口(默认是 6443)。
      bindPort: 6443
    nodeRegistration:
      # 定义容器运行时接口(CRI)的 Socket 路径。
      criSocket: unix:///var/run/cri-dockerd.sock # 高版本默认使用containerd,这里修改成使用dcoker
      # 配置镜像拉取策略,IfNotPresent 表示本地没有镜像时才拉取。
      imagePullPolicy: IfNotPresent
      # 注册的节点名称。
      name: node
      # 设置节点的污点,这里为 null,表示不对节点进行污点设置。
      taints: null
    ---
    apiServer: # 配置 API 服务器的相关参数
      # 控制平面组件的超时时间,设置为 4 分钟。
      timeoutForControlPlane: 4m0s
    apiVersion: kubeadm.k8s.io/v1beta3
    # 集群证书的存放路径:/etc/kubernetes/pki:默认路径。
    certificatesDir: /etc/kubernetes/pki
    # 集群的标识名称。
    clusterName: kubernetes
    controllerManager: {}
    dns: {}
    etcd:
      local:
        # 配置 etcd 数据存储信息
        dataDir: /data/etcd # 修改 etcd 的数据存储目录
    # 定义镜像仓库地址
    #imageRepository: registry.k8s.io
    imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers # 这里修改成使用阿里云容器镜像
    kind: ClusterConfiguration
    # 需要安装的 Kubernetes 主版本
    kubernetesVersion: 1.29.0
    networking: # 配置集群的网络信息
      # DNS 的后缀域名(默认是 cluster.local)。
      dnsDomain: cluster.local
      # 群中 Service 的虚拟 IP 子网,通常为 /12 子网。
      serviceSubnet: 10.96.0.0/12
    scheduler: {}

5.5.4 使用以上配置文件进行集群初始化

只在 master01 服务器节点执行

kubeadm init --config /opt/software/kubeadm-config.yaml --upload-certs

集群初始化

初始化成功之后就会出现如下图打印

集群初始化成功

  • 命令解析

    kubeadm init
    	初始化 Kubernetes 集群的控制平面节点(Master)。
    	这是 Kubernetes 集群部署的第一步。
    	
    --config kubeadm-config.yaml
    	指定使用自定义的配置文件 kubeadm-config.yaml 来初始化集群。
    	配置文件中可以自定义网络、版本、镜像仓库、etcd 配置等关键参数。
    	
    --upload-certs
    作用:
    	将 Kubernetes 控制平面的证书(如 CA、API Server 证书等)加密后上传到集群内的 etcd 中。
    	便于后续添加其他控制平面节点(即高可用部署时添加多个 Master 节点)。
    	
    实现原理:
    	Kubernetes 使用对称加密的方式,将证书加密后存储在集群中。
    	生成一个临时的加密密钥,用于解密证书。
    
    后续节点加入命令:
    	kubeadm join 时,通过指定该密钥,可以从集群中下载并解密这些证书,从而加入为控制平面节点。
    	
    	
    如果是单 Master 节点,可以不加 --upload-certs。
    但是如果未来计划扩展为高可用集群,建议使用 --upload-certs。
  • master节点token过期处理

    # work token 过期后,重新申请
    kubeadm token create --print-join-command

5.5.5 配置环境变量

集群初始化成功之后的打印中提示了我们 需要进行一下环境变量配置

只在 master01 服务器节点执行

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 如果是root用户操作,执行
export KUBECONFIG=/etc/kubernetes/admin.conf
  • 命令解析

    
    mkdir -p $HOME/.kube
    功能:
    	创建一个目录 $HOME/.kube,用来存放 Kubernetes 客户端 (kubectl) 的配置文件。
    选项:
    	-p:确保目录路径中的每一级都被创建,如果目录已经存在则不会报错。
    背景:
    	kubectl 需要一个配置文件(通常是 config)来连接 Kubernetes 集群并进行管理。
    	$HOME/.kube 是 kubectl 默认查找配置文件的路径。
    
    
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    功能:
    	将 Kubernetes 的集群配置文件 /etc/kubernetes/admin.conf 复制到当前用户的 $HOME/.kube/config。
    选项:
    	-i:提示确认是否覆盖目标文件(如果目标文件已经存在)。
    背景:
    	admin.conf 是由 kubeadm init 生成的配置文件,包含:
    	集群的 API Server 地址
    	认证信息(如 CA 证书、用户证书)
    	配置上下文信息(上下文表示当前访问的集群和用户)
    	默认情况下,该文件存储在 /etc/kubernetes/ 下,并且只有 root 用户可以访问。
    	为了方便当前用户运行 kubectl 命令,需要将其复制到用户的主目录下。
    	
    	
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
    功能:
    	修改 $HOME/.kube/config 文件的所有者为当前用户和用户组。
    参数解析:
    	$(id -u):返回当前用户的 UID。
    	$(id -g):返回当前用户的 GID。
    	
    完整流程的意义
    	创建 .kube 目录,用于存放 Kubernetes 配置文件。
    	将集群的配置文件复制到用户目录中,使 kubectl 可以连接和管理集群。
    	修改配置文件的权限,方便用户无权限问题地运行 kubectl 命令。

5.5.6 所有woker节点加入到集群中

在 node01、node02 这2台服务器执行

kubeadm join 192.168.6.223:6443 --token abcdef.0123456789abcdef \
	--discovery-token-ca-cert-hash sha256:2abbc2082ec6ca53c24154e82e3d18d0d8bcd6410af674a1197d0c2ba75e47d6 \
	 --cri-socket=unix:///var/run/cri-dockerd.sock

此命令来源于集群初始化时,控制台打印内容,添加了 –cri-socket=unix:///var/run/cri-dockerd.sock

node01加入集群

node02加入集群

  • master节点查看集群

    kubectl get nodes

    master节点查看集群

6、部署网络插件

6.1 calico安装

K8s使用calico部署集群网络,只需要在Master节点安装即可。

下载地址:https://github.com/projectcalico/calico

只在 master01 服务器节点执行

curl https://raw.githubusercontent.com/projectcalico/calico/v3.26.3/manifests/calico-typha.yaml -o /opt/software/calico.yaml

6.2 创建calico网络

只在 master01 服务器节点执行

kubectl apply -f /opt/software/calico.yaml

创建calico网络

6.3 验证集群可用性

只在 master01 服务器节点执行

kubectl get nodes

验证集群可用性

node1 与 node2 几点都处于 NotReady 状态,这是因为集群正在拉取 calico 所需的镜像,而这个镜像在国外,所以很慢,甚至会失败。

需要的镜像在 /opt/software/calico.yaml 这个文件中,可以先下载好,再导入到服务器中。

集群可用时

如果所需镜像都下载完成,并成功启动后,执行 kubectl get nodes 显示如下:

验证集群可用性

在安装 k8s 集群时,关于如何下载外网镜像是个绕不过去的问题。这里只说一种最稳妥的方式,就是给服务器配置网络代理,实现从官方下载镜像。

具体方式见:

第一步:服务器配置外网代理,保证服务器可以正常访问谷歌等外网

第二步:配置Docker网络代理,实现k8s镜像的正常拉取

6.4 查看集群健康情况

只在 master01 服务器节点执行

kubectl get cs

查看集群健康情况

6.5 查看kubernetes集群pod运行情况

只在 master01 服务器节点执行

kubectl get pods -n kube-system

查看kubernetes集群pod运行情况

6.6 worker节点配置

当我们在Worker节点上执行kubectl命令管理时会报如下错误:

在node节点执行

kubectl get pods -n kube-system

node节点执行kubectl命令报错

解决方式:

只要把 master上的管理文件 /etc/kubernetes/admin.conf 拷贝到 Worker 节点的 $HOME/.kube/config 就可以让 Worker 节点也可以实现 kubectl 命令管理。

# 在 node1 节点执行
[root@k8s-node01 ~]$ mkdir /root/.kube

# 在node2节点执行
[root@k8s-node02 ~]$ mkdir /root/.kube

# 在master节点执行
[root@k8s-master01 ~]$ scp /etc/kubernetes/admin.conf root@192.168.6.225:/root/.kube/config
[root@k8s-master01 ~]$ scp /etc/kubernetes/admin.conf root@192.168.6.226:/root/.kube/config
  • 在node节点测试 kubectl 命令

    [root@k8s-node01 ~]$ kubectl get pods -n kube-system

    在node节点测试 kubectl 命令

至此,使用 kubeadm 完成了k8s集群的安装。

7、K8S集群的启停管理

默认K8S我们只要设置了 systemctl enable kubelet.service 后,会在开机自动启动K8S集群,如果想要停止 kubernetes 集群,我们可以通过 systemctl stop kubelet.service 命令停止集群,但是必须先将节点上的docker停止。

不管你是通过哪种方式安装的K8S集群, 只要记住一句口诀就行了:启动K8S集群,先启动集群上所有的容器服务(不管是Docker还是Containerd),停止K8S集群,先停止集群上所有的容器服务。

7.1 停止K8S集群

在 master01、node01、node02 三台服务器分别执行

systemctl stop docker
systemctl stop kubelet.service

7.2 启动K8S集群

在 master01、node01、node02 三台服务器分别执行

systemctl start docker
systemctl start kubelet.service

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 george_95@126.com