Kubernetes 运维文档 概述 Kubernetes(简称 K8s)是一种用于自动部署、扩展和管理容器化应用程序的开源系统。Sealos 是一个用于快速部署和管理 Kubernetes 集群的工具,特别适用于离线安装场景。本文档将详细介绍如何使用 Sealos 5.0 管理 Kubernetes v1.22 集群,包括节点的增加和删除、集群状态的检查、Etcd 的备份以及通过 Etcd 恢复集群的步骤。
1、k8s增加和删除节点 增加节点 在 Kubernetes 集群中,增加节点是为了提升集群的容量和冗余度。通过增加节点,可以扩展集群的计算和存储资源,从而支持更多的工作负载和应用。以下是详细步骤:
- 准备工作 1.准备新节点的主机: o确保新节点的硬件和操作系统符合 Kubernetes 的要求。建议使用与现有节点相同规格的服务器,以避免资源不均衡问题。 o新节点应安装 Docker 或其他容器运行时环境。 o安装必要的 Kubernetes 组件,如 kubeadm、kubelet 和 kubectl。 2.网络配置: o确保新节点能够与现有的 Kubernetes 集群中的节点进行通信。所有节点之间的网络必须连通。 3.下载 Sealos: o在管理节点上下载并安装 Sealos 5.0。 wget https://github.com/labring/sealos/releases/download/v5.0.0/sealos chmod +x sealos mv sealos /usr/local/bin/
- 使用 Sealos 增加节点 1.生成加入命令: o在管理节点上使用 Sealos 增加新节点。假设新节点的 IP 地址为 192.168.0.101。 sealos add –node 192.168.0.101 2.在新节点上执行加入命令: o新节点上不需要手动执行任何命令,Sealos 会自动完成节点的加入过程。 3.验证节点加入: o在管理节点上使用 kubectl get nodes 命令查看新节点是否成功加入集群。 kubectl get nodes o预期输出应显示新节点的状态为 Ready,表示节点已成功加入集群。 删除节点 在 Kubernetes 集群中,删除节点可能是由于硬件故障、资源优化或集群缩容等原因。以下是详细步骤:
- 准备工作 1.迁移工作负载: o在删除节点之前,确保将该节点上的工作负载迁移到其他节点上。可以使用 kubectl drain 命令将节点设置为不可调度,并将其上的 Pod 驱逐到其他节点。 kubectl drain 节点名称 –ignore-daemonsets o例如,假设要删除的节点名称为 node-1: kubectl drain node-1 –ignore-daemonsets 2.确认节点状态: o确保节点上的所有 Pod 已经成功迁移。可以使用以下命令检查: kubectl get pods –all-namespaces -o wide | grep node-1
- 使用 Sealos 删除节点 1.删除节点: o在管理节点上使用 Sealos 删除节点。假设要删除的节点 IP 地址为 192.168.0.101。 sealos delete –node 192.168.0.101 2.移除节点: o在 Kubernetes 集群中移除该节点。 kubectl delete node node-1 3.验证节点删除: o使用 kubectl get nodes 命令确认节点已经从集群中移除。 kubectl get nodes o预期输出应不再显示已删除的节点。
2、Kubernetes 集群状态的检查 确保 Kubernetes 集群的健康和正常运行是运维工作的核心任务之一。以下是一些常用的检查步骤和命令:
- 节点状态检查
使用 kubectl get nodes 命令检查所有节点的状态。
kubectl get nodes
输出示例:
NAME STATUS ROLES AGE VERSION
node-1 Ready control-plane,master 10d v1.22.0
node-2 Ready
10d v1.22.0 node-3 Ready 10d v1.22.0 - Pod 状态检查 使用 kubectl get pods 命令检查所有命名空间中的 Pod 状态。 kubectl get pods –all-namespaces 输出示例: NAMESPACE NAME READY STATUS RESTARTS AGE kube-system coredns-78fcd69978-5kf2s 1/1 Running 0 10d kube-system etcd-node-1 1/1 Running 0 10d kube-system kube-apiserver-node-1 1/1 Running 0 10d kube-system kube-controller-manager-node-1 1/1 Running 0 10d kube-system kube-proxy-4w8dd 1/1 Running 0 10d kube-system kube-scheduler-node-1 1/1 Running 0 10d
- 组件状态检查
使用 kubectl get componentstatuses 命令检查 Kubernetes 组件的状态。
kubectl get componentstatuses
输出示例:
NAME STATUS MESSAGE ERROR
scheduler Healthy ok
controller-manager Healthy ok
etcd-0 Healthy {"health":"true"} - 服务状态检查
使用 kubectl get services –all-namespaces 命令检查所有命名空间中的服务状态。
kubectl get services –all-namespaces
输出示例:
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default kubernetes ClusterIP 10.96.0.1
443/TCP 10d kube-system kube-dns ClusterIP 10.96.0.10 53/UDP,53/TCP,9153/TCP 10d - 日志检查 使用 kubectl logs 命令查看特定 Pod 的日志,以便诊断和排查问题。 kubectl logs pod-name -n namespace 例如,查看 kube-apiserver 的日志: kubectl logs kube-apiserver-node-1 -n kube-system
- 事件检查 使用 kubectl get events –all-namespaces 命令查看所有命名空间中的事件,以了解集群中的警告和错误信息。 kubectl get events –all-namespaces
- 资源使用情况检查 使用 kubectl top nodes 和 kubectl top pods 命令检查节点和 Pod 的资源使用情况(CPU 和内存)。 kubectl top nodes 输出示例: NAME CPU(cores) CPU% MEMORY(bytes) MEMORY% node-1 200m 10% 1024Mi 25% node-2 150m 7% 512Mi 12% node-3 100m 5% 256Mi 6% kubectl top pods –all-namespaces 输出示例: NAMESPACE NAME CPU(cores) MEMORY(bytes) kube-system coredns-78fcd69978-5kf2s 10m 70Mi kube-system etcd-node-1 50m 200Mi kube-system kube-apiserver-node-1 100m 300Mi kube-system kube-controller-manager-node-1 70m 150Mi kube-system kube-proxy-4w8dd 20m 30Mi kube-system kube-scheduler-node-1 30m 50Mi 通过以上步骤,运维人员可以全面了解 Kubernetes 集群的运行状态,及时发现和解决潜在问题,确保集群的稳定性和高可用性。
3、Etcd 的备份 Etcd 是 Kubernetes 的核心组件之一,用于存储集群的所有数据。备份 Etcd 数据对于保障集群的数据安全至关重要。以下是详细步骤:
- 确定备份策略 1.备份频率: o根据集群的规模和业务需求,确定备份的频率。例如,对于生产环境,可以选择每天进行一次备份。 2.备份保留周期: o根据存储空间和业务需求,确定备份文件的保留周期。例如,可以保留最近 7 天的备份文件。 3.备份存储位置: o选择合适的备份存储位置,可以是本地存储、NFS 存储或云存储。确保备份文件的存储位置可靠且易于访问。
- 手动备份 Etcd
1.创建备份 Pod:
o通过 Kubernetes 创建一个临时 Pod 来进行 Etcd 数据的备份。以下是一个示例 YAML 文件 etcd-backup.yaml:
apiVersion: v1
kind: Pod
metadata:
name: etcd-backup
namespace: kube-system
spec:
containers:
- name: etcd-backup image: bitnami/etcd:latest command:
- /bin/sh
- -c
- |
ETCDCTL_API=3 etcdctl snapshot save /backup/etcd_backup.db
–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 volumeMounts: - name: etcd-certs mountPath: /etc/kubernetes/pki/etcd
- name: backup mountPath: /backup volumes: - name: etcd-certs hostPath: path: /etc/kubernetes/pki/etcd - name: backup hostPath: path: /path/to/backup 查看全部 2.应用 YAML 文件: o使用 kubectl 命令应用上述 YAML 文件。 kubectl apply -f etcd-backup.yaml 3.等待备份完成: o通过查看 Pod 的日志,确认备份操作是否成功。 kubectl logs -f pod/etcd-backup -n kube-system 4.验证备份文件: o检查备份文件是否成功生成。 ls -lh /path/to/backup/
- 自动备份 Etcd
为了简化备份操作,可以使用 Kubernetes 的 CronJob 实现 Etcd 的自动备份。
1.创建备份 CronJob:
o编写一个 CronJob YAML 文件 etcd-backup-cronjob.yaml,以下是一个示例:
apiVersion: batch/v1
kind: CronJob
metadata:
name: etcd-backup
namespace: kube-system
spec:
schedule: "0 2 * * *" # 每天凌晨 2 点执行
jobTemplate:
spec:
template:
spec:
containers:
- name: etcd-backup
image: bitnami/etcd:latest
command:
- /bin/sh
- -c
- |
ETCDCTL_API=3 etcdctl snapshot save /backup/etcd_backup_$(date +\%Y\%m\%d\%H\%M\%S).db
–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 volumeMounts: - name: etcd-certs mountPath: /etc/kubernetes/pki/etcd - name: backup mountPath: /backup volumes: - name: etcd-certs hostPath: path: /etc/kubernetes/pki/etcd - name: backup hostPath: path: /path/to/backup restartPolicy: OnFailure 查看全部 2.应用 CronJob YAML 文件: o使用 kubectl 命令应用上述 YAML 文件。 kubectl apply -f etcd-backup-cronjob.yaml 3.验证备份: o定期检查备份文件是否成功生成,并进行恢复测试,确保备份文件可以正常恢复集群数据。
4、通过 Etcd 恢复 Kubernetes 集群 在发生严重故障时,通过 Etcd 备份文件可以恢复 Kubernetes 集群的数据和状态。以下是详细步骤:
- 确定故障原因 1.确认集群故障原因: o在进行恢复操作之前,确认集群故障的原因,确保恢复操作是必要的。 o可以通过查看日志和事件信息来诊断故障原因。
- 停止 Etcd 服务 在所有 Etcd 节点上停止 Etcd 服务。 kubectl -n kube-system scale deployment etcd –replicas=0
- 恢复 Etcd 数据
1.创建恢复 Pod:
o通过 Kubernetes 创建一个临时 Pod 来进行 Etcd 数据的恢复。以下是一个示例 YAML 文件 etcd-restore.yaml:
apiVersion: v1
kind: Pod
metadata:
name: etcd-restore
namespace: kube-system
spec:
containers:
- name: etcd-restore image: bitnami/etcd:latest command:
- /bin/sh
- -c
- |
ETCDCTL_API=3 etcdctl snapshot restore /backup/etcd_backup.db
–data-dir /var/lib/etcd volumeMounts: - name: etcd-certs mountPath: /etc/kubernetes/pki/etcd
- name: backup mountPath: /backup
- name: etcd-data mountPath: /var/lib/etcd volumes: - name: etcd-certs hostPath: path: /etc/kubernetes/pki/etcd - name: backup hostPath: path: /path/to/backup - name: etcd-data hostPath: path: /var/lib/etcd 查看全部 2.应用 YAML 文件: o使用 kubectl 命令应用上述 YAML 文件。 kubectl apply -f etcd-restore.yaml 3.等待恢复完成: o通过查看 Pod 的日志,确认恢复操作是否成功。 kubectl logs -f pod/etcd-restore -n kube-system 4.删除恢复 Pod: o恢复完成后,删除恢复 Pod。 kubectl delete pod etcd-restore -n kube-system
- 启动 Etcd 服务 在所有 Etcd 节点上启动 Etcd 服务。 kubectl -n kube-system scale deployment etcd –replicas=3
- 验证恢复结果
1.检查 Etcd 状态:
o使用 etcdctl 命令检查 Etcd 的健康状态。
ETCDCTL_API=3 etcdctl endpoint health
–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 输出示例: https://127.0.0.1:2379 is healthy: successfully committed proposal: took = 1.234ms 2.检查 Kubernetes 集群状态: o使用 kubectl get nodes 命令检查所有节点的状态。 kubectl get nodes o输出示例: NAME STATUS ROLES AGE VERSION node-1 Ready control-plane,master 10d v1.22.0 node-2 Ready10d v1.22.0 node-3 Ready 10d v1.22.0 3.检查 Pod 状态: o使用 kubectl get pods --all-namespaces 命令检查所有命名空间中的 Pod 状态。 kubectl get pods --all-namespaces o输出示例: NAMESPACE NAME READY STATUS RESTARTS AGE kube-system coredns-78fcd69978-5kf2s 1/1 Running 0 10d kube-system etcd-node-1 1/1 Running 0 10d kube-system kube-apiserver-node-1 1/1 Running 0 10d kube-system kube-controller-manager-node-1 1/1 Running 0 10d kube-system kube-proxy-4w8dd 1/1 Running 0 10d kube-system kube-scheduler-node-1 1/1 Running 0 10d 4.检查组件状态: o使用 kubectl get componentstatuses 命令检查 Kubernetes 组件的状态。 kubectl get componentstatuses o输出示例: NAME STATUS MESSAGE ERROR scheduler Healthy ok controller-manager Healthy ok etcd-0 Healthy {"health":"true"} 5.检查事件: o使用 kubectl get events --all-namespaces 命令查看所有命名空间中的事件,以了解集群中的警告和错误信息。 kubectl get events --all-namespaces 通过上述步骤,您可以确保 Kubernetes 集群已成功从 Etcd 备份中恢复,并且集群状态正常。