集群维护 #

一、集群维护概述 #

集群维护是保障Kubernetes稳定运行的重要工作,包括节点管理、证书更新、备份恢复等。

1.1 维护内容 #

text
集群维护内容
    │
    ├── 节点管理
    │   ├── 节点扩缩容
    │   ├── 节点维护
    │   └── 节点故障处理
    │
    ├── 证书管理
    │   ├── 证书更新
    │   └── 证书轮换
    │
    ├── 备份恢复
    │   ├── etcd备份
    │   └── 资源备份
    │
    └── 日常运维
        ├── 日志管理
        ├── 资源清理
        └── 性能优化

二、节点管理 #

2.1 节点状态 #

bash
# 查看节点状态
kubectl get nodes

# 查看节点详情
kubectl describe node <node-name>

# 查看节点资源
kubectl top nodes

2.2 节点维护 #

bash
# 标记节点不可调度
kubectl cordon <node-name>

# 驱逐节点上的Pod
kubectl drain <node-name> --ignore-daemonsets --delete-emptydir-data

# 恢复节点调度
kubectl uncordon <node-name>

2.3 节点标签管理 #

bash
# 添加标签
kubectl label node <node-name> key=value

# 删除标签
kubectl label node <node-name> key-

# 查看标签
kubectl get nodes --show-labels

2.4 节点污点管理 #

bash
# 添加污点
kubectl taint nodes <node-name> key=value:NoSchedule

# 删除污点
kubectl taint nodes <node-name> key:NoSchedule-

# 查看污点
kubectl describe node <node-name> | grep Taints

三、证书管理 #

3.1 查看证书有效期 #

bash
# 查看所有证书有效期
kubeadm certs check-expiration

# 输出示例
CERTIFICATE                EXPIRES                  RESIDUAL TIME   EXTERNALLY MANAGED
admin.conf                 Jan 10, 2025 12:00 UTC   364d            no
apiserver                  Jan 10, 2025 12:00 UTC   364d            no
apiserver-etcd-client      Jan 10, 2025 12:00 UTC   364d            no

3.2 更新证书 #

bash
# 更新所有证书
kubeadm certs renew all

# 更新特定证书
kubeadm certs renew admin.conf
kubeadm certs renew apiserver

# 更新后重启控制平面
kubectl restart kube-apiserver
kubectl restart kube-controller-manager
kubectl restart kube-scheduler

3.3 更新kubeconfig #

bash
# 更新admin.conf
kubeadm certs renew admin.conf

# 复制到用户目录
cp /etc/kubernetes/admin.conf ~/.kube/config

四、etcd备份恢复 #

4.1 etcd备份 #

bash
# 备份etcd
ETCDCTL_API=3 etcdctl snapshot save /backup/etcd-snapshot.db \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key

# 查看备份状态
ETCDCTL_API=3 etcdctl snapshot status /backup/etcd-snapshot.db

4.2 etcd恢复 #

bash
# 停止etcd和kube-apiserver
systemctl stop kube-apiserver
systemctl stop etcd

# 恢复etcd数据
ETCDCTL_API=3 etcdctl snapshot restore /backup/etcd-snapshot.db \
  --data-dir=/var/lib/etcd-restore

# 修改etcd配置
mv /var/lib/etcd /var/lib/etcd-old
mv /var/lib/etcd-restore /var/lib/etcd

# 启动etcd和kube-apiserver
systemctl start etcd
systemctl start kube-apiserver

4.3 定期备份脚本 #

bash
#!/bin/bash
BACKUP_DIR="/backup/etcd"
DATE=$(date +%Y%m%d_%H%M%S)

ETCDCTL_API=3 etcdctl snapshot save ${BACKUP_DIR}/etcd-${DATE}.db \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key

# 保留最近7天备份
find ${BACKUP_DIR} -name "etcd-*.db" -mtime +7 -delete

五、资源备份 #

5.1 备份资源清单 #

bash
# 备份所有命名空间资源
kubectl get all -A -o yaml > all-resources.yaml

# 备份特定命名空间
kubectl get all -n default -o yaml > default-resources.yaml

# 备份特定资源类型
kubectl get deployments -A -o yaml > deployments.yaml
kubectl get configmaps -A -o yaml > configmaps.yaml
kubectl get secrets -A -o yaml --dry-run=client > secrets.yaml

5.2 使用Velero备份 #

bash
# 安装Velero
velero install --provider aws --bucket my-bucket --secret-file ./credentials-velero

# 创建备份
velero backup create my-backup

# 定期备份
velero schedule create daily-backup --schedule="0 2 * * *"

# 恢复备份
velero restore create --from-backup my-backup

六、日常运维 #

6.1 日志管理 #

bash
# 查看组件日志
kubectl logs -n kube-system <pod-name>

# 查看kubelet日志
journalctl -u kubelet -f

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

# 日志轮转配置
# /etc/docker/daemon.json
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}

6.2 资源清理 #

bash
# 清理完成的Job
kubectl delete jobs --field-selector status.successful=1

# 清理失败的Pod
kubectl delete pods --field-selector status.phase=Failed

# 清理孤儿资源
kubectl delete pods --owner_references.uid=<uid>

# 清理未使用的镜像
docker image prune -a

# 清理未使用的容器
docker container prune

6.3 性能优化 #

bash
# 查看节点资源使用
kubectl top nodes

# 查看Pod资源使用
kubectl top pods -A

# 查看资源限制
kubectl describe node <node-name> | grep -A 5 "Allocated resources"

# 优化建议
# 1. 合理设置requests和limits
# 2. 清理未使用的资源
# 3. 优化镜像大小
# 4. 使用资源配额限制

七、故障处理 #

7.1 节点故障 #

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

# 查看节点事件
kubectl get events --field-selector involvedObject.name=<node-name>

# 检查kubelet状态
systemctl status kubelet

# 检查容器运行时
systemctl status containerd

7.2 网络故障 #

bash
# 检查网络插件
kubectl get pods -n kube-system -l k8s-app=calico-node

# 检查DNS
kubectl exec -it <pod> -- nslookup kubernetes

# 检查Service
kubectl get endpoints <service-name>

# 检查网络策略
kubectl get networkpolicy -A

7.3 存储故障 #

bash
# 检查PV状态
kubectl get pv

# 检查PVC状态
kubectl get pvc -A

# 检查存储类
kubectl get storageclass

# 检查CSI驱动
kubectl get pods -n kube-system -l app=csi-driver

八、监控告警 #

8.1 集群监控 #

bash
# 查看组件状态
kubectl get componentstatuses

# 查看集群信息
kubectl cluster-info

# 查看资源使用
kubectl top nodes
kubectl top pods -A

8.2 告警配置 #

yaml
# Prometheus告警规则
groups:
- name: cluster-alerts
  rules:
  - alert: NodeNotReady
    expr: kube_node_status_condition{condition="Ready",status="true"} == 0
    for: 5m
    labels:
      severity: critical
    annotations:
      summary: "Node {{ $labels.node }} is not ready"

九、最佳实践 #

9.1 维护检查清单 #

text
日常维护检查
    │
    ├── 检查节点状态
    │   └── kubectl get nodes
    │
    ├── 检查Pod状态
    │   └── kubectl get pods -A
    │
    ├── 检查资源使用
    │   └── kubectl top nodes/pods
    │
    ├── 检查证书有效期
    │   └── kubeadm certs check-expiration
    │
    └── 检查备份状态
        └── 查看备份文件

9.2 维护窗口 #

text
维护窗口建议
    │
    ├── 低峰期维护
    │   └── 减少业务影响
    │
    ├── 提前通知
    │   └── 告知相关团队
    │
    ├── 准备回滚方案
    │   └── 出问题可快速恢复
    │
    └── 监控验证
        └── 维护后检查集群状态

十、总结 #

10.1 核心要点 #

维护项 说明
节点管理 cordon/drain/uncordon
证书管理 定期检查和更新
备份恢复 etcd和资源备份
日常运维 日志、清理、优化

10.2 下一步 #

掌握了集群维护后,让我们学习 故障排查,了解Kubernetes问题的诊断方法。

最后更新:2026-03-28