Kubernetes 环境搭建完全指南(kubeadm 部署)
本文详细介绍如何在 Ubuntu 22.04 上使用 kubeadm 搭建一个生产级别的 Kubernetes 集群,涵盖环境准备、容器运行时安装、集群初始化、网络插件配置、Worker 节点加入以及集群管理工具安装。
一、Kubernetes 与 kubeadm 简介
Kubernetes(简称 K8s)是目前最流行的容器编排平台,而 kubeadm 是 Kubernetes 官方提供的集群快速搭建工具,它屏蔽了底层复杂的证书生成、组件配置和集群引导过程,使得我们能够在几分钟内搭建一个符合最佳实践的集群。
核心架构概览
一个标准的 Kubernetes 集群由以下核心组件组成:
| 组件类型 | 组件名称 | 功能说明 |
| Control Plane | kube-apiserver | 集群 API 入口,所有组件和客户端的请求枢纽 |
| kube-controller-manager | 控制器管理器,维护集群期望状态 |
| kube-scheduler | 调度器,将 Pod 分配到合适的 Node |
| etcd | 分布式键值存储,保存集群全部数据 |
| Worker Node | kubelet | 节点代理,负责 Pod 和容器的生命周期管理 |
| kube-proxy | 网络代理,实现 Service 的负载均衡和网络规则 |
| CRI 运行时 | 容器运行时接口实现,如 containerd |
二、环境准备
2.1 节点规划
本指南以三台 Ubuntu 22.04 服务器为例(实际生产环境建议 Control Plane 至少 3 节点实现高可用):
| 主机名 | IP 地址 | 角色 | 最低配置 |
| k8s-master | 192.168.1.10 | Control Plane | 2C / 4G / 40GB |
| k8s-node1 | 192.168.1.11 | Worker Node | 2C / 4G / 40GB |
| k8s-node2 | 192.168.1.12 | Worker Node | 2C / 4G / 40GB |
2.2 基础系统配置(所有节点)
在 所有节点 上执行以下配置:
a) 设置主机名与 hosts
1 2 3 4 5 6
| sudo hostnamectl set-hostname k8s-master
sudo hostnamectl set-hostname k8s-node1 sudo hostnamectl set-hostname k8s-node2
|
1 2 3 4 5 6
| 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) 关闭防火墙(或放行必要端口)
如果需要在生产环境保留防火墙,请放行以下端口:
| 节点角色 | 端口 | 用途 |
| Control Plane | 6443 | Kubernetes API Server |
| 2379-2380 | etcd 客户端/对等通信 |
| 10250 | kubelet API |
| 10259 | kube-scheduler |
| 10257 | kube-controller-manager |
| 所有节点 | 30000-32767 | NodePort 服务端口范围 |
| 10250 | kubelet |
2.3 安装容器运行时(所有节点)
Kubernetes 1.24+ 已移除对 Docker 的默认支持,推荐使用 containerd:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| sudo apt-get update sudo apt-get install -y containerd
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 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
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
| 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
| kubectl get pods -n kube-flannel kubectl get pods -n kube-system
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 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
| kubectl get pods -o wide
|
7.3 测试服务访问
1 2 3 4 5
| 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
| 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
kubectl edit deployment metrics-server -n kube-system
|
九、集群管理与监控命令速查
| 操作场景 | 命令 | 说明 |
| 节点管理 | 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.toml 中 SystemdCgroup = 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 检查可分配资源
- 没有匹配的节点标签/污点 → 检查
nodeSelector 和 tolerations
- 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 集群的完整流程,包括:
- 环境准备:禁用 Swap、加载内核模块、配置 sysctl、安装 containerd
- 组件安装:kubeadm/kubelet/kubectl 安装与版本锁定
- 集群初始化:kubeadm init 配置与 CNI 网络插件部署
- 节点扩展:Worker 节点加入与验证
- 工具安装:Helm/Dashboard/Metrics Server
- 日常管理:命令速查与故障排查
熟练掌握 kubeadm 部署流程是进入 Kubernetes 运维世界的第一步,后续可以进一步学习 Ingress Controller 配置、存储持久化方案、Helm Chart 编排以及 GitOps(ArgoCD/Flux)等高级主题。
本文由AI辅助生成,内容仅供参考