跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Shell / Bash

Kubernetes 集群部署指南(Ubuntu 22.04)

在 Ubuntu 22.04 系统上部署 Kubernetes 集群的完整流程。内容包括环境准备(主机名、Swap 关闭、内核模块配置)、安装容器运行时(containerd)、配置 Kubernetes 组件仓库及安装 kubeadm/kubelet/kubectl。随后演示了主节点初始化、Flannel 网络插件部署、工作节点加入集群以及集群状态检查。此外,还提供了节点重置与重新加入的操作步骤,并解释了 Kubernetes 核心组件(如 API Server、etcd、Scheduler 等)的功能与作用,适合初学者快速搭建本地或测试环境集群。

人间过客发布于 2026/3/26更新于 2026/10/1718K 浏览

注意事项

本文基于 Ubuntu 22.04 环境,介绍 Kubernetes 集群的搭建步骤。初学者可先完成部署,后续再针对性了解各组件作用。

框架图

文章配图 文章配图

1. 环境准备

# 1. 主机名与 hosts
sudo hostnamectl set-hostname k8s-master
sudo hostnamectl set-hostname k8s-worker-01
sudo hostnamectl set-hostname k8s-worker-02
cat <<EOF | sudo tee -a /etc/hosts
192.168.44.200 k8s-master
192.168.44.201 k8s-worker-01
192.168.44.202 k8s-worker-02
EOF

# 2. 关闭 swap
sudo swapoff -a
sudo sed -i '/swap/s/^/#/' /etc/fstab
swapon --show

# 3. 内核模块与参数
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-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
sudo sysctl --system

# 4. 必须安装 conntrack(否则 kubeadm 预检失败)
sudo apt update && sudo apt install -y conntrack

# 5. 配置时间同步
sudo apt update
sudo apt install -y chrony
sudo systemctl enable chrony --now
chronyc sources -v


 apt update &&  apt install -y socat ebtables ethtool ipset curl
# 6. 安装必要工具
sudo
sudo

常见错误:未安装 conntrack → 报 [ERROR FileExisting-conntrack]。

2. 安装容器运行时节点

由于此处使用 K8s V1.31,无需安装 Docker,直接使用 containerd。

# 1. 安装 containerd(来自 docker 官方源)
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 update && sudo apt install -y containerd.io

# 2. 配置 containerd 使用 systemd cgroup
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
sudo systemctl restart containerd
sudo systemctl enable containerd

# 3. 配置 crictl 端点(消除 WARN,确保后续命令可靠)
cat <<EOF | sudo tee /etc/crictl.yaml
runtime-endpoint: unix:///var/run/containerd/containerd.sock
image-endpoint: unix:///var/run/containerd/containerd.sock
timeout: 10
debug: false
EOF

常见错误:

  • 未配置 SystemdCgroup → 容器运行时状态异常。
  • 未配置 crictl 端点 → crictl ps 每次输出 WARN。

3. 安装 kubeadm / kubelet / kubectl(所有节点)

⚠️ 关键:旧仓库 apt.kubernetes.io 已废弃,必须使用新仓库 pkgs.k8s.io。

# 1. 添加 Kubernetes 官方新仓库(以 v1.31 为例)
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.31/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.31/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list

# 2. 安装并锁定版本
sudo apt update
sudo apt install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

kubeadm init 自动创建的组件

kubeadm 初始化时会生成静态 Pod 清单并启动以下组件(它们以静态 Pod 形式运行在 /etc/kubernetes/manifests/ 目录下,由 kubelet 直接管理):

组件说明
kube-apiserverKubernetes API 入口,所有组件和用户操作的唯一入口
kube-controller-manager运行各种控制器,确保集群状态与期望一致
kube-scheduler负责将新创建的 Pod 调度到合适的节点
etcd分布式键值存储,保存所有集群数据

此外,kubeadm 还会生成证书、kubeconfig 文件、创建引导令牌及基础资源。

kubeadm init 默认部署的附加组件

这两个组件虽然由 kubeadm 自动部署,但如果 Pod 网络插件未安装,它们会一直处于 Pending 状态。

组件说明依赖
CoreDNS集群内部 DNS 服务需要网络插件就绪
kube-proxy实现 Service 的负载均衡需要网络插件就绪

4. 初始化主节点(仅主节点)

# 1. 确保 etcd 数据目录干净
sudo rm -rf /var/lib/etcd

# 2. 执行初始化
sudo kubeadm init \
--apiserver-advertise-address=192.168.44.200 \
--pod-network-cidr=10.244.0.0/16 \
--control-plane-endpoint=k8s-master:6443 \
--upload-certs

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

# 4. 优化 etcd 配置(移除 resources.requests,避免 CPU 争抢)
sudo sed -i '/resources/,/memory: 100Mi/d' /etc/kubernetes/manifests/etcd.yaml
sudo systemctl restart kubelet

常见错误:

  • 未清理 /var/lib/etcd → etcd 多节点模式选举超时。
  • etcd.yaml 残留 resources.requests.cpu → 单核节点 CPU 不足。

5. 安装网络插件

推荐使用 Flannel(与指定的 Pod CIDR 10.244.0.0/16 完全兼容)。注意:请确保网络代理可用以访问外网资源。

kubectl apply -f https://github.com/flannel-io/flannel/releases/download/v0.28.1/kube-flannel.yml

建议优先使用 Flannel,Calico 配置相对复杂且对网络要求较高。

6. 加入工作节点(仅从节点)

⚠️ 切记:不要加 --control-plane 和 --certificate-key!这些参数用于添加控制平面节点,普通工作节点必须省略。

# 1. 从节点上确保 containerd 配置正确,且 conntrack 已安装
sudo apt install -y conntrack
sudo rm -f /etc/containerd/config.toml
sudo containerd config default | sudo tee /etc/containerd/config.toml
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
sudo systemctl restart containerd

# 2. 主节点上生成 join 命令
kubeadm token create --print-join-command

# 3. 从节点上执行得到的 join 命令(示例)
sudo kubeadm join k8s-master:6443 --token xxx --discovery-token-ca-cert-hash sha256:xxx

常见错误:

  • 使用了带 --control-plane 的 join 命令 → 节点被标记为控制平面。
  • 从节点 containerd CRI 未正确配置 → 报 unknown service runtime.v1.RuntimeService。

7. 检查集群状态

kubectl get nodes -w # 等待约 1 分钟,所有节点变为 Ready
kubectl get pods -A # 所有系统组件(coredns, flannel)应为 Running

成功状态示例:

NAME           STATUS   ROLES                  AGE     VERSION
k8s-master     Ready    control-plane          9d      v1.31.14
k8s-worker-01  Ready    node                   9d      v1.31.14
k8s-worker-02  Ready    node                   9d      v1.31.14

8. 出现问题以后,如何重新添加节点

第一步:在控制平面节点删除节点

kubectl cordon k8s-worker-01
kubectl drain k8s-worker-01 --ignore-daemonsets --delete-emptydir-data
kubectl delete node k8s-worker-01

第二步:在要删除的节点上重置

sudo kubeadm reset -f
sudo rm -rf /etc/kubernetes
sudo rm -rf /var/lib/kubelet
sudo rm -rf /var/lib/etcd
sudo rm -rf ~/.kube
sudo rm -f /etc/cni/net.d/*
sudo iptables -F && sudo iptables -t nat -F && sudo iptables -t mangle -F && sudo iptables -X
sudo systemctl restart containerd

第三步:重新配置环境

sudo apt update && sudo apt install -y conntrack
sudo rm -f /etc/containerd/config.toml
sudo containerd config default | sudo tee /etc/containerd/config.toml
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
sudo systemctl restart containerd

cat <<EOF | sudo tee /etc/crictl.yaml
runtime-endpoint: unix:///var/run/containerd/containerd.sock
image-endpoint: unix:///var/run/containerd/containerd.sock
timeout: 10
debug: false
EOF

sudo crictl version

第四步:重新加入集群

# 在主节点生成 join 命令
kubeadm token create --print-join-command

# 在目标节点执行
sudo kubeadm join k8s-master:6443 --token xxxxx --discovery-token-ca-cert-hash sha256:xxxxx

# 验证
kubectl get nodes

各类组件作用

架构总览

一个典型的 K8s 集群展示了各组件的归属和协作关系。

控制平面 (Control Plane / Master Node) 组件

控制平面负责管理集群的全局决策(例如调度)、检测和响应集群事件。

1. kube-apiserver
  • 作用:API 服务器是 Kubernetes 集群的前端和网关。它是所有 REST 操作的唯一入口。
  • 节点归属:控制平面节点。
2. etcd
  • 作用:Kubernetes 的'大脑'和持久化存储中心。它是一个一致且高可用的键值数据库,用于存储整个集群的所有配置数据和状态。
  • 节点归属:控制平面节点。
3. kube-scheduler
  • 作用:调度器,负责为 Pod 分配节点。
  • 节点归属:控制平面节点。
4. kube-controller-manager
  • 作用:运行着各种控制器 (Controller) 的守护进程,确保当前状态向期望状态转变。
  • 节点归属:控制平面节点。
5. cloud-controller-manager (可选)
  • 作用:将与特定云平台交互的控制器逻辑解耦出来。
  • 节点归属:控制平面节点。

工作节点 (Worker Node) 组件

工作节点负责运行容器化的应用。每个节点上都必须运行以下组件。

1. kubelet
  • 作用:节点上的'代理'。它接收来自 API Server 的 PodSpec,并确保该 Pod 中描述的容器健康运行。
  • 节点归属:每个工作节点。
2. kube-proxy
  • 作用:网络代理,负责节点上的网络规则,实现 Service 的概念。
  • 节点归属:每个工作节点。
3. 容器运行时 (Container Runtime)
  • 作用:负责运行容器的软件。Kubernetes 通过容器运行时接口 (CRI) 来与不同的运行时交互。
  • 节点归属:每个工作节点。

总结

组件角色
kubectl命令行工具,用户通过它提交 Pod 定义文件
API Server集群的网关。所有请求都必须通过它
etcd集群的唯一可信数据源
Scheduler调度大师。监视未调度的 Pod
Controller Manager大脑。监控资源变化,确保系统状态符合期望
Kubelet节点代理。运行在每个 Node 上
Container Runtime容器引擎(如 containerd, CRI-O)

目录

  1. 注意事项
  2. 框架图
  3. 1. 环境准备
  4. 1. 主机名与 hosts
  5. 2. 关闭 swap
  6. 3. 内核模块与参数
  7. 4. 必须安装 conntrack(否则 kubeadm 预检失败)
  8. 5. 配置时间同步
  9. 6. 安装必要工具
  10. 2. 安装容器运行时节点
  11. 1. 安装 containerd(来自 docker 官方源)
  12. 2. 配置 containerd 使用 systemd cgroup
  13. 3. 配置 crictl 端点(消除 WARN,确保后续命令可靠)
  14. 3. 安装 kubeadm / kubelet / kubectl(所有节点)
  15. 1. 添加 Kubernetes 官方新仓库(以 v1.31 为例)
  16. 2. 安装并锁定版本
  17. kubeadm init 自动创建的组件
  18. kubeadm init 默认部署的附加组件
  19. 4. 初始化主节点(仅主节点)
  20. 1. 确保 etcd 数据目录干净
  21. 2. 执行初始化
  22. 3. 配置 kubectl
  23. 4. 优化 etcd 配置(移除 resources.requests,避免 CPU 争抢)
  24. 5. 安装网络插件
  25. 6. 加入工作节点(仅从节点)
  26. 1. 从节点上确保 containerd 配置正确,且 conntrack 已安装
  27. 2. 主节点上生成 join 命令
  28. 3. 从节点上执行得到的 join 命令(示例)
  29. 7. 检查集群状态
  30. 8. 出现问题以后,如何重新添加节点
  31. 第一步:在控制平面节点删除节点
  32. 第二步:在要删除的节点上重置
  33. 第三步:重新配置环境
  34. 第四步:重新加入集群
  35. 在主节点生成 join 命令
  36. 在目标节点执行
  37. 验证
  38. 各类组件作用
  39. 架构总览
  40. 控制平面 (Control Plane / Master Node) 组件
  41. 1. kube-apiserver
  42. 2. etcd
  43. 3. kube-scheduler
  44. 4. kube-controller-manager
  45. 5. cloud-controller-manager (可选)
  46. 工作节点 (Worker Node) 组件
  47. 1. kubelet
  48. 2. kube-proxy
  49. 3. 容器运行时 (Container Runtime)
  50. 总结

更多推荐文章

查看全部
  • 归并排序实战:计算右侧小于当前元素个数与翻转对
  • OpenClaw 智能体生态崛起及百度腾讯布局解析
  • 软件性能测试、分析与优化的方法论
  • A* 搜索算法是什么?
  • Spring 基于注解配置的 AOP 使用与声明式事务控制
  • 基于 OpenClaw 搭建 QQ AI 办公机器人:关键词触发与邮件发送
  • Python 列表内存存储本质:差异原因与优化建议
  • 本地部署大语言模型指南:使用 Ollama 运行开源模型
  • 二分查找应用:山峰数组的峰顶索引与寻找峰值
  • Vue3 History 模式部署报错:Unexpected Token 问题排查
  • Obsidian接入AI完整配置指南
  • Qwen3 模型 LoRA 微调实战(基于 LLaMA-Factory)
  • MySQL 8.0 Windows 安装配置实战指南
  • Stable Diffusion WebUI 云端环境搭建与参数调优实战
  • Go2 机器人 ROS2 与 Gazebo 仿真环境搭建指南
  • 前端国际化最佳实践
  • AI自动化测试(一)
  • Stable Diffusion Aki v4 整合包本地部署指南
  • GitHub Copilot Pro 学生身份认证与配置指南
  • 前缀和技巧实战:和为 K 及可被 K 整除的子数组统计

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online