7c76e7c5c8eacc4002cc7e290656fea8280e0d98
redsun.md
... | ... | @@ -0,0 +1,312 @@ |
1 | +Kubernetes 运维文档 |
|
2 | +概述 |
|
3 | +Kubernetes(简称 K8s)是一种用于自动部署、扩展和管理容器化应用程序的开源系统。Sealos 是一个用于快速部署和管理 Kubernetes 集群的工具,特别适用于离线安装场景。本文档将详细介绍如何使用 Sealos 5.0 管理 Kubernetes v1.22 集群,包括节点的增加和删除、集群状态的检查、Etcd 的备份以及通过 Etcd 恢复集群的步骤。 |
|
4 | + |
|
5 | +1、k8s增加和删除节点 |
|
6 | +增加节点 |
|
7 | +在 Kubernetes 集群中,增加节点是为了提升集群的容量和冗余度。通过增加节点,可以扩展集群的计算和存储资源,从而支持更多的工作负载和应用。以下是详细步骤: |
|
8 | +1. 准备工作 |
|
9 | +1.准备新节点的主机: |
|
10 | +o确保新节点的硬件和操作系统符合 Kubernetes 的要求。建议使用与现有节点相同规格的服务器,以避免资源不均衡问题。 |
|
11 | +o新节点应安装 Docker 或其他容器运行时环境。 |
|
12 | +o安装必要的 Kubernetes 组件,如 kubeadm、kubelet 和 kubectl。 |
|
13 | +2.网络配置: |
|
14 | +o确保新节点能够与现有的 Kubernetes 集群中的节点进行通信。所有节点之间的网络必须连通。 |
|
15 | +3.下载 Sealos: |
|
16 | +o在管理节点上下载并安装 Sealos 5.0。 |
|
17 | +wget https://github.com/labring/sealos/releases/download/v5.0.0/sealos |
|
18 | +chmod +x sealos |
|
19 | +mv sealos /usr/local/bin/ |
|
20 | +2. 使用 Sealos 增加节点 |
|
21 | +1.生成加入命令: |
|
22 | +o在管理节点上使用 Sealos 增加新节点。假设新节点的 IP 地址为 192.168.0.101。 |
|
23 | +sealos add --node 192.168.0.101 |
|
24 | +2.在新节点上执行加入命令: |
|
25 | +o新节点上不需要手动执行任何命令,Sealos 会自动完成节点的加入过程。 |
|
26 | +3.验证节点加入: |
|
27 | +o在管理节点上使用 kubectl get nodes 命令查看新节点是否成功加入集群。 |
|
28 | +kubectl get nodes |
|
29 | +o预期输出应显示新节点的状态为 Ready,表示节点已成功加入集群。 |
|
30 | +删除节点 |
|
31 | +在 Kubernetes 集群中,删除节点可能是由于硬件故障、资源优化或集群缩容等原因。以下是详细步骤: |
|
32 | +1. 准备工作 |
|
33 | +1.迁移工作负载: |
|
34 | +o在删除节点之前,确保将该节点上的工作负载迁移到其他节点上。可以使用 kubectl drain 命令将节点设置为不可调度,并将其上的 Pod 驱逐到其他节点。 |
|
35 | +kubectl drain 节点名称 --ignore-daemonsets |
|
36 | +o例如,假设要删除的节点名称为 node-1: |
|
37 | +kubectl drain node-1 --ignore-daemonsets |
|
38 | +2.确认节点状态: |
|
39 | +o确保节点上的所有 Pod 已经成功迁移。可以使用以下命令检查: |
|
40 | +kubectl get pods --all-namespaces -o wide | grep node-1 |
|
41 | +2. 使用 Sealos 删除节点 |
|
42 | +1.删除节点: |
|
43 | +o在管理节点上使用 Sealos 删除节点。假设要删除的节点 IP 地址为 192.168.0.101。 |
|
44 | +sealos delete --node 192.168.0.101 |
|
45 | +2.移除节点: |
|
46 | +o在 Kubernetes 集群中移除该节点。 |
|
47 | +kubectl delete node node-1 |
|
48 | +3.验证节点删除: |
|
49 | +o使用 kubectl get nodes 命令确认节点已经从集群中移除。 |
|
50 | +kubectl get nodes |
|
51 | +o预期输出应不再显示已删除的节点。 |
|
52 | + |
|
53 | +2、Kubernetes 集群状态的检查 |
|
54 | +确保 Kubernetes 集群的健康和正常运行是运维工作的核心任务之一。以下是一些常用的检查步骤和命令: |
|
55 | +1. 节点状态检查 |
|
56 | +使用 kubectl get nodes 命令检查所有节点的状态。 |
|
57 | +kubectl get nodes |
|
58 | +输出示例: |
|
59 | +NAME STATUS ROLES AGE VERSION |
|
60 | +node-1 Ready control-plane,master 10d v1.22.0 |
|
61 | +node-2 Ready <none> 10d v1.22.0 |
|
62 | +node-3 Ready <none> 10d v1.22.0 |
|
63 | +2. Pod 状态检查 |
|
64 | +使用 kubectl get pods 命令检查所有命名空间中的 Pod 状态。 |
|
65 | +kubectl get pods --all-namespaces |
|
66 | +输出示例: |
|
67 | +NAMESPACE NAME READY STATUS RESTARTS AGE |
|
68 | +kube-system coredns-78fcd69978-5kf2s 1/1 Running 0 10d |
|
69 | +kube-system etcd-node-1 1/1 Running 0 10d |
|
70 | +kube-system kube-apiserver-node-1 1/1 Running 0 10d |
|
71 | +kube-system kube-controller-manager-node-1 1/1 Running 0 10d |
|
72 | +kube-system kube-proxy-4w8dd 1/1 Running 0 10d |
|
73 | +kube-system kube-scheduler-node-1 1/1 Running 0 10d |
|
74 | +3. 组件状态检查 |
|
75 | +使用 kubectl get componentstatuses 命令检查 Kubernetes 组件的状态。 |
|
76 | +kubectl get componentstatuses |
|
77 | +输出示例: |
|
78 | +NAME STATUS MESSAGE ERROR |
|
79 | +scheduler Healthy ok |
|
80 | +controller-manager Healthy ok |
|
81 | +etcd-0 Healthy {"health":"true"} |
|
82 | +4. 服务状态检查 |
|
83 | +使用 kubectl get services --all-namespaces 命令检查所有命名空间中的服务状态。 |
|
84 | +kubectl get services --all-namespaces |
|
85 | +输出示例: |
|
86 | +NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE |
|
87 | +default kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 10d |
|
88 | +kube-system kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 10d |
|
89 | +5. 日志检查 |
|
90 | +使用 kubectl logs 命令查看特定 Pod 的日志,以便诊断和排查问题。 |
|
91 | +kubectl logs pod-name -n namespace |
|
92 | +例如,查看 kube-apiserver 的日志: |
|
93 | +kubectl logs kube-apiserver-node-1 -n kube-system |
|
94 | +6. 事件检查 |
|
95 | +使用 kubectl get events --all-namespaces 命令查看所有命名空间中的事件,以了解集群中的警告和错误信息。 |
|
96 | +kubectl get events --all-namespaces |
|
97 | +7. 资源使用情况检查 |
|
98 | +使用 kubectl top nodes 和 kubectl top pods 命令检查节点和 Pod 的资源使用情况(CPU 和内存)。 |
|
99 | +kubectl top nodes |
|
100 | +输出示例: |
|
101 | +NAME CPU(cores) CPU% MEMORY(bytes) MEMORY% |
|
102 | +node-1 200m 10% 1024Mi 25% |
|
103 | +node-2 150m 7% 512Mi 12% |
|
104 | +node-3 100m 5% 256Mi 6% |
|
105 | +kubectl top pods --all-namespaces |
|
106 | +输出示例: |
|
107 | +NAMESPACE NAME CPU(cores) MEMORY(bytes) |
|
108 | +kube-system coredns-78fcd69978-5kf2s 10m 70Mi |
|
109 | +kube-system etcd-node-1 50m 200Mi |
|
110 | +kube-system kube-apiserver-node-1 100m 300Mi |
|
111 | +kube-system kube-controller-manager-node-1 70m 150Mi |
|
112 | +kube-system kube-proxy-4w8dd 20m 30Mi |
|
113 | +kube-system kube-scheduler-node-1 30m 50Mi |
|
114 | +通过以上步骤,运维人员可以全面了解 Kubernetes 集群的运行状态,及时发现和解决潜在问题,确保集群的稳定性和高可用性。 |
|
115 | + |
|
116 | +3、Etcd 的备份 |
|
117 | +Etcd 是 Kubernetes 的核心组件之一,用于存储集群的所有数据。备份 Etcd 数据对于保障集群的数据安全至关重要。以下是详细步骤: |
|
118 | +1. 确定备份策略 |
|
119 | +1.备份频率: |
|
120 | +o根据集群的规模和业务需求,确定备份的频率。例如,对于生产环境,可以选择每天进行一次备份。 |
|
121 | +2.备份保留周期: |
|
122 | +o根据存储空间和业务需求,确定备份文件的保留周期。例如,可以保留最近 7 天的备份文件。 |
|
123 | +3.备份存储位置: |
|
124 | +o选择合适的备份存储位置,可以是本地存储、NFS 存储或云存储。确保备份文件的存储位置可靠且易于访问。 |
|
125 | +2. 手动备份 Etcd |
|
126 | +1.创建备份 Pod: |
|
127 | +o通过 Kubernetes 创建一个临时 Pod 来进行 Etcd 数据的备份。以下是一个示例 YAML 文件 etcd-backup.yaml: |
|
128 | +apiVersion: v1 |
|
129 | +kind: Pod |
|
130 | +metadata: |
|
131 | + name: etcd-backup |
|
132 | + namespace: kube-system |
|
133 | +spec: |
|
134 | + containers: |
|
135 | + - name: etcd-backup |
|
136 | + image: bitnami/etcd:latest |
|
137 | + command: |
|
138 | + - /bin/sh |
|
139 | + - -c |
|
140 | + - | |
|
141 | + ETCDCTL_API=3 etcdctl snapshot save /backup/etcd_backup.db \ |
|
142 | + --endpoints=https://127.0.0.1:2379 \ |
|
143 | + --cacert=/etc/kubernetes/pki/etcd/ca.crt \ |
|
144 | + --cert=/etc/kubernetes/pki/etcd/server.crt \ |
|
145 | + --key=/etc/kubernetes/pki/etcd/server.key |
|
146 | + volumeMounts: |
|
147 | + - name: etcd-certs |
|
148 | + mountPath: /etc/kubernetes/pki/etcd |
|
149 | + - name: backup |
|
150 | + mountPath: /backup |
|
151 | + volumes: |
|
152 | + - name: etcd-certs |
|
153 | + hostPath: |
|
154 | + path: /etc/kubernetes/pki/etcd |
|
155 | + - name: backup |
|
156 | + hostPath: |
|
157 | + path: /path/to/backup |
|
158 | +查看全部 |
|
159 | +2.应用 YAML 文件: |
|
160 | +o使用 kubectl 命令应用上述 YAML 文件。 |
|
161 | +kubectl apply -f etcd-backup.yaml |
|
162 | +3.等待备份完成: |
|
163 | +o通过查看 Pod 的日志,确认备份操作是否成功。 |
|
164 | +kubectl logs -f pod/etcd-backup -n kube-system |
|
165 | +4.验证备份文件: |
|
166 | +o检查备份文件是否成功生成。 |
|
167 | +ls -lh /path/to/backup/ |
|
168 | +3. 自动备份 Etcd |
|
169 | +为了简化备份操作,可以使用 Kubernetes 的 CronJob 实现 Etcd 的自动备份。 |
|
170 | +1.创建备份 CronJob: |
|
171 | +o编写一个 CronJob YAML 文件 etcd-backup-cronjob.yaml,以下是一个示例: |
|
172 | +apiVersion: batch/v1 |
|
173 | +kind: CronJob |
|
174 | +metadata: |
|
175 | + name: etcd-backup |
|
176 | + namespace: kube-system |
|
177 | +spec: |
|
178 | + schedule: "0 2 * * *" # 每天凌晨 2 点执行 |
|
179 | + jobTemplate: |
|
180 | + spec: |
|
181 | + template: |
|
182 | + spec: |
|
183 | + containers: |
|
184 | + - name: etcd-backup |
|
185 | + image: bitnami/etcd:latest |
|
186 | + command: |
|
187 | + - /bin/sh |
|
188 | + - -c |
|
189 | + - | |
|
190 | + ETCDCTL_API=3 etcdctl snapshot save /backup/etcd_backup_$(date +\%Y\%m\%d\%H\%M\%S).db \ |
|
191 | + --endpoints=https://127.0.0.1:2379 \ |
|
192 | + --cacert=/etc/kubernetes/pki/etcd/ca.crt \ |
|
193 | + --cert=/etc/kubernetes/pki/etcd/server.crt \ |
|
194 | + --key=/etc/kubernetes/pki/etcd/server.key |
|
195 | + volumeMounts: |
|
196 | + - name: etcd-certs |
|
197 | + mountPath: /etc/kubernetes/pki/etcd |
|
198 | + - name: backup |
|
199 | + mountPath: /backup |
|
200 | + volumes: |
|
201 | + - name: etcd-certs |
|
202 | + hostPath: |
|
203 | + path: /etc/kubernetes/pki/etcd |
|
204 | + - name: backup |
|
205 | + hostPath: |
|
206 | + path: /path/to/backup |
|
207 | + restartPolicy: OnFailure |
|
208 | +查看全部 |
|
209 | +2.应用 CronJob YAML 文件: |
|
210 | +o使用 kubectl 命令应用上述 YAML 文件。 |
|
211 | +kubectl apply -f etcd-backup-cronjob.yaml |
|
212 | +3.验证备份: |
|
213 | +o定期检查备份文件是否成功生成,并进行恢复测试,确保备份文件可以正常恢复集群数据。 |
|
214 | + |
|
215 | +4、通过 Etcd 恢复 Kubernetes 集群 |
|
216 | +在发生严重故障时,通过 Etcd 备份文件可以恢复 Kubernetes 集群的数据和状态。以下是详细步骤: |
|
217 | +1. 确定故障原因 |
|
218 | +1.确认集群故障原因: |
|
219 | +o在进行恢复操作之前,确认集群故障的原因,确保恢复操作是必要的。 |
|
220 | +o可以通过查看日志和事件信息来诊断故障原因。 |
|
221 | +2. 停止 Etcd 服务 |
|
222 | +在所有 Etcd 节点上停止 Etcd 服务。 |
|
223 | +kubectl -n kube-system scale deployment etcd --replicas=0 |
|
224 | +3. 恢复 Etcd 数据 |
|
225 | +1.创建恢复 Pod: |
|
226 | +o通过 Kubernetes 创建一个临时 Pod 来进行 Etcd 数据的恢复。以下是一个示例 YAML 文件 etcd-restore.yaml: |
|
227 | +apiVersion: v1 |
|
228 | +kind: Pod |
|
229 | +metadata: |
|
230 | + name: etcd-restore |
|
231 | + namespace: kube-system |
|
232 | +spec: |
|
233 | + containers: |
|
234 | + - name: etcd-restore |
|
235 | + image: bitnami/etcd:latest |
|
236 | + command: |
|
237 | + - /bin/sh |
|
238 | + - -c |
|
239 | + - | |
|
240 | + ETCDCTL_API=3 etcdctl snapshot restore /backup/etcd_backup.db \ |
|
241 | + --data-dir /var/lib/etcd |
|
242 | + volumeMounts: |
|
243 | + - name: etcd-certs |
|
244 | + mountPath: /etc/kubernetes/pki/etcd |
|
245 | + - name: backup |
|
246 | + mountPath: /backup |
|
247 | + - name: etcd-data |
|
248 | + mountPath: /var/lib/etcd |
|
249 | + volumes: |
|
250 | + - name: etcd-certs |
|
251 | + hostPath: |
|
252 | + path: /etc/kubernetes/pki/etcd |
|
253 | + - name: backup |
|
254 | + hostPath: |
|
255 | + path: /path/to/backup |
|
256 | + - name: etcd-data |
|
257 | + hostPath: |
|
258 | + path: /var/lib/etcd |
|
259 | +查看全部 |
|
260 | +2.应用 YAML 文件: |
|
261 | +o使用 kubectl 命令应用上述 YAML 文件。 |
|
262 | +kubectl apply -f etcd-restore.yaml |
|
263 | +3.等待恢复完成: |
|
264 | +o通过查看 Pod 的日志,确认恢复操作是否成功。 |
|
265 | +kubectl logs -f pod/etcd-restore -n kube-system |
|
266 | +4.删除恢复 Pod: |
|
267 | +o恢复完成后,删除恢复 Pod。 |
|
268 | +kubectl delete pod etcd-restore -n kube-system |
|
269 | +4. 启动 Etcd 服务 |
|
270 | +在所有 Etcd 节点上启动 Etcd 服务。 |
|
271 | +kubectl -n kube-system scale deployment etcd --replicas=3 |
|
272 | +5. 验证恢复结果 |
|
273 | +1.检查 Etcd 状态: |
|
274 | +o使用 etcdctl 命令检查 Etcd 的健康状态。 |
|
275 | + ETCDCTL_API=3 etcdctl endpoint health \ |
|
276 | + --endpoints=https://127.0.0.1:2379 \ |
|
277 | + --cacert=/etc/kubernetes/pki/etcd/ca.crt \ |
|
278 | + --cert=/etc/kubernetes/pki/etcd/server.crt \ |
|
279 | + --key=/etc/kubernetes/pki/etcd/server.key |
|
280 | +输出示例: |
|
281 | +https://127.0.0.1:2379 is healthy: successfully committed proposal: took = 1.234ms |
|
282 | +2.检查 Kubernetes 集群状态: |
|
283 | +o使用 kubectl get nodes 命令检查所有节点的状态。 |
|
284 | +kubectl get nodes |
|
285 | +o输出示例: |
|
286 | +NAME STATUS ROLES AGE VERSION |
|
287 | +node-1 Ready control-plane,master 10d v1.22.0 |
|
288 | +node-2 Ready <none> 10d v1.22.0 |
|
289 | +node-3 Ready <none> 10d v1.22.0 |
|
290 | +3.检查 Pod 状态: |
|
291 | +o使用 kubectl get pods --all-namespaces 命令检查所有命名空间中的 Pod 状态。 |
|
292 | +kubectl get pods --all-namespaces |
|
293 | +o输出示例: |
|
294 | +NAMESPACE NAME READY STATUS RESTARTS AGE |
|
295 | +kube-system coredns-78fcd69978-5kf2s 1/1 Running 0 10d |
|
296 | +kube-system etcd-node-1 1/1 Running 0 10d |
|
297 | +kube-system kube-apiserver-node-1 1/1 Running 0 10d |
|
298 | +kube-system kube-controller-manager-node-1 1/1 Running 0 10d |
|
299 | +kube-system kube-proxy-4w8dd 1/1 Running 0 10d |
|
300 | +kube-system kube-scheduler-node-1 1/1 Running 0 10d |
|
301 | +4.检查组件状态: |
|
302 | +o使用 kubectl get componentstatuses 命令检查 Kubernetes 组件的状态。 |
|
303 | +kubectl get componentstatuses |
|
304 | +o输出示例: |
|
305 | +NAME STATUS MESSAGE ERROR |
|
306 | +scheduler Healthy ok |
|
307 | +controller-manager Healthy ok |
|
308 | +etcd-0 Healthy {"health":"true"} |
|
309 | +5.检查事件: |
|
310 | +o使用 kubectl get events --all-namespaces 命令查看所有命名空间中的事件,以了解集群中的警告和错误信息。 |
|
311 | +kubectl get events --all-namespaces |
|
312 | +通过上述步骤,您可以确保 Kubernetes 集群已成功从 Etcd 备份中恢复,并且集群状态正常。 |