折腾侠
技术教程

Kubernetes 生产环境部署指南:从入门到精通的完整实践

本文基于真实生产环境经验,详细介绍 Kubernetes 集群的规划、部署、配置优化及运维最佳实践,涵盖架构设计、网络配置、存储方案、安全加固、监控告警等关键环节,适合有一定容器基础的开发者和运维工程师参考。

折腾侠
2026/03/16 发布
28约 6 分钟955 字 / 676 词00

Kubernetes 生产环境部署指南:从入门到精通的完整实践

本文基于真实生产环境经验,详细介绍 Kubernetes 集群的规划、部署、配置优化及运维最佳实践。适合有一定容器基础的开发者和运维工程师。

前言

Kubernetes 已经成为容器编排的事实标准,但很多团队在生产环境部署时仍然会遇到各种问题:网络配置错误、存储持久化失败、资源配额不合理、安全配置缺失等。

本文将从零开始,带你完整经历一个生产级 Kubernetes 集群的部署全过程,包括架构规划、环境准备、集群部署、网络配置、存储方案、安全加固以及监控告警等关键环节。

一、架构规划

1.1 集群规模设计

在生产环境中,集群规模需要根据业务负载进行合理规划:

组件最小配置推荐配置说明
Master 节点2 核 4GB4 核 8GB至少 3 节点保证高可用
Worker 节点2 核 4GB8 核 16GB+根据业务负载弹性扩展
etcd 节点2 核 4GB4 核 8GBSSD 存储,低延迟网络

1.2 网络规划

生产环境网络规划需要考虑以下几个方面:

  • Pod CIDR: 建议使用 INLINE_CODE_0 或更大的网段
  • Service CIDR: 建议使用 INLINE_CODE_1
  • 节点网络: 确保节点间网络互通,延迟低于 1ms

1.3 存储规划

  • 系统盘: 至少 100GB SSD
  • 数据盘: 根据业务需求,建议使用独立云盘或本地 SSD
  • 备份策略: 定期快照 + 异地备份

二、环境准备

2.1 系统要求

所有节点需要满足以下基本要求:

Bash
# 关闭 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:

Bash
# 安装 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 组件

Bash
# 添加 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 节点执行:

Bash
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:

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.2 部署网络插件

推荐使用 Calico:

Bash
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml

或者使用 Flannel:

Bash
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml

3.3 加入 Worker 节点

在所有 Worker 节点执行 kubeadm init 输出的 join 命令:

Bash
sudo kubeadm join lb.k8s.example.com:6443 \
  --token <token> \
  --discovery-token-ca-cert-hash sha256:<hash>

3.4 验证集群状态

Bash
kubectl get nodes
kubectl get pods -n kube-system

四、存储配置

4.1 StorageClass 配置

创建默认 StorageClass:

YAML
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 持久化存储

YAML
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  storageClassName: standard

五、安全加固

5.1 RBAC 配置

创建最小权限的服务账号:

YAML
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 间网络访问:

YAML
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-ingress
  namespace: production
spec:
  podSelector: {}
  policyTypes:
  - Ingress

5.3 Pod 安全策略

使用 Pod Security Standards:

YAML
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

Bash
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 配置告警规则

创建自定义告警规则:

YAML
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:

Bash
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 故障排查

常用排查命令:

Bash
# 查看节点状态
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 生产环境部署是一个系统工程,需要综合考虑架构设计、安全配置、监控告警、备份恢复等多个方面。本文提供的是一套经过生产验证的最佳实践方案,但每个团队的实际需求可能不同,建议根据自身情况进行调整。

关键要点总结:

  1. 规划先行: 充分评估业务需求,合理规划集群规模
  2. 安全第一: 从网络、存储、访问控制多维度加固
  3. 监控完备: 建立完善的监控告警体系
  4. 备份可靠: 定期备份,定期演练恢复流程
  5. 文档完善: 记录所有配置和操作流程

希望本文能帮助你的团队顺利部署生产级 Kubernetes 集群。如有问题,欢迎在评论区交流讨论。


参考资料

分享到:

如果这篇文章对你有帮助,欢迎请作者喝杯咖啡 ☕

加载评论中...