Kubernetes生产实践:从入门到运维的完整指南
全面覆盖Kubernetes生产环境的部署、调优、安全加固和故障排查实践
前言
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适合无状态应用:
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深度配置
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水平自动扩缩容
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亲和性与反亲和性
将应用的多个副本分散到不同节点,提升可用性:
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- my-app
topologyKey: kubernetes.io/hostname
四、安全加固
4.1 RBAC(基于角色的访问控制)
最小权限原则——每个ServiceAccount只赋予必要的权限:
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可以限制网络流量:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-ingress
spec:
podSelector: {}
policyTypes:
- Ingress
先拒绝所有,再按需放行——这是零信任网络的基础。
4.3 Pod Security Standards
避免容器以root用户运行:
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无法启动
# 查看Pod状态
kubectl describe pod <pod-name>
# 查看容器日志
kubectl logs <pod-name> --previous
# 常见原因:
# - ImagePullBackOff:镜像拉取失败(检查镜像名、registry凭证)
# - CrashLoopBackOff:容器频繁崩溃(检查应用日志)
# - Pending:资源不足或节点亲和性约束
# - OOMKilled:内存不足,需要增加Memory Limit
6.2 Service不通
# 检查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
# 查看节点状态
kubectl describe node <node-name>
# 常见原因:
# - kubelet服务停止
# - 节点内存/磁盘压力
# - 网络问题
七、生产环境最佳实践清单
- ✅ 控制平面至少3个节点(奇数,保证etcd多数派选举)
- ✅ 所有容器设置Resource Requests和Limits
- ✅ 配置liveness、readiness和startup探针
- ✅ 使用PodDisruptionBudget保证滚动更新时的可用性
- ✅ 重要应用设置podAntiAffinity分散到不同节点
- ✅ 开启RBAC,最小权限原则
- ✅ 配置NetworkPolicy
- ✅ 定期备份etcd
- ✅ 开启审计日志(Audit Log)
- ✅ 节点定期更新,及时修补安全漏洞
结语
Kubernetes生产运维是一个持续学习的过程。掌握核心原理、建立可观测性体系、建立规范的操作流程,才能在生产环境中从容应对各种挑战。