1. Kubernetes 集群架构设计与部署方案
Kubernetes 作为容器编排的事实标准,其主从架构设计是生产环境部署的基础。典型的 1 主多从架构中,控制平面(Master)负责集群管理决策,工作节点(Worker)则承载实际工作负载。这种分离设计既保证了集群管理的稳定性,又能灵活扩展计算资源。
在 Master 节点上,关键组件包括:
- API Server:集群操作的唯一入口
- Scheduler:负责 Pod 调度决策
- Controller Manager:维护集群状态
- etcd:分布式键值存储,保存集群所有配置数据
Worker 节点则运行:
- kubelet:与 Master 通信的节点代理
- kube-proxy:维护网络规则
- 容器运行时(如 Docker/containerd)
生产环境建议 Master 节点配置至少 2核CPU/4GB内存,etcd 需要 SSD 存储保证性能。Worker 节点规格根据工作负载调整,但建议最小 4核CPU/8GB内存。
2. 纯 YAML 声明式部署详解
YAML 作为 Kubernetes 的原生配置语言,其结构化特性完美契合声明式部署理念。一个完整的部署描述通常包含以下关键字段:
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80 resources: limits: cpu: "500m" memory: "512Mi"YAML 文件的核心优势在于:
- 版本可控:配置文件可纳入 Git 管理
- 可重复部署:相同配置保证环境一致性
- 渐进式更新:支持 kubectl apply 增量变更
实际使用中建议为每个资源类型创建独立 YAML 文件,并通过 kustomize 或 Helm 进行组织管理。特别注意缩进必须使用空格而非 Tab。
3. 服务访问原理深度解析
Kubernetes 网络模型实现了 Pod 间直接通信,而服务暴露主要通过以下机制:
ClusterIP(默认):
- 集群内部虚拟 IP
- 通过 kube-proxy 维护 iptables/ipvs 规则
- 典型配置示例:
apiVersion: v1 kind: Service metadata: name: my-service spec: selector: app: MyApp ports: - protocol: TCP port: 80 targetPort: 9376
NodePort:
- 在节点上开放静态端口(30000-32767)
- 流量路径:NodeIP:NodePort → ClusterIP → Pod
LoadBalancer:
- 云厂商提供的负载均衡器集成
- 自动创建外部可访问的 IP
Ingress:
- L7 路由规则管理
- 需要 Ingress Controller 实现(如 Nginx)
- 支持基于域名/path 的路由
4. 生产环境部署全流程实操
4.1 集群初始化(使用 kubeadm)
# Master节点初始化 kubeadm init --pod-network-cidr=10.244.0.0/16 # 工作节点加入 kubeadm join <master-ip>:<port> --token <token> --discovery-token-ca-cert-hash <hash> # 安装网络插件(Flannel示例) kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml4.2 应用部署验证
# 部署示例应用 kubectl apply -f deployment.yaml -f service.yaml # 查看资源状态 kubectl get pods -o wide kubectl get svc kubectl describe pod <pod-name> # 测试服务访问 kubectl port-forward svc/my-service 8080:80 curl http://localhost:80804.3 监控与排错
关键诊断命令:
# 查看组件日志 journalctl -u kubelet -f kubectl logs <pod-name> --previous # 资源监控 kubectl top nodes kubectl top pods # 网络诊断 kubectl run -it --rm debug --image=nicolaka/netshoot -- bash5. 常见问题解决方案
节点 NotReady 状态
- 检查 kubelet 服务状态:
systemctl status kubelet - 验证容器运行时是否正常:
crictl ps - 排查网络插件是否生效:
ip route show
Pod 一直处于 Pending 状态
- 查看调度失败原因:
kubectl describe pod <name> - 检查资源配额:
kubectl describe nodes - 验证节点选择器/污点配置
服务无法访问
- 确认 Endpoints 是否正常:
kubectl get endpoints - 检查 kube-proxy 日志:
kubectl logs -n kube-system <kube-proxy-pod> - 测试直接访问 Pod IP:
kubectl exec -it <pod> -- curl http://<target-pod-ip>
6. 性能调优实践
API Server 优化
- 启用聚合层减少请求量
- 设置 --max-requests-inflight 参数
- 使用 etcd 分片(大型集群)
kubelet 配置
- 设置合理的 --max-pods 参数(默认110)
- 调整 --kube-api-qps 和 --kube-api-burst
- 启用镜像垃圾回收:
--image-gc-high-threshold=85
工作负载优化
- 使用 PodDisruptionBudget 保证可用性
- 配置合理的 readiness/liveness 探针
- 为关键 Pod 设置 QoS Class 为 Guaranteed
我在实际运维中发现,YAML 文件中资源限制的合理配置对集群稳定性影响极大。建议初期设置保守的 requests/limits,通过监控数据逐步调整。对于有状态服务,务必配置适当的 PodAntiAffinity 避免单点故障。