1. Kubernetes集群搭建概述
在当今云原生技术蓬勃发展的背景下,Kubernetes已成为容器编排领域的事实标准。作为一位长期从事云原生技术实践的工程师,我想分享一套经过生产环境验证的Kubernetes集群搭建方案。本文将基于kubeadm工具,使用containerd作为容器运行时,详细讲解从零开始搭建一个高可用Kubernetes集群的全过程。
这个方案特别适合以下场景:
- 企业内部的开发测试环境搭建
- 中小规模生产环境的部署
- 个人学习Kubernetes的实践环境
相比其他搭建方式,kubeadm具有以下优势:
- 官方推荐工具,与Kubernetes版本同步更新
- 自动化程度高,减少手动配置出错概率
- 支持集群生命周期管理(升级、配置变更等)
- 社区支持完善,问题排查资源丰富
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与系统配置
2.1 硬件与系统要求
在开始搭建前,我们需要准备至少三台服务器(1个master节点,2个worker节点)。以下是推荐配置:
| 组件 | 最低配置 | 推荐配置 |
|---|---|---|
| CPU | 2核 | 4核 |
| 内存 | 2GB | 4GB |
| 存储 | 20GB | 50GB |
操作系统建议使用以下任一发行版:
- Ubuntu 20.04/22.04 LTS
- CentOS 7/8
- RHEL 7/8
注意:所有节点需要保持时间同步,建议安装并配置NTP服务
2.2 系统基础配置
在所有节点上执行以下配置:
- 关闭swap分区:
bash复制sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
- 配置内核参数:
bash复制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
- 配置防火墙规则(如果使用firewalld):
bash复制sudo firewall-cmd --permanent --add-port=6443/tcp
sudo firewall-cmd --permanent --add-port=2379-2380/tcp
sudo firewall-cmd --permanent --add-port=10250/tcp
sudo firewall-cmd --permanent --add-port=10259/tcp
sudo firewall-cmd --permanent --add-port=10257/tcp
sudo firewall-cmd --reload
3. 容器运行时与Kubernetes组件安装
3.1 安装containerd
containerd作为轻量级容器运行时,已成为Kubernetes的推荐选择。以下是安装步骤:
- 安装依赖:
bash复制sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
- 添加Docker仓库(containerd包含在Docker包中):
bash复制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
- 安装containerd:
bash复制sudo apt-get update
sudo apt-get install -y containerd.io
- 配置containerd:
bash复制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
3.2 安装kubeadm、kubelet和kubectl
- 添加Kubernetes仓库:
bash复制sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
- 安装组件:
bash复制sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
提示:使用apt-mark hold防止这些包被自动更新,避免版本不一致问题
4. 初始化Kubernetes集群
4.1 主节点初始化
在主节点上执行初始化命令:
bash复制sudo kubeadm init \
--pod-network-cidr=10.244.0.0/16 \
--apiserver-advertise-address=<主节点IP> \
--control-plane-endpoint=<主节点IP或负载均衡地址> \
--upload-certs
命令参数说明:
--pod-network-cidr:指定Pod网络CIDR,需要与后续安装的CNI插件匹配--apiserver-advertise-address:指定API server的广播地址--control-plane-endpoint:高可用集群的控制平面端点--upload-certs:自动上传证书用于其他控制平面节点加入
初始化成功后,会输出类似以下信息:
code复制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
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join <control-plane-host>:<control-plane-port> --token <token> \
--discovery-token-ca-cert-hash sha256:<hash>
按照提示配置kubectl:
bash复制mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
4.2 安装Pod网络插件
这里我们选择Flannel作为网络插件:
bash复制kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
验证网络插件安装:
bash复制kubectl get pods -n kube-system
等待所有Pod状态变为Running。
4.3 工作节点加入集群
在每个工作节点上执行初始化时输出的join命令:
bash复制sudo kubeadm join <control-plane-host>:<control-plane-port> --token <token> \
--discovery-token-ca-cert-hash sha256:<hash>
加入成功后,在主节点上验证节点状态:
bash复制kubectl get nodes
所有节点状态应为Ready。
5. 集群验证与常用配置
5.1 基本功能验证
- 创建测试Pod:
bash复制kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
- 验证服务访问:
bash复制kubectl get svc nginx
访问输出的NodePort端口,应能看到Nginx欢迎页面。
5.2 常用集群配置
- 配置kubectl命令补全:
bash复制echo 'source <(kubectl completion bash)' >> ~/.bashrc
source ~/.bashrc
- 配置kubectl别名(可选):
bash复制echo 'alias k=kubectl' >> ~/.bashrc
echo 'complete -F __start_kubectl k' >> ~/.bashrc
source ~/.bashrc
- 安装metrics-server监控资源使用:
bash复制kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
6. 常见问题排查
6.1 节点NotReady状态
可能原因及解决方案:
-
网络插件未正确安装
- 检查kube-system命名空间中的网络插件Pod是否运行正常
- 重新应用网络插件配置文件
-
容器运行时问题
- 检查containerd服务状态:
systemctl status containerd - 查看容器运行时日志:
journalctl -u containerd
- 检查containerd服务状态:
6.2 Pod卡在Pending状态
排查步骤:
bash复制kubectl describe pod <pod-name>
常见原因:
- 资源不足(CPU/内存)
- 没有满足的节点(节点选择器/污点)
- PVC未绑定
6.3 kubeadm init失败
常见错误处理:
-
端口冲突
- 检查6443、2379-2380等端口是否被占用
- 停止冲突服务或修改kubeadm配置
-
证书问题
- 重置集群:
kubeadm reset - 重新初始化
- 重置集群:
-
CRI连接失败
- 验证containerd socket路径:
/run/containerd/containerd.sock - 检查containerd服务是否运行
- 验证containerd socket路径:
7. 生产环境建议
7.1 高可用配置
对于生产环境,建议配置多控制平面节点:
- 初始化第一个控制平面节点(如前面所述)
- 在其他控制平面节点上执行:
bash复制sudo kubeadm join <control-plane-host>:<control-plane-port> \
--token <token> \
--discovery-token-ca-cert-hash sha256:<hash> \
--control-plane \
--certificate-key <certificate-key>
7.2 集群备份
定期备份关键数据:
- etcd数据备份:
bash复制sudo ETCDCTL_API=3 etcdctl \
--endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
snapshot save snapshot.db
- 备份Kubernetes配置:
bash复制sudo cp -r /etc/kubernetes /backup/kubernetes-$(date +%Y%m%d)
sudo cp -r /var/lib/kubelet /backup/kubelet-$(date +%Y%m%d)
7.3 安全加固建议
- 定期轮换证书:
bash复制sudo kubeadm certs renew all
- 配置RBAC权限控制
- 启用Pod安全策略或Pod安全准入
- 限制kubelet API访问
8. 集群维护与升级
8.1 版本升级策略
Kubernetes版本升级流程:
- 升级kubeadm:
bash复制sudo apt-get update
sudo apt-get install -y kubeadm=<新版本>
- 验证升级计划:
bash复制sudo kubeadm upgrade plan
- 执行升级:
bash复制sudo kubeadm upgrade apply v<新版本>
- 升级节点组件:
bash复制sudo apt-get update
sudo apt-get install -y kubelet=<新版本> kubectl=<新版本>
sudo systemctl restart kubelet
8.2 日常维护命令
- 查看集群状态:
bash复制kubectl get componentstatuses
- 查看节点资源使用:
bash复制kubectl top nodes
- 查看Pod资源使用:
bash复制kubectl top pods
- 查看事件日志:
bash复制kubectl get events --sort-by='.metadata.creationTimestamp'
在实际生产环境中,我们通常会遇到各种网络问题、资源争用和配置错误。经过多次集群部署和维护,我发现以下几点特别重要:
- 在初始化前确保所有节点的时间同步,时间不同步会导致证书验证失败等奇怪问题
- 使用containerd时,注意配置SystemdCgroup=true以兼容systemd
- 生产环境务必配置多控制平面节点,单master节点存在单点故障风险
- 定期备份etcd数据,这是恢复集群的最后保障
