652 字
2 分钟
Kubernetes 运维实践深度解析
Kubernetes 把应用跑起来只是开始,真正的成本在”跑稳之后”。集群组件的健康度、etcd 的备份能不能恢复、升级路径怎么走、日志怎么聚合,这些不上生产不觉得痛的问题,一旦上线就得有答案。本文围绕集群管理、备份恢复、版本升级、资源配额和日志管理五块日常运维内容展开,每块都给出可复现的命令和踩过的坑。配合 监控与可观测性 和 故障排查与调优 一起看,就是一套从”看见”到”处理”的完整运维闭环。
一、集群管理
1.1 集群组件管理
graph TB
subgraph "Control Plane"
A["kube-apiserver"] --> B["etcd"]
C["kube-scheduler"] --> A
D["kube-controller-manager"] --> A
end
subgraph "Node"
E["kubelet"] --> F["kube-proxy"]
E --> G["Container Runtime"]
end
| 组件 | 关键指标 | 巡检频率 |
|---|---|---|
| etcd | 磁盘延迟、投票超时 | 每分钟 |
| apiserver | 请求延迟、错误率 | 每分钟 |
| scheduler | 调度延迟、Pending Pods | 每分钟 |
| kubelet | PLEG duration、容器状态 | 每分钟 |
# 查看控制平面组件状态# 注意:kubectl get componentstatus(别名 cs)在 1.19 起标记弃用,1.26 起移除。# 更可靠的健康度来自 /metrics 和各组件自身暴露的指标,而非 componentstatus。kubectl get componentstatuskubectl get pods -n kube-system
# 查看 etcd 健康状态(需在 etcd Pod 所在节点或带证书的 etcdctl)kubectl exec -n kube-system etcd-<node> -- etcdctl endpoint health
# 查看 API Server 延迟kubectl get --raw '/metrics' | grep apiserver_request_duration_seconds1.2 节点管理
# 节点维护操作# 1. 驱逐 Podkubectl drain <node-name> --ignore-daemonsets --delete-emptydir-data
# 2. 标记不可调度kubectl cordon <node-name>
# 3. 解除维护kubectl uncordon <node-name>
# 查看节点资源kubectl describe node <node-name> | grep -A 5 "Allocated resources"二、备份与恢复
2.1 etcd 备份
# 方式一:直接备份ETCDCTL_API=3 etcdctl \ --endpoints=https://127.0.0.1:2379 \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/server.crt \ --key=/etc/kubernetes/pki/etcd/server.key \ snapshot save /tmp/etcd-backup.db
# 方式二:API Server 备份kubectl get all --all-namespaces -o yaml > /tmp/cluster-backup.yaml
# 定时备份脚本#!/bin/bashBACKUP_DIR="/var/backups/k8s"DATE=$(date +%Y%m%d_%H%M%S)ETCDCTL_API=3 etcdctl \ --endpoints=https://127.0.0.1:2379 \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/server.crt \ --key=/etc/kubernetes/pki/etcd/server.key \ snapshot save ${BACKUP_DIR}/etcd-${DATE}.db2.2 恢复流程
# 恢复 etcd(单节点)systemctl stop etcdrm -rf /var/lib/etcdETCDCTL_API=3 etcdctl snapshot restore /tmp/etcd-backup.db \ --initial-cluster=new-etcd-0=https://192.168.1.10:2380 \ --initial-advertise-peer-urls=https://192.168.1.10:2380 \ --name=new-etcd-0 \ --data-dir=/var/lib/etcdsystemctl start etcd三、版本升级
3.1 升级策略
graph TB
subgraph "升级前"
A["备份 etcd"] --> B["测试环境验证"]
B --> C["准备回滚方案"]
end
subgraph "升级控制平面"
D["升级 etcd"] --> E["升级 kube-apiserver"]
E --> F["升级 controller-manager"]
F --> G["升级 scheduler"]
end
subgraph "升级 Nodes"
H["升级 kubelet"] --> I["升级 kube-proxy"]
I --> J["验证应用"]
end
3.2 升级执行
# 查看可用版本apt-cache madison kubeadmkubeadm upgrade plan
# 升级控制平面apt-get install -y kubeadm=1.23.0-*kubeadm upgrade apply v1.23.0
# 升级节点apt-get install -y kubelet=1.23.0-*systemctl restart kubelet
# 升级插件kubectl apply -f kube-proxy.yamlkubectl rollout status daemonset/kube-proxy -n kube-system四、资源配额管理
4.1 ResourceQuota 与 LimitRange
# ResourceQuota:命名空间级别资源配额apiVersion: v1kind: ResourceQuotametadata: name: compute-quota namespace: my-namespacespec: hard: requests.cpu: "10" requests.memory: 20Gi limits.cpu: "20" limits.memory: 40Gi pods: "100" services: "20"
---
apiVersion: v1kind: LimitRangemetadata: name: container-limits namespace: my-namespacespec: limits: - max: cpu: "4" memory: 8Gi min: cpu: "100m" memory: 128Mi default: cpu: "500m" memory: 512Mi defaultRequest: cpu: "200m" memory: 256Mi type: Container4.2 资源配额计算
class ResourceCalculator: @staticmethod def calculate_node_capacity(node): """计算节点可用资源""" return { "cpu": node.status.capacity["cpu"], "memory": node.status.capacity["memory"], }
@staticmethod def calculate_allocatable(node): """计算节点可分配资源""" capacity = ResourceCalculator.calculate_node_capacity(node) system_reserved = { "cpu": "500m", # 系统预留 "memory": "1Gi", } return { "cpu": capacity["cpu"] - parse_resources(system_reserved["cpu"]), "memory": capacity["memory"] - parse_resources(system_reserved["memory"]), }五、日志管理
5.1 日志架构
graph LR
A["Pod 日志"] --> B["Node"]
B --> C["日志代理"]
C --> D["日志存储"]
C --> E["日志索引"]
E --> F["日志可视化"]
# Fluent Bit 配置apiVersion: v1kind: ConfigMapmetadata: name: fluent-bit-config namespace: loggingdata: fluent-bit.conf: | [SERVICE] Flush 5 Log_Level info
[INPUT] Name tail Path /var/log/containers/*.log Parser docker Tag kube.*
[FILTER] Name kubernetes Match kube.* Kube_URL https://kubernetes.default.svc:443 Kube_CA_File /var/run/secrets/kubernetes.io/serviceaccount/ca.crt Kube_Token_File /var/run/secrets/kubernetes.io/serviceaccount/token
[OUTPUT] Name es Match kube.* Host elasticsearch.logging.svc Port 9200 HTTP_User elastic HTTP_Passwd changeme Logstash_Format On Logstash_Prefix kubernetesNote
Parser docker 针对 Docker 运行时的 JSON 日志格式。Kubernetes 1.24 起 dockershim 移除,默认运行时为 containerd,其日志格式不同(CRI 格式,非纯 JSON),需改用 cri parser 或在 tail 段配置 multiline。从 Docker 迁移到 containerd 时,这是日志解析最容易断的地方。
5.2 日志查询
# 查看 Pod 日志kubectl logs <pod-name> --previous # 上一个容器kubectl logs <pod-name> -c <container> # 指定容器
# 实时跟踪日志kubectl logs -f <pod-name>
# 查看带时间戳的日志kubectl logs <pod-name> --timestamps如果应用把日志写到文件而非 stdout(很多传统应用如此),kubectl logs 看不到。常见做法是让容器把日志目录挂到 emptyDir,再起一个 sidecar tail 这个文件打到 stdout:
# 日志 sidecar 示例:应用写文件,sidecar 转发到 stdout 供 kubectl logs 采集apiVersion: v1kind: Podmetadata: name: loggerspec: containers: - name: logger image: busybox args: - /bin/sh - -c - | while true; do echo "$(date) - Log message" >> /var/log/app.log sleep 10 done volumeMounts: - name: log mountPath: /var/log volumes: - name: log emptyDir: {}六、运维与监控协作
6.1 日常运维监控要点
运维工作离不开完善的监控体系。通过监控可以提前发现问题,降低故障影响:
graph LR
A["日常运维"] --> B["资源监控"]
A --> C["日志分析"]
A --> D["告警响应"]
B --> E["Prometheus"]
C --> F["Loki/ELK"]
D --> G["Alertmanager"]
E --> H["预防性维护"]
F --> H
G --> H
关键运维指标:
| 运维场景 | 监控重点 | 告警阈值 |
|---|---|---|
| 节点维护 | CPU/内存使用率、Pod 驱逐 | 使用率 > 80% |
| 集群升级 | API Server 延迟、etcd 健康 | 延迟 > 100ms |
| 资源扩容 | 资源分配率、Pending Pods | 分配率 > 90% |
| 备份验证 | etcd 快照大小、备份时效 | 备份过期 > 24h |
Tip
完整的监控配置请参考 Kubernetes 监控与可观测性。
6.2 故障排查协作
当监控告警触发时,运维人员需要快速响应:
# 快速诊断脚本示例#!/bin/bashecho "=== Cluster Status ==="kubectl get nodeskubectl get pods -A | grep -v Running | head -20
echo "=== Resource Usage ==="kubectl top nodeskubectl top pods -A | sort -k3 -rn | head -10
echo "=== Recent Events ==="kubectl get events -A --sort-by='.lastTimestamp' | tail -20支持与分享
如果这篇文章对你有帮助,欢迎支持作者或分享给更多人
Kubernetes 运维实践深度解析
https://blog.souloss.cn/posts/kubernetes/k8s-operations/ 部分信息可能已经过时
相关文章 智能推荐
1
Kubernetes CNI 深度解析
云原生 介绍 Kubernetes CNI(Container Network Interface)规范,解析主流 CNI 插件(Flannel、Calico、Cilium)的网络实现原理与选型建议。
2
Kubernetes 监控与可观测性
云原生 深入解析 Kubernetes 监控体系,Prometheus、Grafana、告警规则与指标分析。
3
Kubernetes 故障排查与性能优化
云原生 从症状回溯根因的 Kubernetes 诊断思维,Pod 调度、网络、存储、性能与应用层排查。
4
Kubernetes 网络
云原生 全面讲解 Kubernetes 网络体系,Pod 网络(CNI)、Service 网络(kube-proxy / iptables / ipvs)、Ingress 流量入口,以及 Flannel、Calico、Cilium 三大 CNI 插件的对比。
5
Kubernetes 云原生实战系列导读
云原生 Kubernetes 云原生系列文章导读,从基础概念到底层剖析,从实践操作到生产运维,逐层拆解 K8s 核心架构。






