重启的方式许多种,这个 仅仅是基于特殊环境的一个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 都会保持不变。

