1. Kubernetes 1.27 集群初始化前的关键考量
在开始搭建 Kubernetes 1.27 集群之前,我们需要先明确几个关键决策点。这些选择将直接影响后续的安装流程和集群的长期维护成本。
1.1 集群拓扑结构选择
Kubernetes 集群通常有三种部署模式:
- 单节点开发集群(All-in-One)
- 多节点高可用生产集群
- 混合云/边缘计算集群
对于生产环境,我强烈建议采用至少三个控制平面节点和两个工作节点的配置。这种架构能够确保控制平面的高可用性,即使一个节点宕机也不会影响集群的正常运行。
1.2 容器运行时选择
Kubernetes 1.27 支持多种容器运行时:
- containerd(当前最主流选择)
- CRI-O
- Docker Engine(已弃用)
从性能和维护角度考虑,containerd 是最佳选择。它比 Docker 更轻量,资源占用更少,而且直接实现了 CRI(Container Runtime Interface)规范。
1.3 网络插件选型
CNI(容器网络接口)插件决定了 Pod 之间的通信方式。常见选项包括:
- Calico(功能丰富,适合企业级部署)
- Flannel(配置简单,适合初学者)
- Cilium(基于 eBPF,性能优异)
对于大多数场景,Calico 提供了良好的平衡点。它支持网络策略、IPAM 和 BGP 路由,能满足生产环境的各种需求。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 准备 Kubernetes 1.27 集群部署环境
2.1 系统要求与依赖安装
所有节点(控制平面和工作节点)都需要满足以下最低要求:
- Ubuntu 20.04/22.04 或 CentOS 7/8
- 2GB 以上内存(生产环境建议 8GB+)
- 2 个以上 CPU 核心
- 10GB 以上可用磁盘空间
在所有节点上执行以下基础配置:
bash复制# 禁用交换分区(Kubernetes 强制要求)
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
# 加载内核模块
sudo modprobe overlay
sudo modprobe br_netfilter
# 设置内核参数
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sudo sysctl --system
2.2 容器运行时安装(containerd)
在所有节点上安装 containerd:
bash复制# 安装依赖
sudo apt-get update && sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
# 添加 Docker 官方 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 添加 Docker 仓库
echo "deb [arch=amd64 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
sudo apt-get update && sudo apt-get install -y containerd.io
# 配置 containerd
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
sudo systemctl restart containerd
sudo systemctl enable containerd
注意:如果遇到
_pywrap_tensorflow_common.dll或类似 DLL 初始化错误,通常是因为系统缺少依赖库或环境变量配置不当。Kubernetes 初始化过程中不会出现这类错误,这是 TensorFlow 相关的问题。
3. 安装 Kubernetes 组件
3.1 安装 kubeadm、kubelet 和 kubectl
在所有节点上执行:
bash复制# 添加 Kubernetes 仓库
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
# 安装组件
sudo apt-get update
sudo apt-get install -y kubelet=1.27.0-00 kubeadm=1.27.0-00 kubectl=1.27.0-00
sudo apt-mark hold kubelet kubeadm kubectl
3.2 初始化控制平面
在主节点上执行初始化:
bash复制sudo kubeadm init --kubernetes-version=1.27.0 \
--pod-network-cidr=192.168.0.0/16 \
--apiserver-advertise-address=<主节点IP> \
--control-plane-endpoint=<负载均衡IP或DNS>
初始化完成后,按照提示配置 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
3.3 加入工作节点
在每个工作节点上执行 kubeadm join 命令(命令内容来自主节点初始化时的输出):
bash复制sudo kubeadm join <控制平面IP>:6443 --token <token> \
--discovery-token-ca-cert-hash sha256:<hash>
提示:如果遇到
phase1 initialization failed错误,通常是因为节点间时间不同步或网络连接问题。确保所有节点时间同步(安装并启用 NTP),并且防火墙允许 6443 等必要端口通信。
4. 网络插件安装与集群验证
4.1 安装 Calico 网络插件
在主节点上执行:
bash复制kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/tigera-operator.yaml
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/custom-resources.yaml
4.2 验证集群状态
检查所有组件是否正常运行:
bash复制kubectl get pods -n kube-system
kubectl get nodes
预期输出应显示所有节点状态为 Ready,核心组件(如 etcd、kube-apiserver 等)都处于 Running 状态。
4.3 测试集群功能
部署一个测试应用验证集群功能:
bash复制kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get svc nginx
访问任一节点的 NodePort(通过 kubectl get svc nginx 输出的端口号),应该能看到 Nginx 默认页面。
5. 生产环境关键配置与优化
5.1 证书管理与自动续期
Kubernetes 集群默认证书有效期为 1 年。配置自动续期:
bash复制# 检查证书有效期
kubeadm certs check-expiration
# 启用自动续期
sudo sed -i 's/rotateCertificates: false/rotateCertificates: true/g' /var/lib/kubelet/config.yaml
sudo systemctl restart kubelet
5.2 资源配额与限制
为命名空间设置默认资源限制:
yaml复制apiVersion: v1
kind: LimitRange
metadata:
name: default-limits
spec:
limits:
- default:
cpu: "500m"
memory: "512Mi"
defaultRequest:
cpu: "100m"
memory: "256Mi"
type: Container
5.3 监控与日志收集
部署 Prometheus 和 Grafana 进行监控:
bash复制# 添加 Prometheus 仓库
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
# 安装 kube-prometheus-stack
helm install prometheus prometheus-community/kube-prometheus-stack \
--namespace monitoring \
--create-namespace
6. 常见问题排查与解决
6.1 kubelet 服务无法启动
如果遇到 kubelet 启动失败,检查日志:
bash复制journalctl -xeu kubelet
常见原因包括:
- 容器运行时未正确配置
- 证书问题
- 网络配置错误
6.2 Pod 处于 Pending 状态
使用以下命令诊断:
bash复制kubectl describe pod <pod-name>
kubectl get events --sort-by=.metadata.creationTimestamp
常见原因:
- 资源不足
- 节点选择器不匹配
- PV/PVC 问题
6.3 网络连接问题
检查 Calico 组件状态:
bash复制kubectl get pods -n calico-system
验证网络策略和 IP 分配:
bash复制kubectl get ippools
calicoctl get networkpolicy --all-namespaces
7. 集群维护与升级策略
7.1 定期备份关键数据
备份 etcd 数据:
bash复制# 在控制平面节点上执行
sudo docker run --rm -v /var/lib/etcd:/var/lib/etcd \
-v $(pwd):/backup \
--env ETCDCTL_API=3 \
k8s.gcr.io/etcd:3.5.4-0 \
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 /backup/etcd-snapshot-$(date +%Y%m%d).db
7.2 升级 Kubernetes 版本
升级流程(以 1.27.x 到 1.28.x 为例):
bash复制# 在所有节点上执行
sudo apt-get update
sudo apt-get install -y kubeadm=1.28.0-00
# 在主节点上执行
sudo kubeadm upgrade plan
sudo kubeadm upgrade apply v1.28.0
# 在工作节点上执行
sudo kubeadm upgrade node
# 在所有节点上更新 kubelet 和 kubectl
sudo apt-get install -y kubelet=1.28.0-00 kubectl=1.28.0-00
sudo systemctl restart kubelet
7.3 节点维护与排空
安全移除节点:
bash复制# 排空节点
kubectl drain <node-name> --ignore-daemonsets --delete-emptydir-data
# 维护完成后重新加入
kubectl uncordon <node-name>
在实际操作 Kubernetes 1.27 集群初始化时,我发现有几个关键点特别容易出错:首先是时间同步问题,所有节点必须保持时间一致,否则证书验证会失败;其次是网络插件安装时机,必须在 kubeadm init 之后立即安装,否则 CoreDNS 会一直处于 Pending 状态;最后是防火墙配置,必须确保控制平面和工作节点之间的必要端口是开放的。
