
Kubernetes作为容器编排领域的事实标准,其强大的自动化能力极大地简化了应用部署和管理。然而,要确保生产环境中的Kubernetes集群稳定、高效运行,运维人员必须掌握一系列核心运维方法。本文将深入探讨几个关键的运维场景、操作方法并提供实践示例。
在生产环境中,经常需要对特定节点进行维护(如硬件升级、内核更新)。直接关闭节点会导致其上运行的Pod被意外终止,可能引发服务中断。Kubernetes提供了节点隔离机制,允许将节点标记为“不可调度”,从而优雅地将其移出调度池。
方法一:使用YAML配置文件
创建 node-maintenance.yaml 文件:
apiVersion: v1
kind: Node
metadata:
name: worker-node-01
spec:
unschedulable: true执行隔离命令:
kubectl apply -f node-maintenance.yaml方法二:使用kubectl命令直接操作
# 隔离节点
kubectl cordon worker-node-01
# 恢复节点(重新纳入调度)
kubectl uncordon worker-node-01
# 查看节点状态
kubectl get nodes验证与后续操作:
# 检查节点状态(应显示SchedulingDisabled)
kubectl get node worker-node-01 -o wide
# 排空节点上的Pod(优雅驱逐)
kubectl drain worker-node-01 --ignore-daemonsets --delete-emptydir-data
# 维护完成后恢复节点
kubectl uncordon worker-node-01HPA(Horizontal Pod Autoscaler)是Kubernetes的核心自动化特性之一,能够根据监控指标(如CPU、内存使用率或自定义指标)自动调整Pod副本数量,实现应用的弹性伸缩。
创建Deployment和Service:
apiVersion: apps/v1
kind: Deployment
metadata:
name: webapp-deployment
spec:
replicas: 2
selector:
matchLabels:
app: webapp
template:
metadata:
labels:
app: webapp
spec:
containers:
- name: webapp
image: nginx:latest
resources:
requests:
cpu: 200m
memory: 256Mi
limits:
cpu: 500m
memory: 512Mi
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: webapp-service
spec:
selector:
app: webapp
ports:
- port: 80
targetPort: 80创建HPA资源:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: webapp-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: webapp-deployment
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应用配置并监控:
# 部署应用和HPA
kubectl apply -f webapp-deployment.yamlkubectl apply -f hpa-config.yaml
# 查看HPA状态
kubectl get hpa webapp-hpa -w
# 详细描述HPA
kubectl describe hpa webapp-hpa
# 模拟负载测试触发扩容
kubectl run -i --tty load-generator --rm --image=busybox --restart=Never -- /bin/sh -c "while true; do wget -q -O- http://webapp-service; done"ConfigMap和Secret是Kubernetes管理应用配置和敏感信息的核心对象。掌握其动态更新技巧可以实现不重启Pod的情况下更新应用配置。
创建ConfigMap:
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
app.properties: |
server.port=8080
logging.level=INFO
feature.flag.enabled=true
environment: "production"创建使用ConfigMap的Deployment:
apiVersion: apps/v1
kind: Deployment
metadata:
name: config-app
spec:
replicas: 3
selector:
matchLabels:
app: config-app
template:
metadata:
labels:
app: config-app
spec:
containers:
- name: app-container
image: busybox
command: ["/bin/sh", "-c", "cat /etc/config/app.properties && sleep 3600"]
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: app-config动态更新ConfigMap:
# 查看当前配置
kubectl get configmap app-config -o yaml
# 更新ConfigMap
kubectl create configmap app-config --from-file=app.properties=new-config.properties -o yaml --dry-run=client | kubectl replace -f -
# 或者使用patch命令
kubectl patch configmap app-config --patch '{"data":{"environment":"staging"}}'
# 触发Pod配置重载(不同应用有不同的重载机制)
# 方法1:滚动更新(会重启Pod)kubectl rollout restart deployment/config-app
# 方法2:使用sidecar监控配置变化(不重启主容器)Secret管理示例:
# 从文件创建Secret
kubectl create secret generic db-credentials \
--from-literal=username=admin \
--from-literal=password=secret123
# 更新Secret
kubectl create secret generic db-credentials \
--from-literal=username=newadmin \
--from-literal=password=newsecret456 \
-o yaml --dry-run=client | kubectl replace -f -Kubernetes通过StorageClass、PersistentVolumeClaim和PersistentVolume实现存储的动态供应,这是有状态应用运维的关键。
创建StorageClass:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: fast-ssd
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp3
fsType: ext4
iops: "3000"
throughput: "125"
reclaimPolicy: Retain
allowVolumeExpansion: true
volumeBindingMode: Immediate创建StatefulSet使用动态存储:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql-statefulset
spec:
serviceName: mysql
replicas: 3
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:8.0
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: password
ports:
- containerPort: 3306
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql
volumeClaimTemplates:
- metadata:
name: mysql-data
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: "fast-ssd"
resources:
requests:
storage: 20Gi存储运维操作:
# 查看存储类
kubectl get storageclass
# 查看持久卷声明
kubectl get pvc
# 查看持久卷
kubectl get pv
# 扩展存储容量(需要StorageClass支持)
kubectl patch pvc mysql-data-mysql-statefulset-0 -p '{"spec":{"resources":{"requests":{"storage":"30Gi"}}}}'
# 创建存储快照(需要CSI驱动支持)
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
name: mysql-snapshot
spec:
volumeSnapshotClassName: csi-aws-vsc
source:
persistentVolumeClaimName: mysql-data-mysql-statefulset-0NetworkPolicy是Kubernetes的网络防火墙,可以精确控制Pod之间的网络流量,是实现零信任网络的关键。
基础网络策略:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: frontend-policy
spec:
podSelector:
matchLabels:
app: frontend
policyTypes:
- Ingress
- Egress
ingress:
- from:
- podSelector:
matchLabels:
app: backend
ports:
- protocol: TCP
port: 8080
egress:
- to:
- podSelector:
matchLabels:
app: backend
ports:
- protocol: TCP
port: 9090
- to:
- ipBlock:
cidr: 8.8.8.8/32
ports:
- protocol: TCP
port: 53
- protocol: UDP
port: 53命名空间隔离策略:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress允许特定命名空间访问:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-monitoring
spec:
podSelector: {}
ingress:
- from:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: monitoring
ports:
- protocol: TCP
port: 9100应用和验证网络策略:
# 应用网络策略
kubectl apply -f network-policy.yaml
# 查看网络策略
kubectl get networkpolicy
# 测试网络连通性
kubectl run -i --tty --rm test-pod --image=alpine --restart=Never -- sh
# 在test-pod中测试
apk add curl
curl http://backend-service:8080完善的监控和日志系统是Kubernetes运维的基石,能够帮助快速发现和解决问题。
部署Prometheus监控:
apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
name: prometheus
namespace: monitoring
spec:
serviceAccountName: prometheus
serviceMonitorSelector: {}
resources:
requests:
memory: 400Mi
limits:
memory: 2Gi
storage:
volumeClaimTemplate:
spec:
storageClassName: fast-ssd
resources:
requests:
storage: 50Gi配置Pod监控注解:
apiVersion: apps/v1
kind: Deployment
metadata:
name: monitored-app
spec:
template:
metadata:
annotations:
prometheus.io/scrape: "true"
prometheus.io/port: "8080"
prometheus.io/path: "/metrics"
spec:
containers:
- name: app
image: myapp:latest
ports:
- containerPort: 8080
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 5集中式日志收集配置:
apiVersion: v1
kind: ConfigMap
metadata:
name: fluentd-config
data:
fluent.conf: |
<source>
@type tail
path /var/log/containers/*.log
pos_file /var/log/fluentd-containers.log.pos
tag kubernetes.*
read_from_head true
<parse>
@type json
time_format %Y-%m-%dT%H:%M:%S.%NZ
</parse>
</source>
<filter kubernetes.**>
@type kubernetes_metadata
</filter>
<match **>
@type elasticsearch
host elasticsearch.monitoring.svc.cluster.local
port 9200
logstash_format true
logstash_prefix kubernetes
</match>生产环境必须考虑集群级别的高可用和灾备方案,确保业务连续性。
多可用区节点亲和性配置:
apiVersion: apps/v1
kind: Deployment
metadata:
name: ha-application
spec:
replicas: 6
selector:
matchLabels:
app: ha-app
template:
metadata:
labels:
app: ha-app
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- ha-app
topologyKey: topology.kubernetes.io/zone
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: topology.kubernetes.io/zone
operator: In
values:
- zone-a
- zone-b
- zone-c
containers:
- name: app
image: ha-app:latest应用备份与恢复(使用Velero):
# 安装Velero
velero install \
--provider aws \
--plugins velero/velero-plugin-for-aws:v1.0.0 \
--bucket velero-backups \
--backup-location-config region=us-west-2 \
--snapshot-location-config region=us-west-2
# 创建定时备份
velero schedule create daily-backup \
--schedule="0 2 * * *" \
--include-namespaces=production \
--ttl 720h
# 手动备份
velero backup create manual-backup --include-namespaces production
# 恢复备份
velero restore create --from-backup manual-backup
# 查看备份状态
velero backup describe daily-backup掌握Kubernetes运维方法需要理论与实践相结合。本文介绍的七个方面涵盖了日常运维的关键场景。在实际运维中,还需要结合监控告警、自动化脚本、CI/CD流水线等工具,构建完整的运维体系,可以大大降低运维复杂度,提升系统可靠性。
“无他,惟手熟尔”!有需要的用起来!
如果你觉得这篇文章有用,欢迎点赞、转发、收藏、留言、推荐❤!
本文分享自 Nicholas与Pypi 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!