引言

在Kubernetes(K8s)集群的管理中,停服节点是一个常见的操作,可能是为了维护、升级或替换节点。然而,这个过程需要谨慎处理,以确保业务连续性和集群的稳定性。本文将详细介绍K8s停服节点的操作指南,并通过实战案例分析,帮助您更好地理解和执行这一过程。

操作指南

1. 确定停服节点的原因和计划

在进行节点停服之前,首先需要明确停服的原因和计划。这包括确定停服的时间窗口、影响范围以及备选方案。

2. 验证节点状态

在停服节点之前,使用以下命令验证节点状态:

kubectl get nodes

确保要停服的节点不处于Ready状态,并且没有正在运行的服务。

3. 调整服务负载

对于将要停服的节点,需要调整相关服务的负载。这可以通过以下步骤完成:

  • 调整Service类型为Headless:对于无状态服务,将其Service类型调整为Headless,以便流量可以均匀地分布到其他节点。
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: ClusterIP
  • 调整Deployment或StatefulSet:对于有状态服务,调整Deployment或StatefulSet的副本数,确保服务不会在停服节点上运行。
spec:
  replicas: 3

4. 停服节点

一旦完成负载调整,可以使用以下命令停服节点:

kubectl cordon <node-name>

这会将节点标记为不可调度,防止新的Pod被调度到该节点。

5. 确保数据持久化

在停服节点之前,确保所有数据都已经持久化。对于有状态服务,可以使用以下命令导出数据:

kubectl cp <pod-name>:/path/to/data /path/to/backup --namespace <namespace>

6. 节点维护

在节点维护期间,进行必要的操作,如硬件升级、软件安装等。

7. 重启节点

完成维护后,使用以下命令重启节点:

kubectl uncordon <node-name>

这会将节点标记为可调度,允许新的Pod被调度到该节点。

8. 恢复服务

在节点重启后,确保所有服务都已经恢复正常。这可以通过检查Pod状态和Service访问来完成。

实战案例分析

假设我们有一个名为my-app的无状态服务,它运行在名为node1的节点上。我们需要停服node1进行硬件升级。

  1. 调整Service类型为Headless:
kubectl apply -f headless-service.yaml
  1. 调整Deployment副本数:
kubectl scale deployment my-app --replicas 2
  1. 停服node1
kubectl cordon node1
  1. 导出数据:
kubectl cp my-app-5c885d6b4c-7474b /path/to/backup --namespace default

    进行硬件升级。

    重启node1

kubectl uncordon node1
  1. 检查Pod状态和Service访问,确保服务恢复正常。

通过以上步骤,我们成功停服了K8s节点,并进行了必要的维护,同时确保了业务的连续性和集群的稳定性。