k8s重启Pod一例

阿里云教程3个月前发布
22 1 0

重启的方式许多种,这个 仅仅是基于特殊环境的一个case 其中涉及到HPA的UID,防止其改变的一些,所以需要要临时禁止 HPA(Horizontal Pod Autoscaler)的调度,

需求是这样的, 重启GKE里面的pod

– 1 deployment数量是通过hpa来控制的,但是由于不能调整hpa的数值,可能会改 UID

– 2 只能通过kubectl scale deployment –replicas 来调整Pod的数量

– 3 需要确定新启动的Pod能够正常工作,或者说health check 正常之后,删除掉原来的旧的Pod .可以根据创建时间来删除

对于以上需求,有什么好的实现方式或者过滤规则,来确保最小化的不中断服务?

– summary

– HPA 的最小和最大副本数量将与 Deployment 的副本数量一样,这意味着 HPA 将不再调整副本数量

– scale 到3 的同时修改hpa 的 minReplicas maxReplicas 为一样值,列如3

– 一连串状态检测之后着手删除旧的Pod

– 由于只要是这里删除就会产生中断

– 不做任何调整的情况下直接删除旧的Pod

– 这时候会依赖于scale的数量进行拉去新的Pod 以满足 足量的Pod运行

– 再次修改hpa 的 minReplicas maxReplicas为原始的值,那么scale会自动收缩,此时收缩的这些Pod能够保证是最新的Pod

采取以下步骤:

1. 使用`kubectl scale deployment`命令调整Pod的数量:根据您的需求,使用该命令增加或减少Deployment的副本数量。例如,如果您希望将副本数量增加到3个,可以运行以下命令:`kubectl scale deployment <deployment-name> –replicas=3`。

2. 确认新启动的Pod正常工作:等待新的Pod完成启动并通过健康检查后,可以使用以下命令获取Pod的状态:`kubectl get pods`。检查每个Pod的状态是否为”Running”,并且它们的容器处于”Ready”状态。这可以确保新的Pod已经成功启动并且就绪。

3. 删除旧的Pod:您可以使用以下命令来删除旧的Pod:`kubectl delete pod <pod-name>`。为了按照创建时间来删除Pod,您可以使用`kubectl get pods –sort-by=
.metadata.creationTimestamp`命令获取按照创建时间排序的Pod列表,然后选择删除旧的Pod。

可以使用以下命令获取按创建时间排序的 Pod 列表,并选择性删除比较旧的 Pod:

– 获取所有 Pod 的列表,并按照创建时间排序:

– Testing at my Mac

kubectl scale deployment busybox-app --replicas=4 -n lex-ext-kdp
deployment.apps/busybox-app scaled
kubectl get pods --sort-by=.metadata.creationTimestamp -n lex-ext-kdp
NAME                          READY   STATUS              RESTARTS   AGE
busybox-app-cd9f68c69-6p8x4   1/1     Running             0          3m53s
busybox-app-cd9f68c69-s255b   1/1     Running             0          79s
busybox-app-cd9f68c69-x2hzr   0/1     Running             0          18s
busybox-app-cd9f68c69-5l2mk   0/1     ContainerCreating   0          5s
默认排序
kubectl get pods -n lex-ext-kdp
NAME                          READY   STATUS    RESTARTS   AGE
busybox-app-cd9f68c69-5l2mk   1/1     Running   0          66s
busybox-app-cd9f68c69-6p8x4   1/1     Running   0          4m54s
busybox-app-cd9f68c69-s255b   1/1     Running   0          2m20s
busybox-app-cd9f68c69-x2hzr   1/1     Running   0          79s
```bash
kubectl get pods --sort-by=.metadata.creationTimestamp

输出示例:

NAME READY STATUS RESTARTS AGE
pod1 1/1 Running 0 1m
pod2 1/1 Running 0 2m
pod3 1/1 Running 0 3m
```

– 查看你想要删除的那些较旧 Pod 的名称:

```bash
kubectl get pods --sort-by=.metadata.creationTimestamp
```

– 删除指定的较旧 Pod:

```bash
kubectl delete pod pod1 pod2
```

– 再次查看 Pod 列表,可以看到那些较旧的 Pod 已被删除:

```bash
kubectl get pods --sort-by=.metadata.creationTimestamp

输出示例:

NAME READY STATUS RESTARTS AGE
pod3 1/1 Running 0 4m

如果这里要写脚本按照数量来删除最早的那个Pod

#!/bin/bash

NAMESPACE="lex-ext-kdp"
DEPLOYMENT="busybox-app"
MAX_PODS=3

# 获取Pod的数量
pod_count=$(kubectl get pods -n $NAMESPACE --selector=app=$DEPLOYMENT --no-headers | wc -l)

# 如果Pod的数量大于3,则删除旧的Pod
if [ "$pod_count" -gt "$MAX_PODS" ]; then
  pods_to_delete=$((pod_count - MAX_PODS))
  echo "Deleting $pods_to_delete old pod(s)..."

  # 获取按创建时间排序的Pod列表,并删除旧的Pod
  pods=$(kubectl get pods -n $NAMESPACE --selector=app=$DEPLOYMENT --sort-by=.metadata.creationTimestamp --no-headers | head -n $pods_to_delete | awk '{print $1}')
  for pod in $pods; do
    kubectl delete pod $pod -n $NAMESPACE
  done

  echo "Old pod(s) deleted."
else
  echo "No old pods to delete."
fi

要临时禁止 HPA(Horizontal Pod Autoscaler)的调度,您可以更新相关的 HPA 对象,将其副本数量的最小和最大值设置为与当前 Deployment 的副本数量一样。这样,HPA 将不会再调整副本数量。

以下是一种可能的方法来禁止 HPA 的调度:

1. 查找与 Deployment 关联的 HPA 对象:

```shell
kubectl get hpa -n lex-ext-kdp
```

2. 获取与您的 Deployment 相关联的 HPA 的名称,然后更新它们:

```shell
kubectl edit hpa <hpa-name> -n lex-ext-kdp
```

3. 在编辑器中,将 `spec.minReplicas` 和 `spec.maxReplicas` 的值设置为 Deployment 的当前副本数量。这将阻止 HPA 调整副本数量:

```yaml
spec:
minReplicas: 4 # 设置为与 Deployment 的副本数量一样
maxReplicas: 4 # 设置为与 Deployment 的副本数量一样
```

4. 保存并关闭编辑器。

目前,HPA 的最小和最大副本数量将与 Deployment 的副本数量一样,这意味着 HPA 将不再调整副本数量。

请注意,这是一种临时禁止 HPA 调度的方法。如果您希望再次启用 HPA,请将 `spec.minReplicas` 和 `spec.maxReplicas` 的值恢复为适当的范围,并保存更新的 HPA 对象。

– 上面这种临时禁止HPA的方式会改变deployment的UID?

“`

– 上述临时禁止 HPA 调度的方式不会改变 Deployment 的 UID。Deployment 的 UID 是在创建 Deployment 时分配的唯一标识符,它代表 Deployment 的身份和版本。

临时禁止 HPA 调度的操作涉及的是更新 HPA 对象的配置,而不是 Deployment 对象本身。更新 HPA 对象的配置不会影响 Deployment 的 UID 或其他相关标识符。

因此,您可以放心使用上述方法来临时禁止 HPA 的调度,而不会对 Deployment 的 UUID 产生影响。 Deployment 的 UUID 仍将保持不变,并且您可以随时将 HPA 的配置恢复为原始设置,以便再次启用 HPA 调度。

“`

当对 HorizontalPodAutoscaler (HPA) 进行修改时,HPA 的 UID 不会改变。

HPA 的 UID 是由 Kubernetes 在创建 HPA 时生成的,用于唯一标识这个 HPA 对象。无论之后 HPA 有何修改,这个 UID 都会保持不变。

k8s重启Pod一例

k8s重启Pod一例

© 版权声明

相关文章

1 条评论

none
暂无评论...