1. 为什么选择kubeadm搭建Kubernetes集群

在容器编排领域,Kubernetes已经成为事实标准。而kubeadm作为官方推荐的集群部署工具,相比其他方案有几个显著优势:

  1. 官方维护 :由Kubernetes社区直接开发和维护,确保与最新版本兼容
  2. 最小化设计 :只提供必要的集群初始化功能,不强制特定配置
  3. 可扩展性 :初始化后可以灵活添加各种插件和组件
  4. 生产就绪 :v1.30.3版本经过充分测试,适合生产环境使用

提示:虽然kubeadm简化了安装过程,但理解其底层原理对后续运维至关重要。这也是为什么我们要详细解析每个步骤的原因。

2. 环境准备与系统配置

2.1 硬件需求建议

对于测试环境,最低配置要求:

  • 2核CPU
  • 2GB内存
  • 20GB磁盘空间

生产环境推荐配置:

  • 4核CPU及以上
  • 8GB内存及以上
  • 100GB SSD存储

2.2 操作系统要求

官方推荐使用以下Linux发行版:

  • Ubuntu 20.04/22.04
  • CentOS 7/8
  • RHEL 7/8
  • Debian 10/11

关键系统配置步骤:

  1. 禁用交换分区:
sudo swapoff -a
sudo sed -i '/ swap / s/^/#/' /etc/fstab
  1. 设置主机名解析:
sudo hostnamectl set-hostname k8s-master
echo "192.168.1.100 k8s-master" | sudo tee -a /etc/hosts
echo "192.168.1.101 k8s-node1" | sudo tee -a /etc/hosts
  1. 加载内核模块:
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

sudo modprobe br_netfilter

3. 容器运行时安装与配置

3.1 容器运行时选型

Kubernetes v1.30.3支持以下容器运行时:

  • containerd(推荐)
  • CRI-O
  • Docker Engine(已弃用)

安装containerd的步骤:

  1. 安装依赖:
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
  1. 添加Docker仓库:
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  1. 安装containerd:
sudo apt-get update
sudo apt-get install -y containerd.io
  1. 配置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 systemctl restart containerd

4. 安装kubeadm、kubelet和kubectl

4.1 添加Kubernetes仓库

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
curl -fsSL https://pkgs.k8s.io/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://pkgs.k8s.io/core:/stable:/v1.30/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list

4.2 安装指定版本组件

sudo apt-get update
sudo apt-get install -y kubelet=1.30.3-1.1 kubeadm=1.30.3-1.1 kubectl=1.30.3-1.1
sudo apt-mark hold kubelet kubeadm kubectl

注意:锁定版本可以防止意外升级导致集群不兼容

5. 初始化控制平面节点

5.1 初始化命令解析

完整的初始化命令示例:

sudo kubeadm init \
  --kubernetes-version=v1.30.3 \
  --pod-network-cidr=10.244.0.0/16 \
  --apiserver-advertise-address=192.168.1.100 \
  --control-plane-endpoint=k8s-master:6443 \
  --upload-certs

关键参数说明:

参数 说明 推荐值
--kubernetes-version 指定K8s版本 v1.30.3
--pod-network-cidr Pod网络CIDR 10.244.0.0/16 (Flannel)
--apiserver-advertise-address API服务器地址 主节点IP
--control-plane-endpoint 控制平面端点 负载均衡器地址或主节点主机名

5.2 初始化后配置

成功初始化后会输出类似以下信息:

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

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

执行这些命令配置kubectl访问权限。

6. 安装Pod网络插件

6.1 网络插件选型

常见选择及特点对比:

插件 特点 适用场景
Flannel 简单稳定,性能一般 测试环境
Calico 功能丰富,支持网络策略 生产环境
Cilium 基于eBPF,高性能 高性能需求

安装Flannel的步骤:

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

7. 加入工作节点

在主节点上获取加入命令:

kubeadm token create --print-join-command

在工作节点上执行输出的命令,格式类似:

sudo kubeadm join k8s-master:6443 --token abcdef.0123456789abcdef \
  --discovery-token-ca-cert-hash sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef

验证节点加入状态:

kubectl get nodes -w

8. 集群验证与基本操作

8.1 集群状态检查

kubectl get pods -A
kubectl get componentstatuses
kubectl cluster-info

8.2 部署测试应用

kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get svc nginx

访问测试:

curl http://<node-ip>:<node-port>

9. 生产环境优化建议

9.1 高可用配置

对于生产环境,建议配置:

  • 至少3个控制平面节点
  • 使用外部etcd集群
  • 配置负载均衡器

添加控制平面节点命令:

kubeadm join k8s-lb:6443 --token abcdef.0123456789abcdef \
  --discovery-token-ca-cert-hash sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef \
  --control-plane --certificate-key abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef

9.2 安全加固

  1. 启用RBAC
  2. 配置网络策略
  3. 定期轮换证书
  4. 启用审计日志

证书轮换命令:

kubeadm certs renew all

10. 常见问题排查

10.1 初始化失败

常见原因及解决方案:

错误现象 可能原因 解决方案
kubelet无法启动 CRI未正确配置 检查containerd状态
API服务器不可用 端口冲突 检查6443端口占用
etcd健康检查失败 证书问题 检查/etc/kubernetes/pki

10.2 节点NotReady状态

排查步骤:

  1. 检查kubelet日志:
journalctl -u kubelet -f
  1. 验证网络插件:
kubectl get pods -n kube-system
  1. 检查节点资源:
kubectl describe node <node-name>

我在实际部署中发现,大多数初始化问题都与容器运行时配置或网络设置有关。特别是在Ubuntu系统上,确保containerd正确配置SystemdCgroup参数至关重要。另一个常见陷阱是忘记在所有节点上禁用交换分区,这会导致kubelet无法正常启动。

更多推荐