
云原生时代Kubernetes已成为容器编排的事实标准。要稳定、高效地运维一个Kubernetes集群,需要掌握从资源管理到故障排查的全方位技能。本文基于实际运维经验,结合开发与运维场景,分享Kubernetes运维的关键要点和实战示例。
在团队协作环境中,为不同项目或部门划分命名空间并设置资源配额至关重要。这不仅能防止资源滥用,还能确保关键应用获得足够资源。
场景示例: 为测试环境设置资源配额,防止测试应用占用过多资源影响生产服务。
apiVersion: v1
kind: ResourceQuota
metadata:
name: quota-test
namespace: test
spec:
hard:
requests.cpu: "2"
requests.memory: 2Gi
limits.cpu: "4"
limits.memory: 4Gi
pods: "10"
services: "5"开发场景: Java应用内存配置估算
对于Java应用,合理的内存配置能避免OOM问题:
运维建议: 关键服务设置 limits == requests ,确保Pod不会被意外驱逐。
Kubernetes根据Pod的资源配置分配QoS等级,直接影响资源紧张时的驱逐优先级:
# Guaranteed等级(最高优先级)
resources:
requests:
memory: "256Mi"
cpu: "250m"
limits:
memory: "256Mi"
cpu: "250m"
# Burstable等级(中等优先级)
resources:
requests:
memory: "128Mi"
cpu: "125m"
limits:
memory: "256Mi"
cpu: "250m"
# BestEffort等级(最低优先级)
# 不设置requests和limits运维场景: 节点资源紧张时,系统会按照BestEffort → Burstable → Guaranteed的顺序驱逐Pod。
健康检查是确保应用可用性的关键手段:
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 30 # 应用启动时间
periodSeconds: 10 # 检查间隔
timeoutSeconds: 5 # 超时时间
failureThreshold: 3 # 失败阈值
readinessProbe:
exec:
command:
- /bin/sh
- -c
- curl -f http://localhost:8080/ready
initialDelaySeconds: 5
periodSeconds: 5开发场景: 应用启动需要初始化数据库连接,设置合理的 initialDelaySeconds 避免误判。
运维场景: 零停机更新应用
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 25% # 最多25%的Pod不可用
maxSurge: 25% # 最多可创建125%的Pod数量示例: 有4个副本的应用,升级过程中:
开发与运维协作场景: 避免使用旧镜像
imagePullPolicy: Always # 总是检查镜像仓库问题场景: 开发更新了镜像但未修改标签,使用 IfNotPresent 策略会导致节点继续使用旧镜像。
运维场景: 为特殊节点(如GPU节点、高IO节点)设置污点
# 为GPU节点添加污点
kubectl taint nodes gpu-node-1 gpu=true:NoSchedule
# 应用配置容忍
tolerations:
- key: "gpu"
operator: "Equal"
value: "true"
effect: "NoSchedule"Kubernetes在节点资源紧张时会自动驱逐Pod,默认触发条件:
运维操作: 手动维护节点
# 设置节点不可调度
kubectl cordon node1
# 安全驱逐所有Pod
kubectl drain node1 --ignore-daemonsets
# 恢复节点
kubectl uncordon node1完整的Kubernetes监控应包含:
运维场景: 配置HPA实现自动扩缩容
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: user-service-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: user-service
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 80开发调试场景: 应用日志接入
# 日志服务配置示例
env:
- name: aliyun_logs_app-logs
value: /var/log/app/*.log
- name: aliyun_logs_app-stdout
value: stdout常见Pod状态及排查方法:
1、Pending状态
2、CrashLoopBackOff状态
3、ImagePullBackOff状态
运维优化场景: 部署NodeLocal DNS Cache提升DNS解析性能
# 部署NodeLocal DNS Cache
kubectl apply -f https://github.com/kubernetes/kubernetes/blob/master/cluster/addons/dns/nodelocaldns/nodelocaldns.yaml效果: 减少DNS查询延迟,提升服务发现性能约40%。
根据团队规模和技术栈选择合适的集群管理工具:
1、小型团队/个人使用:
2、企业级管理:
在团队协作中,基于角色的访问控制(RBAC)是限制用户和服务账户权限的核心机制。
运维场景:为不同团队分配命名空间级别的权限
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: team-a
name: pod-manager
rules:
- apiGroups: [""]
resources: ["pods", "pods/log"]
verbs: ["get", "list", "watch", "create", "update", "delete"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
namespace: team-a
name: pod-manager-binding
subjects:
- kind: User
name: alice
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: pod-manager
apiGroup: rbac.authorization.k8s.io通过NetworkPolicy实现微服务间的网络隔离,遵循最小权限原则。
开发场景:只允许前端服务访问后端API
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: backend-allow-frontend
spec:
podSelector:
matchLabels:
app: backend
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: frontend
ports:
- protocol: TCP
port: 8080使用Secret和ConfigMap管理敏感信息与配置,避免硬编码。
运维最佳实践:
kubectl create secret generic创建Secret,并挂载到Pod。根据应用需求选择合适的存储类型:
部署有状态应用(如MySQL、Redis集群)时,使用StatefulSet确保Pod标识和存储的稳定性。
示例:MySQL集群部署
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
serviceName: mysql-headless
replicas: 3
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:8.0
volumeMounts:
- name: data
mountPath: /var/lib/mysql
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 10Gilocal卷类型并配合节点亲和性,减少网络延迟。使用Velero(原Heptio Ark)进行集群资源的备份与迁移。
运维操作:
# 安装Velero(以AWS S3为例)
velero install \
--provider aws \
--bucket my-backup-bucket \
--secret-file ./credentials-velero \
--backup-location-config region=us-west-2 \
--snapshot-location-config region=us-west-2
# 定时备份命名空间
velero schedule create daily-backup \
--schedule="0 2 * * *" \
--include-namespaces=productionmysqldump、pg_dump)与Kubernetes CronJob实现定时备份。定期模拟节点故障、网络分区等场景,验证备份恢复流程的有效性,确保RTO(恢复时间目标)和RPO(恢复点目标)符合业务要求。
在微服务架构中,引入服务网格(如Istio、Linkerd)可增强可观测性、安全性与流量管理。
运维场景:使用Istio实现金丝雀发布
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v1
weight: 90
- destination:
host: reviews
subset: v2
weight: 10通过监控历史数据(如Prometheus指标),调整Pod的requests和limits,避免过度分配。
工具推荐:
根据负载动态调整节点数量,节省云资源成本。
配置示例(AWS EKS):
# Cluster Autoscaler部署配置
spec:
containers:
- command:
- ./cluster-autoscaler
- --v=4
- --stderrthreshold=info
- --cloud-provider=aws
- --skip-nodes-with-local-storage=false
- --expander=least-waste
- --node-group-auto-discovery=asg:tag=k8s.io/cluster-autoscaler/enabled,k8s.io/cluster-autoscaler/<cluster-name>在非核心业务或可容忍中断的场景,使用Spot实例(竞价实例)可降低60-90%的计算成本。配合Pod中断预算(PDB)确保应用可用性。
使用Terraform、Pulumi等工具定义集群基础设施,实现版本控制与自动化部署。
采用Argo CD或Flux实现声明式、自动化的应用部署。
运维流程:
使用OPA(Open Policy Agent)或Kyverno定义集群策略,自动校验资源合规性。
示例:禁止使用latest标签
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: disallow-latest-tag
spec:
validationFailureAction: enforce
rules:
- name: check-image-tag
match:
resources:
kinds:
- Pod
validate:
message: "使用latest镜像标签被禁止"
pattern:
spec:
containers:
- image: "!*:latest"在私有云与公有云间部署应用,通过CNI插件(如Calico、Cilium)实现网络互通,或使用服务网格进行跨云服务发现。
Kubernetes运维是一个系统工程,需要开发与运维团队的紧密协作。通过合理的资源规划、完善的监控体系、自动化的部署流程和高效的故障排查机制,才能构建稳定、可靠的云原生平台。
1、为所有Pod设置合理的资源请求和限制
2、配置健康检查确保应用可用性
3、使用滚动更新实现零停机部署
4、建立完整的监控和告警体系
5、定期进行集群维护和优化
6、文档化所有运维操作和故障处理流程
“无他,惟手熟尔”!有需要的用起来!
如果你觉得这篇文章有用,欢迎点赞、转发、收藏、留言、推荐❤!
本文分享自 Nicholas与Pypi 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!