在集群更新期间管理 Kubernetes 中的恒定工作负载

问题描述 投票:0回答:1

我有一个项目,我的 Pod 运行恒定的功能,这使得可扩展性以及在更新期间恢复它们的任务充满挑战。我考虑过使用 Horizontal Pod Autoscaler (HPA),但它似乎无法解决更新后恢复集群的需要。

详细来说,我需要传递一个环境密钥(CLUSTER_KEY)来恢复集群,该密钥与之前删除的集群中使用的密钥相同。我正在考虑创建一个自定义 shell 应用程序来管理集群创建、销毁和工作负载验证。这样,我就可以决定是否创建一个新的集群来处理工作负载。

主要挑战出现在更新集群时,例如使用新映像。集群提供持续、不间断的工作,如果被破坏,解决方案是通过相同的环境密钥进行恢复。这确保销毁仅用于更新集群,然后集群根据环境迅速恢复其正在进行的任务。

我不确定最好的方法。有人可以提供有关更新集群而不丢失其正在执行的正在进行的任务的指导吗?任何有关在集群更新期间处理恒定工作负载的见解将不胜感激。

pod 的自定义管理器

node.js kubernetes scale azure-aks
1个回答
0
投票

在不中断持续工作负载的情况下更新 Kubernetes 集群是一个常见的挑战。以下是使用滚动更新策略和部署的分步指南。此示例假设无状态应用程序,但类似的原则也适用于有状态集。让我们考虑这样一个场景:您有一个部署正在运行一个应用程序 (

nginx
),该应用程序需要零停机时间进行更新。

确保您的部署清单(在本例中

nginx-deployment.yaml
)包含必要的环境变量和就绪/活跃探针。现在假设您想要将映像从 1.18 更新到 1.19.0,相应地修改部署文件的映像部分(无论您的情况是什么映像),并根据需要在 env 部分下添加集群密钥。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.19.0
        ports:
        - containerPort: 80
        readinessProbe:
          httpGet:
            path: /health
            port: 80
        livenessProbe:
          httpGet:
            path: /health
            port: 80

---

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: LoadBalancer
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

kubectl apply -f myapp-deployment.yaml

重新应用更新后的部署。 Kubernetes 将开始推出更新。它使用更新的版本创建新的 pod,并逐渐终止旧的 pod,确保可用 pod 的数量不低于所需状态。 您可以监控推出状态:

kubectl rollout status deployment/myapp-deployment
enter image description here

enter image description here

enter image description here

如果出现问题,您也可以撤消更新:

kubectl rollout undo deployment/myapp-deployment

此方法可确保您的应用程序在更新期间持续可用。 Kubernetes 的滚动更新旨在以零停机时间更新 Pod,从而保持恒定的工作负载。升级 AKS 集群本身(如 Kubernetes 版本的控制平面)时,AKS 会管理此过程以最大程度地减少中断。

参考文档: 无需停机即可升级 aks

© www.soinside.com 2019 - 2024. All rights reserved.