Kubernetes 生产环境部署指南:从入门到精通的完整实践
本文基于真实生产环境经验,详细介绍 Kubernetes 集群的规划、部署、配置优化及运维最佳实践,涵盖架构设计、网络配置、存储方案、安全加固、监控告警等关键环节,适合有一定容器基础的开发者和运维工程师参考。
Kubernetes 生产环境部署指南:从入门到精通的完整实践
本文基于真实生产环境经验,详细介绍 Kubernetes 集群的规划、部署、配置优化及运维最佳实践。适合有一定容器基础的开发者和运维工程师。
前言
Kubernetes 已经成为容器编排的事实标准,但很多团队在生产环境部署时仍然会遇到各种问题:网络配置错误、存储持久化失败、资源配额不合理、安全配置缺失等。
本文将从零开始,带你完整经历一个生产级 Kubernetes 集群的部署全过程,包括架构规划、环境准备、集群部署、网络配置、存储方案、安全加固以及监控告警等关键环节。
一、架构规划
1.1 集群规模设计
在生产环境中,集群规模需要根据业务负载进行合理规划:
| 组件 | 最小配置 | 推荐配置 | 说明 |
|---|---|---|---|
| Master 节点 | 2 核 4GB | 4 核 8GB | 至少 3 节点保证高可用 |
| Worker 节点 | 2 核 4GB | 8 核 16GB+ | 根据业务负载弹性扩展 |
| etcd 节点 | 2 核 4GB | 4 核 8GB | SSD 存储,低延迟网络 |
1.2 网络规划
生产环境网络规划需要考虑以下几个方面:
- Pod CIDR: 建议使用 INLINE_CODE_0 或更大的网段
- Service CIDR: 建议使用 INLINE_CODE_1
- 节点网络: 确保节点间网络互通,延迟低于 1ms
1.3 存储规划
- 系统盘: 至少 100GB SSD
- 数据盘: 根据业务需求,建议使用独立云盘或本地 SSD
- 备份策略: 定期快照 + 异地备份
二、环境准备
2.1 系统要求
所有节点需要满足以下基本要求:
# 关闭 Swap
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
# 关闭防火墙(或使用自定义规则)
sudo systemctl disable --now firewalld
# 配置内核参数
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
2.2 安装容器运行时
推荐使用 containerd:
# 安装 containerd
sudo apt-get update
sudo apt-get install -y containerd
# 生成默认配置
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
# 修改 SystemdCgroup = true
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
# 重启 containerd
sudo systemctl restart containerd
2.3 安装 Kubernetes 组件
# 添加 Kubernetes 仓库
curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/kubernetes-archive-keyring.gpg
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
# 安装 kubeadm, kubelet, kubectl
sudo apt-get update
sudo apt-get install -y kubelet=1.29.0-00 kubeadm=1.29.0-00 kubectl=1.29.0-00
sudo apt-mark hold kubelet kubeadm kubectl
三、集群部署
3.1 初始化 Master 节点
在第一个 Master 节点执行:
sudo kubeadm init \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--control-plane-endpoint "lb.k8s.example.com:6443" \
--upload-certs
# 保存输出中的 join 命令和证书密钥
配置 kubectl:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
3.2 部署网络插件
推荐使用 Calico:
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml
或者使用 Flannel:
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
3.3 加入 Worker 节点
在所有 Worker 节点执行 kubeadm init 输出的 join 命令:
sudo kubeadm join lb.k8s.example.com:6443 \
--token <token> \
--discovery-token-ca-cert-hash sha256:<hash>
3.4 验证集群状态
kubectl get nodes
kubectl get pods -n kube-system
四、存储配置
4.1 StorageClass 配置
创建默认 StorageClass:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: standard
annotations:
storageclass.kubernetes.io/is-default-class: "true"
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
4.2 持久卷配置
示例:创建 MySQL 持久化存储
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: standard
五、安全加固
5.1 RBAC 配置
创建最小权限的服务账号:
apiVersion: v1
kind: ServiceAccount
metadata:
name: app-service-account
namespace: production
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: app-role
namespace: production
rules:
- apiGroups: [""]
resources: ["pods", "services"]
verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: app-role-binding
namespace: production
subjects:
- kind: ServiceAccount
name: app-service-account
namespace: production
roleRef:
kind: Role
name: app-role
apiGroup: rbac.authorization.k8s.io
5.2 NetworkPolicy 配置
限制 Pod 间网络访问:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-ingress
namespace: production
spec:
podSelector: {}
policyTypes:
- Ingress
5.3 Pod 安全策略
使用 Pod Security Standards:
apiVersion: v1
kind: Namespace
metadata:
name: production
labels:
pod-security.kubernetes.io/enforce: restricted
pod-security.kubernetes.io/audit: restricted
pod-security.kubernetes.io/warn: restricted
六、监控与告警
6.1 部署 Prometheus Stack
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install monitoring prometheus-community/kube-prometheus-stack \
--namespace monitoring \
--create-namespace
6.2 配置告警规则
创建自定义告警规则:
groups:
- name: k8s.rules
rules:
- alert: HighPodRestartRate
expr: rate(kube_pod_container_status_restarts_total[15m]) * 60 * 5 > 3
for: 5m
labels:
severity: warning
annotations:
summary: Pod {{ $labels.pod }} 频繁重启
description: Pod 在过去 5 分钟内重启超过 3 次
6.3 日志收集
部署 EFK/ELK Stack:
helm repo add elastic https://helm.elastic.co
helm install elasticsearch elastic/elasticsearch
helm install fluent-bit elastic/fluent-bit
helm install kibana elastic/kibana
七、运维最佳实践
7.1 备份策略
- etcd 备份: 每小时快照,保留 7 天
- 资源配置备份: 使用 Velero 定期备份
- 应用数据备份: 根据业务需求定制
7.2 升级策略
- 先在测试环境验证
- 使用滚动升级,控制并发数
- 准备好回滚方案
7.3 故障排查
常用排查命令:
# 查看节点状态
kubectl describe node <node-name>
# 查看 Pod 详情
kubectl describe pod <pod-name> -n <namespace>
# 查看 Pod 日志
kubectl logs <pod-name> -n <namespace> [-c <container>]
# 进入 Pod 调试
kubectl exec -it <pod-name> -n <namespace> -- /bin/bash
# 查看事件
kubectl get events -n <namespace> --sort-by='.lastTimestamp'
总结
Kubernetes 生产环境部署是一个系统工程,需要综合考虑架构设计、安全配置、监控告警、备份恢复等多个方面。本文提供的是一套经过生产验证的最佳实践方案,但每个团队的实际需求可能不同,建议根据自身情况进行调整。
关键要点总结:
- 规划先行: 充分评估业务需求,合理规划集群规模
- 安全第一: 从网络、存储、访问控制多维度加固
- 监控完备: 建立完善的监控告警体系
- 备份可靠: 定期备份,定期演练恢复流程
- 文档完善: 记录所有配置和操作流程
希望本文能帮助你的团队顺利部署生产级 Kubernetes 集群。如有问题,欢迎在评论区交流讨论。
参考资料