附048.Kubernetes_v1.33.2三节点集群-Ubuntu版

发布于:2025-08-17 ⋅ 阅读:(22) ⋅ 点赞:(0)

部署组件

该 Kubernetes 部署过程中,对于部署环节,涉及多个组件,主要有 kubeadm 、kubelet 、kubectl。

kubeadm介绍

Kubeadm 为构建 Kubernetes 提供了便捷、高效的“最佳实践” ,该工具提供了初始化完整 Kubernetes 过程所需的组件,其主要命令及功能有:

  • kubeadm init:用于搭建 Kubernetes 控制平面节点;
  • kubeadm join:用于搭建 Kubernetes 工作节点并将其加入到集群中;
  • kubeadm upgrade:用于升级 Kubernetes 集群到新版本;
  • kubeadm token:用于管理 kubeadm join 使用的 token;
  • kubeadm reset:用于恢复(重置)通过 kubeadm init 或者 kubeadm join 命令对节点进行的任何变更;
  • kubeadm certs:用于管理 Kubernetes 证书;
  • kubeadm kubeconfig:用于管理 kubeconfig 文件;
  • kubeadm version:用于显示(查询)kubeadm 的版本信息;
  • kubeadm alpha:用于预览当前从社区收集到的反馈中的 kubeadm 特性。

更多参考:Kubeadm介绍

kubelet介绍

kubelet 是 Kubernetes 集群中用于操作 Docker 、containerd 等容器运行时的核心组件,需要在每个节点运行。通常该操作是基于 CRI 实现,kubelet 和 CRI 交互,以便于实现对 Kubernetes 的管控。

kubelet 主要用于配置容器网络、管理容器数据卷等容器全生命周期,对于 kubelet 而言,其主要的功能核心有:

  • Pod 更新事件;
  • Pod 生命周期管理;
  • 上报 Node 节点信息。

更多参考:kubelet介绍

kubectl介绍

kubectl 控制 Kubernetes 集群管理器,是作为 Kubernetes 的命令行工具,用于与 apiserver 进行通信,使用 kubectl 工具在 Kubernetes 上部署和管理应用程序。
使用 kubectl,可以检查群集资源的创建、删除和更新组件。
同时集成了大量子命令,可更便捷的管理 Kubernetes 集群,主要命令如下:

  • Kubetcl -h:显示子命令;
  • kubectl option:查看全局选项;
  • kubectl <command> --help:查看子命令帮助信息;
  • kubelet [command] [PARAMS] -o=<format>:设置输出格式,如json、yaml等;
  • Kubetcl explain [RESOURCE]:查看资源的定义。

更多参考:kubectl介绍

方案概述

方案介绍

本方案基于 kubeadm 部署工具实现完整生产环境可用的 Kubernetes 高可用集群,同时提供相关 Kubernetes 周边组件。
其主要信息如下:

  • 版本:Kubernetes 1.33.2 版本;
  • kubeadm:采用 kubeadm 部署 Kubernetes ;
  • OS:Ubuntu Server 24.04 LTS;
  • etcd:采用单点融合方式;
  • 其他主要部署组件包括:
    • Metrics:度量组件,用于提供相关监控指标;
    • Helm:Kubernetes Helm 包管理器工具,用于后续使用 helm 整合包快速部署应用;
    • Ingress:Kubernetes 服务暴露应用,用于提供7层的负载均衡,类似 Nginx,可建立外部和内部的多个映射规则;
    • containerd:Kubernetes 底层容器时;
    • Longhorn:Kubernetes 动态存储组件,用于提供 Kubernetes 的持久存储。

提示:本方案部署所使用脚本均由本人提供,可能不定期更新。

部署规划

节点规划
节点主机名 IP 类型 可运行服务/组件
master01 172.24.8.11 Kubernetes master节点 kubeadm、kubelet、kubectl、containerdetcd、kube-apiserver、kube-scheduler、kube-controller-manager、calicometrics、ingress、Longhorn ui节点
worker01 172.24.8.12 Kubernetes master节点 kubelet、containerd、calico、metrics、Longhorn driver节点
worker02 172.24.8.13 Kubernetes master节点 kubelet、containerd、calico、metrics、Longhorn driver节点

主机名配置

需要对所有节点主机名进行相应配置。

root@localhost:~# hostnamectl set-hostname master01	    #其他节点依次修改

提示:如上需要在所有节点修改对应的主机名。

生产环境通常建议在内网部署dns服务器,使用dns服务器进行解析,本指南采用本地hosts文件名进行解析。
如下hosts文件修改仅需在master01执行,后续使用批量分发至其他所有节点。

root@master01:~# cat >> /etc/hosts << EOF
172.24.8.11 master01
172.24.8.12 worker01
172.24.8.13 worker02
EOF

提示:如上仅需在master01节点上操作。

变量准备

为实现自动化部署,自动化分发相关文件,提前定义相关主机名、IP组、变量等。

root@master01:~# wget http://down.linuxsb.com/mydeploy/k8s/v1.33.2/u3nodesenv.sh

root@master01:~# vi u3nodesenv.sh            #确认相关主机名和IP
#!/bin/bash
#***************************************************************#
# ScriptName: u3nodesenv.sh
# Author: xhy
# Create Date: 2025-07-23 17:49
# Modify Author: xhy
# Modify Date: 2025-07-23 17:49
# Version: v1
#***************************************************************#

# 集群 MASTER 机器 IP 数组
export MASTER_IPS=(172.24.8.11)

# 集群 MASTER IP 对应的主机名数组
export MASTER_NAMES=(master01)

# 集群 NODE 机器 IP 数组
export NODE_IPS=(172.24.8.12 172.24.8.12)

# 集群 NODE IP 对应的主机名数组
export NODE_NAMES=(worker01 worker02)

# 集群所有机器 IP 数组
export ALL_IPS=(172.24.8.11 172.24.8.12 172.24.8.13)

# 集群所有IP 对应的主机名数组
export ALL_NAMES=(master01 worker01 worker02)

提示:如上仅需在master01节点上操作。

互信配置

为了方便远程分发文件和执行命令,本方案配置master01节点到其它节点的 ssh信任关系,即免秘钥管理所有其他节点。

root@master01:~# source u3nodesenv.sh                                #载入变量


root@master01:~# wget http://down.linuxsb.com/mydeploy/k8s/common/mkpublickey.sh
root@master01:~# vim mkpublickey.sh                                  #修改集群节点IP
#!/bin/bash
#***************************************************************#
# ScriptName: mkpublickey.sh
# Author: xhy
# Create Date: 2025-07-01 23:55
# Modify Author: xhy
# Modify Date: 2025-07-23 17:53
# Version: v1
#***************************************************************#

# 检查参数
if [ $# -ne 1 ]; then
    echo "该脚本需要带上主机密码: $0 <密码>"
    exit 1
fi

# 主机列表(直接内置)
HOSTS=(
    172.24.8.11
    172.24.8.12
    172.24.8.13
)
PASSWORD=$1
#……
[root@master01 ~]# bash mkpublickey.sh redhat123

提示:如上仅需在master01节点上操作。

环境预配置

kubeadm本身仅用于部署Kubernetes集群,在正式使用kubeadm部署Kubernetes集群之前需要对操作系统环境进行准备,即环境预配置。
环境的预配置本方案使用脚本自动完成。
使用如下脚本对基础环境进行初始化,主要功能包括:

  • 安装containerd,Kubernetes平台底层的容器组件
  • 关闭SELinux及防火墙
  • 优化相关内核参数,针对生产环境Kubernetes集群的基础系统调优配置
  • 关闭swap
  • 设置相关模块,主要为转发模块
  • 配置相关基础软件,部署Kubernetes集群所需要的基础依赖包
  • 创建container所使用的独立目录
  • 配置crictl和运行时的连接,便于后期使用crictl命令

提示:后续ctr命令下载镜像的时候,若需要使用containerd的加速,必须带上–hosts-dir,ctr当前环境所管理的镜像都属于k8s.io,因此创建一个别名。

root@master01:~# wget http://down.linuxsb.com/mydeploy/k8s/v1.33.2/uk8spreconfig.sh

root@master01:~# vim uk8spreconfig.sh
#!/bin/bash
#***************************************************************#
# ScriptName: uk8spreconfig.sh
# Author: xhy
# Create Date: 2025-03-29 12:30
# Modify Author: xhy
# Modify Date: 2025-07-23 17:58
# Version: v1
#***************************************************************#

CONTAINERD_VERSION=1.7.27-1

# Initialize the machine. This needs to be executed on every machine.
apt update && apt upgrade -y && apt autoremove -y

# Install package
sudo apt -y install conntrack ntpdate ntp ipvsadm ipset jq iptables sysstat wget

# Add Docker's official GPG key
sudo apt -y install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update

# Install and config containerd
apt-cache madison containerd
sudo apt -y install containerd.io=${CONTAINERD_VERSION}
sleep 3s

mkdir -p /etc/containerd/certs.d/docker.io
mkdir -p /data/containerd

cat > /etc/containerd/config.toml <<EOF
disabled_plugins = ["io.containerd.internal.v1.restart"]
root = "/data/containerd"
version = 2

[plugins]

  [plugins."io.containerd.grpc.v1.cri"]
#    sandbox_image = "registry.k8s.io/pause:3.10"
    sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.10"

    [plugins."io.containerd.grpc.v1.cri".containerd]

      [plugins."io.containerd.grpc.v1.cri".containerd.runtimes]

        [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
          runtime_type = "io.containerd.runc.v2"

          [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
            SystemdCgroup = true

    [plugins."io.containerd.grpc.v1.cri".registry]
      config_path = "/etc/containerd/certs.d"

  [plugins."io.containerd.runtime.v1.linux"]
    shim_debug = true
EOF

cat > /etc/containerd/certs.d/docker.io/hosts.toml <<EOF
server = "https://registry-1.docker.io"

[host."https://docker.1ms.run"]
  capabilities = ["pull", "resolve", "push"]
  
[host."https://dbzucv6w.mirror.aliyuncs.com"]
  capabilities = ["pull", "resolve", "push"]

[host."https://docker.xuanyuan.me"]
  capabilities = ["pull", "resolve", "push"]
EOF

# config crictl & containerd 
cat > /etc/crictl.yaml <<EOF
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF

echo 'alias ctrpull="ctr -n k8s.io images pull --hosts-dir /etc/containerd/certs.d"' >> /etc/profile.d/custom_bash.sh

systemctl restart containerd
systemctl enable containerd --now

# Turn off and disable the firewalld.
systemctl disable ufw --now || true

# Modify related kernel parameters & Disable the swap.
cat > /etc/sysctl.d/k8s.conf << EOF
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.tcp_tw_recycle = 0
vm.swappiness = 0
vm.overcommit_memory = 1
vm.panic_on_oom = 0
net.ipv6.conf.all.disable_ipv6 = 1
EOF
sysctl -p /etc/sysctl.d/k8s.conf >&/dev/null
swapoff -a

echo -e "#/bin/bash \nswapoff -a" > /etc/profile.d/disabled_swap.sh

sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
modprobe br_netfilter
modprobe overlay

sysctl --system

# Add ipvs modules
cat > /etc/modules-load.d/ipvs.conf <<EOF
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
br_netfilter
overlay
xt_CT
EOF

systemctl restart systemd-modules-load.service

提示:containerd 镜像加速配置更多可参考:

containerd配置镜像加速器 containerd官方加速配置

提示:如上仅需在master01节点上操作,建议初始化完后进行重启。

  • 批量初始化
root@master01:~# source u3nodesenv.sh
root@master01:~# chmod +x *.sh
root@master01:~# for all_ip in ${ALL_IPS[@]}
  do
    echo -e "\n\n\033[33m[INFO] >>> ${all_ip}...\033[0m"
    sleep 2
    scp -rp /etc/hosts root@${all_ip}:/etc/hosts
    scp -rp uk8spreconfig.sh root@${all_ip}:/root/
    ssh root@${all_ip} "bash /root/uk8spreconfig.sh"
  done

提示:如上仅需在master01节点上操作。

  • 批量重启
root@master01:~# source u3nodesenv.sh
root@master01:~# for all_ip in ${ALL_IPS[@]}
  do
    echo -e "\n\n\033[33m[INFO] >>> ${all_ip}...\033[0m"
    sleep 1
    ssh root@${all_ip} "nohup bash -c 'sleep 10; shutdown -r now' >/dev/null 2>&1 </dev/null &"
  done

创建配置文件

创建集群部署所需的相关组件配置,采用脚本自动化创建相关配置文件。

root@master01:~# wget http://down.linuxsb.com/mydeploy/k8s/v1.33.2/u3k8sconfig.sh				#拉取自动部署脚本

root@master01:~# vim u3k8sconfig.sh
#!/bin/bash
#***************************************************************#
# ScriptName: u3k8sconfig.sh
# Author: xhy
# Create Date: 2025-07-23 18:17
# Modify Author: xhy
# Modify Date: 2025-07-23 18:25
# Version: v1
#***************************************************************#

#######################################
# 全局变量配置区
#######################################
echo -e "\n\033[33m[INFO] 开始定义全局参数...\033[0m"
sleep 1

declare -A NODES=(
    [master01]="172.24.8.11"
)

# 公共参数
K8SHA_VERSION=v1.33.2
K8SHA_VIP="${NODES[master01

网站公告

今日签到

点亮在社区的每一天
去签到