Kubernetes 1.25 集群部署指南

本指南将指导您如何从头开始设置一个使用 Docker 作为容器运行时的 Kubernetes 1.25 集群。我们将涵盖从系统准备到集群初始化的所有步骤,并提供一些常见问题的解决方法。

架构概述

节点类型 主机名 IP 地址 角色描述
Master 节点 k8s-master 172.31.7.100 集群管理节点,负责集群的初始化、调度等工作
Worker 节点 1 k8s-node1 172.31.7.101 执行容器工作负载
Worker 节点 2 k8s-node2 172.31.7.102 执行容器工作负载
Worker 节点 3 k8s-node3 172.31.7.103 执行容器工作负载

安装与配置概览

序号 步骤 主要操作 目标
1 前置配置 关闭 swap、设置主机名解析、加载内核模块等 准备系统环境,确保 Kubernetes 能够正常运行
2 安装 Docker 添加 Docker APT 源并安装指定版本的 Docker 提供容器运行时支持
3 安装 cri-dockerd 下载并安装 cri-dockerd,使其兼容 Kubernetes CRI 接口 允许 Docker 作为 Kubernetes 的容器运行时
4 安装 Kubernetes 组件 安装 kubeadm, kubelet, 和 kubectl 初始化和管理 Kubernetes 集群
5 初始化 Master 节点 使用 kubeadm init 命令初始化集群 创建集群,并生成加入命令供其他节点使用
6 Worker 节点加入集群 在每个 Worker 节点上执行生成的 join 命令 将 Worker 节点加入到集群中
7 安装网络插件 使用 Calico 网络插件 提供 Pod 网络支持
8 验证集群状态 使用 kubectl get nodeskubectl get pods -n kube-system 查看状态 确认所有节点和系统组件正常运行

一、所有节点前置配置(所有节点执行)

# 关闭 swap
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

# 设置主机名解析(所有节点)
# 在 100 节点执行:
sudo hostnamectl set-hostname k8s-master
# 在 101-103 节点分别执行:
sudo hostnamectl set-hostname k8s-node1
sudo hostnamectl set-hostname k8s-node2
sudo hostnamectl set-hostname k8s-node3

# 所有节点添加 hosts 解析(可选)
cat <<EOF | sudo tee -a /etc/hosts
172.31.7.100 k8s-master
172.31.7.101 k8s-node1
172.31.7.102 k8s-node2
172.31.7.103 k8s-node3
EOF

# 加载内核模块
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter

# 设置内核参数
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sudo sysctl --system

# 禁用防火墙(如果使用)
sudo ufw disable

二、安装 Docker(所有节点)

# 安装 Docker
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install -y docker-ce=5:20.10.23~3-0~ubuntu-focal docker-ce-cli=5:20.10.23~3-0~ubuntu-focal containerd.io

# 配置 Docker 使用 systemd
cat <<EOF | sudo tee /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF

sudo systemctl restart docker
sudo systemctl enable docker

三、安装 cri-dockerd(所有节点)

# 下载预编译二进制包
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.4/cri-dockerd_0.3.4.3-0.ubuntu-focal_amd64.deb
sudo dpkg -i cri-dockerd_0.3.4.3-0.ubuntu-focal_amd64.deb

# 修改服务配置(适配 Kubernetes 1.25)
sudo sed -i 's|--network-plugin=cni --cni-bin-dir=/opt/cni/bin|--network-plugin=cni --cni-conf-dir=/etc/cni/net.d|g' /lib/systemd/system/cri-docker.service
sudo systemctl daemon-reload
sudo systemctl enable cri-docker && sudo systemctl start cri-docker

四、安装 kubeadm/kubelet/kubectl(所有节点)

# 添加阿里云镜像源
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF

# 安装指定版本
sudo apt-get update
sudo apt-get install -y kubelet=1.25.7-00 kubeadm=1.25.7-00 kubectl=1.25.7-00
sudo apt-mark hold kubelet kubeadm kubectl

五、初始化 Master 节点(仅在 master 执行)

# 生成初始化命令(替换实际IP)
sudo kubeadm init \
  --apiserver-advertise-address=172.31.7.100 \
  --image-repository registry.aliyuncs.com/google_containers \
  --kubernetes-version v1.25.7 \
  --service-cidr=10.96.0.0/12 \
  --pod-network-cidr=192.168.0.0/16 \
  --cri-socket unix:///var/run/cri-dockerd.sock

# 完成后按提示操作
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 保存 join 命令(稍后用于节点加入)
kubeadm token create --print-join-command > join-command.txt

六、Worker 节点加入集群(在 101-103 执行)

# 使用上一步生成的 join 命令(需添加 --cri-socket)
sudo $(cat join-command.txt) --cri-socket unix:///var/run/cri-dockerd.sock

七、安装网络插件(在 master 执行)

# 安装 Calico(匹配 --pod-network-cidr=192.168.0.0/16)
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

八、验证集群状态

kubectl get nodes -o wide
# 等待所有节点状态变为 Ready
kubectl get pods -n kube-system

常见问题处理

  1. 镜像拉取失败

    # 手动拉取镜像(例如)
    docker pull registry.aliyuncs.com/google_containers/pause:3.8
    
  2. cri-dockerd 未启动

    journalctl -u cri-docker -l
    
  3. 节点 NotReady

    journalctl -u kubelet -f
    

完成以上步骤后,您将获得一个使用 Docker 作为容器运行时的 Kubernetes 1.25 集群。所有节点均可通过 kubectl 命令在 Master 节点管理。