Kubernetes 环境搭建完全指南(kubeadm 部署)

Kubernetes 环境搭建完全指南(kubeadm 部署)

Someone Lv5

本文详细介绍如何在 Ubuntu 22.04 上使用 kubeadm 搭建一个生产级别的 Kubernetes 集群,涵盖环境准备、容器运行时安装、集群初始化、网络插件配置、Worker 节点加入以及集群管理工具安装。

一、Kubernetes 与 kubeadm 简介

Kubernetes(简称 K8s)是目前最流行的容器编排平台,而 kubeadm 是 Kubernetes 官方提供的集群快速搭建工具,它屏蔽了底层复杂的证书生成、组件配置和集群引导过程,使得我们能够在几分钟内搭建一个符合最佳实践的集群。

核心架构概览

一个标准的 Kubernetes 集群由以下核心组件组成:

组件类型组件名称功能说明
Control Planekube-apiserver集群 API 入口,所有组件和客户端的请求枢纽
kube-controller-manager控制器管理器,维护集群期望状态
kube-scheduler调度器,将 Pod 分配到合适的 Node
etcd分布式键值存储,保存集群全部数据
Worker Nodekubelet节点代理,负责 Pod 和容器的生命周期管理
kube-proxy网络代理,实现 Service 的负载均衡和网络规则
CRI 运行时容器运行时接口实现,如 containerd

二、环境准备

2.1 节点规划

本指南以三台 Ubuntu 22.04 服务器为例(实际生产环境建议 Control Plane 至少 3 节点实现高可用):

主机名IP 地址角色最低配置
k8s-master192.168.1.10Control Plane2C / 4G / 40GB
k8s-node1192.168.1.11Worker Node2C / 4G / 40GB
k8s-node2192.168.1.12Worker Node2C / 4G / 40GB

2.2 基础系统配置(所有节点)

所有节点 上执行以下配置:

a) 设置主机名与 hosts

1
2
3
4
5
6
# Control Plane
sudo hostnamectl set-hostname k8s-master

# Worker 节点分别执行
sudo hostnamectl set-hostname k8s-node1
sudo hostnamectl set-hostname k8s-node2
1
2
3
4
5
6
# 所有节点添加 hosts 解析
sudo tee -a /etc/hosts << 'EOF'
192.168.1.10 k8s-master
192.168.1.11 k8s-node1
192.168.1.12 k8s-node2
EOF

b) 禁用 Swap

Kubernetes 要求禁用 Swap,否则 kubelet 无法正常工作:

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

验证:free -h 输出中 Swap 应为 0。

c) 加载内核模块

1
2
3
4
5
6
7
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

d) 配置内核参数

1
2
3
4
5
6
7
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

e) 关闭防火墙(或放行必要端口)

1
2
# 简单起见关闭防火墙(生产环境建议精确放行端口)
sudo ufw disable

如果需要在生产环境保留防火墙,请放行以下端口:

节点角色端口用途
Control Plane6443Kubernetes API Server
2379-2380etcd 客户端/对等通信
10250kubelet API
10259kube-scheduler
10257kube-controller-manager
所有节点30000-32767NodePort 服务端口范围
10250kubelet

2.3 安装容器运行时(所有节点)

Kubernetes 1.24+ 已移除对 Docker 的默认支持,推荐使用 containerd:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 安装 containerd
sudo apt-get update
sudo apt-get install -y containerd

# 生成默认配置
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml

# 启用 SystemdCgroup(关键!)
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml

# 使用阿里云镜像加速(国内环境)
sudo sed -i 's|sandbox_image = "registry.k8s.io/pause:3.8"|sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"|' /etc/containerd/config.toml

# 重启 containerd
sudo systemctl restart containerd
sudo systemctl enable containerd

三、安装 kubeadm、kubelet 和 kubectl(所有节点)

3.1 添加 Kubernetes APT 源

1
2
3
4
5
6
7
8
9
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gpg

# 添加阿里云镜像源(国内环境加速)
curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/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://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/deb/ /" |
sudo tee /etc/apt/sources.list.d/kubernetes.list

3.2 安装组件

1
2
3
sudo apt-get update
sudo apt-get install -y kubelet=1.30.0-1.1 kubeadm=1.30.0-1.1 kubectl=1.30.0-1.1
sudo apt-mark hold kubelet kubeadm kubectl

使用 apt-mark hold 锁定版本,避免意外升级导致集群版本不一致。

验证安装:

1
2
kubeadm version
kubectl version --client

四、初始化 Control Plane

4.1 生成配置文件并初始化

在 Control Plane 节点(k8s-master)上执行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 创建 kubeadm 配置文件
cat <<EOF | sudo tee kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1beta3
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: "192.168.1.10"
bindPort: 6443
---
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: "v1.30.0"
imageRepository: "registry.aliyuncs.com/google_containers"
networking:
podSubnet: "10.244.0.0/16"
serviceSubnet: "10.96.0.0/12"
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: "iptables"
EOF
1
sudo kubeadm init --config=kubeadm-config.yaml

4.2 配置 kubectl

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

4.3 保存加入令牌

初始化成功后,屏幕会输出类似以下的信息,务必保存

1
2
kubeadm join 192.168.1.10:6443 --token xxxxxx \
--discovery-token-ca-cert-hash sha256:xxxxxx

如果令牌过期,可以在 Control Plane 上重新生成:

1
kubeadm token create --print-join-command

五、安装网络插件

Kubernetes 集群需要安装 CNI(Container Network Interface)插件来实现 Pod 间的网络通信。推荐使用 Flannel 或 Calico。

5.1 部署 Flannel

1
2
3
4
# 使用阿里云镜像加速(国内环境)
curl -fsSL https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml -O
sed -i 's|docker.io/flannel|registry.aliyuncs.com/k8sxio/flannel|g' kube-flannel.yml
kubectl apply -f kube-flannel.yml

5.2 验证网络状态

1
2
3
4
5
6
# 查看所有 Pod 状态
kubectl get pods -n kube-flannel
kubectl get pods -n kube-system

# 查看节点状态(Control Plane Ready)
kubectl get nodes

当 Control Plane 节点状态为 Ready 时,说明网络插件配置成功。

六、Worker 节点加入集群

每个 Worker 节点 上执行之前保存的 join 命令:

1
2
sudo kubeadm join 192.168.1.10:6443 --token xxxxxx \
--discovery-token-ca-cert-hash sha256:xxxxxx

回到 Control Plane 验证节点加入状态:

1
kubectl get nodes

预期输出:

1
2
3
4
NAME          STATUS   ROLES           AGE   VERSION
k8s-master Ready control-plane 10m v1.30.0
k8s-node1 Ready <none> 2m v1.30.0
k8s-node2 Ready <none> 1m v1.30.0

七、集群验证

7.1 部署测试应用

1
2
kubectl create deployment nginx --image=nginx:alpine --replicas=3
kubectl expose deployment nginx --port=80 --type=NodePort

7.2 检查 Pod 分布

1
2
# 查看各节点上的 Pod
kubectl get pods -o wide

7.3 测试服务访问

1
2
3
4
5
# 获取 NodePort
kubectl get svc nginx

# 从任意节点访问
curl http://任意节点IP:NodePort

访问成功说明集群正常工作。

八、集群管理工具安装

8.1 安装 Helm(包管理器)

1
2
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
helm version

8.2 安装 Kubernetes Dashboard(可选)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 安装 Dashboard
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v3.0.1/charts/kubernetes-dashboard.yaml

# 创建管理员用户
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
EOF

# 获取访问令牌
kubectl -n kubernetes-dashboard create token admin-user

Access Dashboard via: http://ControlPlaneIP:NodePort

8.3 安装 Metrics Server

1
2
3
4
5
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

# 如果证书问题导致无法启动,添加 --kubelet-insecure-tls 参数
kubectl edit deployment metrics-server -n kube-system
# 在 args 中添加 --kubelet-insecure-tls

九、集群管理与监控命令速查

操作场景命令说明
节点管理kubectl get nodes -o wide查看所有节点详情
节点维护kubectl cordon <node>标记节点为不可调度
节点排空kubectl drain <node> --ignore-daemonsets --delete-emptydir-data迁移 Pod 后下线节点
Pod 管理kubectl get pods -A -o wide查看所有命名空间的 Pod 详情
Pod 日志kubectl logs -f <pod> -n <namespace>实时查看 Pod 日志
Pod 调试kubectl exec -it <pod> -- /bin/sh进入容器内部
集群信息kubectl cluster-info查看集群 API 地址
组件状态kubectl get componentstatuses查看 Control Plane 健康状态
资源监控kubectl top nodes查看节点资源使用情况

十、常见问题排查

10.1 kubelet 无法启动

检查 kubelet 日志:

1
journalctl -xeu kubelet --no-pager | tail -50

常见原因:

  • Swap 未禁用 → 检查 free -h 并重新执行 swapoff -a
  • containerd 未正确配置 → 确保 /etc/containerd/config.tomlSystemdCgroup = true
  • 镜像拉取失败 → 检查 crictl images 确认 pause 镜像存在

10.2 节点 NotReady

1
kubectl describe node k8s-node1

常见原因及解决:

  • CNI 插件未部署 → 安装 Flannel/Calico
  • kubelet 证书过期 → kubeadm reset && kubeadm join ...
  • 节点间网络不通 → 检查 iptables/firewalld 状态

10.3 Pod 一直 Pending

1
kubectl describe pod <pod-name> -n <namespace>

常见原因:

  • 节点资源不足 → kubectl describe node 检查可分配资源
  • 没有匹配的节点标签/污点 → 检查 nodeSelectortolerations
  • PVC 未绑定 → 检查 PV/PVC 状态

10.4 集群重置(当需要重新初始化时)

1
2
3
4
5
6
7
# 在所有需要重置的节点上执行
sudo kubeadm reset -f

# 清除网络配置
sudo rm -rf /etc/cni/net.d
sudo rm -rf $HOME/.kube/config
sudo iptables -F && sudo iptables -t nat -F && sudo iptables -t mangle -F

总结

本文详细介绍了使用 kubeadm 在 Ubuntu 22.04 上搭建 Kubernetes v1.30 集群的完整流程,包括:

  1. 环境准备:禁用 Swap、加载内核模块、配置 sysctl、安装 containerd
  2. 组件安装:kubeadm/kubelet/kubectl 安装与版本锁定
  3. 集群初始化:kubeadm init 配置与 CNI 网络插件部署
  4. 节点扩展:Worker 节点加入与验证
  5. 工具安装:Helm/Dashboard/Metrics Server
  6. 日常管理:命令速查与故障排查

熟练掌握 kubeadm 部署流程是进入 Kubernetes 运维世界的第一步,后续可以进一步学习 Ingress Controller 配置、存储持久化方案、Helm Chart 编排以及 GitOps(ArgoCD/Flux)等高级主题。

本文由AI辅助生成,内容仅供参考

  • 标题: Kubernetes 环境搭建完全指南(kubeadm 部署)
  • 作者: Someone
  • 创建于 : 2026-06-12 21:13:00
  • 更新于 : 2026-06-18 08:39:57
  • 链接: https://demo-blog.qusite.cn/2026-06-12-kubernetes-env-setup/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。