跳到主要内容Kubernetes 集群部署指南(Ubuntu 22.04) | 极客日志Shell / Bash
Kubernetes 集群部署指南(Ubuntu 22.04)
综述由AI生成在 Ubuntu 22.04 系统上部署 Kubernetes 集群的完整流程。内容包括环境准备(主机名、Swap 关闭、内核模块配置)、安装容器运行时(containerd)、配置 Kubernetes 组件仓库及安装 kubeadm/kubelet/kubectl。随后演示了主节点初始化、Flannel 网络插件部署、工作节点加入集群以及集群状态检查。此外,还提供了节点重置与重新加入的操作步骤,并解释了 Kubernetes 核心组件(如 API Server、etcd、Scheduler 等)的功能与作用,适合初学者快速搭建本地或测试环境集群。
人间过客18K 浏览 注意事项
本文基于 Ubuntu 22.04 环境,介绍 Kubernetes 集群的搭建步骤。初学者可先完成部署,后续再针对性了解各组件作用。
框架图

1. 环境准备
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
sudo swapoff -a
sudo sed -i '/swap/s/^/#/' /etc/fstab
swapon --show
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
sudo apt update && sudo apt install -y conntrack
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
sudo
sudo
常见错误:未安装 conntrack → 报 [ERROR FileExisting-conntrack]。
2. 安装容器运行时节点
由于此处使用 K8s V1.31,无需安装 Docker,直接使用 containerd。
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
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
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。
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
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-apiserver | Kubernetes API 入口,所有组件和用户操作的唯一入口 |
| kube-controller-manager | 运行各种控制器,确保集群状态与期望一致 |
| kube-scheduler | 负责将新创建的 Pod 调度到合适的节点 |
| etcd | 分布式键值存储,保存所有集群数据 |
此外,kubeadm 还会生成证书、kubeconfig 文件、创建引导令牌及基础资源。
kubeadm init 默认部署的附加组件
这两个组件虽然由 kubeadm 自动部署,但如果 Pod 网络插件未安装,它们会一直处于 Pending 状态。
| 组件 | 说明 | 依赖 |
|---|
| CoreDNS | 集群内部 DNS 服务 | 需要网络插件就绪 |
| kube-proxy | 实现 Service 的负载均衡 | 需要网络插件就绪 |
4. 初始化主节点(仅主节点)
sudo rm -rf /var/lib/etcd
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
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
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!这些参数用于添加控制平面节点,普通工作节点必须省略。
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
kubeadm token create --print-join-command
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
kubectl get pods -A
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
第四步:重新加入集群
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) |
相关免费在线工具
- 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