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 备份中恢复,并且集群状态正常。