技术教程

Kubernetes生产实践:从入门到运维的完整指南

全面覆盖Kubernetes生产环境的部署、调优、安全加固和故障排查实践

折腾侠
2026/03/18 发布
31约 5 分钟931 字 / 541 词00

前言

Kubernetes(K8s)已经成为容器编排的行业标准。但从学会基本操作到真正用好K8s管理生产环境,中间还有很长的路要走。本文将覆盖生产环境K8s的关键知识点:集群架构、工作负载管理、资源调优、安全加固和故障排查。

一、K8s核心架构回顾

1.1 控制平面(Control Plane)

  • kube-apiserver:集群的入口,所有操作都通过API Server进行
  • etcd:分布式键值存储,保存集群的所有状态数据
  • kube-scheduler:决定Pod被调度到哪个节点
  • kube-controller-manager:运行各种控制器,确保集群状态符合期望

1.2 工作节点(Worker Node)

  • kubelet:在每个节点上运行,负责Pod的生命周期管理
  • kube-proxy:维护网络规则,实现Service的负载均衡
  • Container Runtime:运行容器,默认是containerd

二、工作负载管理

2.1 Deployment vs StatefulSet vs DaemonSet

Deployment适合无状态应用:

YAML
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 3
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  template:
    spec:
      containers:
      - name: nginx
        image: nginx:1.25
        resources:
          requests:
            cpu: 100m
            memory: 128Mi
          limits:
            cpu: 500m
            memory: 512Mi

StatefulSet适合有状态应用(数据库、消息队列):Pod有稳定的网络标识(pod-0, pod-1),有序启动和终止,支持持久化存储。

DaemonSet确保每个节点都运行一个Pod实例,适合日志收集、监控代理等基础设施组件。

2.2 Health Check深度配置

YAML
livenessProbe:
  httpGet:
    path: /health
    port: 8080
  initialDelaySeconds: 30
  periodSeconds: 10
  failureThreshold: 3
readinessProbe:
  httpGet:
    path: /ready
    port: 8080
  initialDelaySeconds: 10
  periodSeconds: 5
startupProbe:
  httpGet:
    path: /health
    port: 8080
  failureThreshold: 30
  periodSeconds: 10

三种探针的区别:

  • liveness:检测应用是否存活,失败则重启Pod
  • readiness:检测应用是否就绪,失败则从Service中摘除
  • startup:给启动慢的应用更多时间,防止被liveness误杀

三、资源管理与调度

3.1 Resource Requests和Limits

生产环境必须为所有容器设置资源请求和限制。

Requests影响调度决策——scheduler根据requests决定Pod能否放到某个节点。Limits防止资源滥用——超过CPU limit会被限速,超过Memory limit会被OOM Kill。

最佳实践:基于VPA(Vertical Pod Autoscaler)的推荐值设置,或通过压测得到合理值。

3.2 HPA水平自动扩缩容

YAML
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: my-app-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-app
  minReplicas: 2
  maxReplicas: 20
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 60
  - type: Pods
    pods:
      metric:
        name: requests_per_second
      target:
        type: AverageValue
        averageValue: "1000"

3.3 Pod亲和性与反亲和性

将应用的多个副本分散到不同节点,提升可用性:

YAML
affinity:
  podAntiAffinity:
    preferredDuringSchedulingIgnoredDuringExecution:
    - weight: 100
      podAffinityTerm:
        labelSelector:
          matchExpressions:
          - key: app
            operator: In
            values:
            - my-app
        topologyKey: kubernetes.io/hostname

四、安全加固

4.1 RBAC(基于角色的访问控制)

最小权限原则——每个ServiceAccount只赋予必要的权限:

YAML
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: pod-reader
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list", "watch"]

4.2 NetworkPolicy

默认K8s中Pod间可以互相访问。NetworkPolicy可以限制网络流量:

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

先拒绝所有,再按需放行——这是零信任网络的基础。

4.3 Pod Security Standards

避免容器以root用户运行:

YAML
securityContext:
  runAsNonRoot: true
  runAsUser: 1000
  readOnlyRootFilesystem: true
  allowPrivilegeEscalation: false
  capabilities:
    drop:
    - ALL

4.4 Secret管理

不要将Secret明文存储在代码库。推荐方案:

  • External Secrets Operator:从AWS Secrets Manager、HashiCorp Vault等同步Secret
  • Sealed Secrets:加密后可以安全提交到Git

五、可观测性

5.1 Prometheus + Grafana

核心指标监控栈。关键K8s指标:

  • INLINE_CODE_0:资源请求量
  • INLINE_CODE_1:Pod状态分布
  • INLINE_CODE_2:节点可用内存
  • INLINE_CODE_3:API Server响应延迟

5.2 结构化日志与日志聚合

推荐JSON格式的结构化日志,便于查询和分析。使用Fluent Bit或Vector收集日志,发送到Elasticsearch或Loki。

5.3 分布式追踪

OpenTelemetry已经成为追踪数据采集的标准。配合Jaeger或Tempo进行追踪分析。

六、常见故障排查

6.1 Pod无法启动

Bash
# 查看Pod状态
kubectl describe pod <pod-name>

# 查看容器日志
kubectl logs <pod-name> --previous

# 常见原因:
# - ImagePullBackOff:镜像拉取失败(检查镜像名、registry凭证)
# - CrashLoopBackOff:容器频繁崩溃(检查应用日志)
# - Pending:资源不足或节点亲和性约束
# - OOMKilled:内存不足,需要增加Memory Limit

6.2 Service不通

Bash
# 检查Endpoints是否正确
kubectl get endpoints <service-name>

# 测试DNS解析
kubectl run -it --rm debug --image=busybox --restart=Never -- nslookup <service-name>

# 检查NetworkPolicy是否阻断了流量
kubectl get networkpolicy

6.3 节点Not Ready

Bash
# 查看节点状态
kubectl describe node <node-name>

# 常见原因:
# - kubelet服务停止
# - 节点内存/磁盘压力
# - 网络问题

七、生产环境最佳实践清单

  • ✅ 控制平面至少3个节点(奇数,保证etcd多数派选举)
  • ✅ 所有容器设置Resource Requests和Limits
  • ✅ 配置liveness、readiness和startup探针
  • ✅ 使用PodDisruptionBudget保证滚动更新时的可用性
  • ✅ 重要应用设置podAntiAffinity分散到不同节点
  • ✅ 开启RBAC,最小权限原则
  • ✅ 配置NetworkPolicy
  • ✅ 定期备份etcd
  • ✅ 开启审计日志(Audit Log)
  • ✅ 节点定期更新,及时修补安全漏洞

结语

Kubernetes生产运维是一个持续学习的过程。掌握核心原理、建立可观测性体系、建立规范的操作流程,才能在生产环境中从容应对各种挑战。

分享到:

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

加载评论中...