【问题标题】:How to roll back a deployment to a previous revision automatically when deployment has crossed 'progressDeadlineSeconds'?当部署超过“progressDeadlineSeconds”时,如何自动将部署回滚到以前的版本?
【发布时间】:2019-10-11 00:23:44
【问题描述】:

我正在努力在 kubernetes 中部署 docker 映像。第一次部署容器时,我使用了:

kubectl apply -f <deployment_file>.yaml

并且容器已成功部署在 pod 中。

此外,deployment_file 看起来像这样:

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: publisher
spec:
  replicas: 2
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
  minReadySeconds: 300
  progressDeadlineSeconds: 900
  template:
    metadata:
      labels:
        app: publisher
    spec:
      containers:
      - name: publisher
        image: 123dev.azurecr.io/publisher:{{ci-build-number}}
        env:
          - name: ENVIRONMENT
            value: "dev"
        ports:
        - containerPort: 8080

我已经在上面的 yaml 文件中定义了 'progressDeadlineSeconds' 属性。

为了跟踪部署,我使用了:

kubectl rollout status deployment.v1beta1.apps/publisher

现在如果我想用新图像更新容器,我可以再次重复使用该命令

kubectl apply -f <deployment_file>.yaml

应用更新。

但是如果由于某种原因应用更新失败(假设 docker 映像已损坏),有没有办法自动触发回滚到以前的版本 - pod 状态未设置为“正在运行”或执行时间跨过“pregressDeadlineSeconds”?

到目前为止,我还没有找到一种自动执行回滚的方法。想法将不胜感激。

【问题讨论】:

    标签: docker kubernetes azure-aks


    【解决方案1】:

    按照以下步骤操作。

    1. append the --record param to deployment, as shown below
    kubectl apply -f <deployment_file>.yaml --record
    
    2. kubectl rollout history deploy <deployment-name> to check deployment history. for example,
    kubectl rollout history deploy mynginx
    deployments "mynginx"
    REVISION  CHANGE-CAUSE
    3         kubectl set image deploy mynginx mynginx=nginx:1.12.2
    4         kubectl set image deploy mynginx mynginx=nginx:1.13.8
    
    
    3. you can rollback to previous version using revision, say to revision 3
    kubectl rollout undo deploy mynginx --to-revision=3
    

    【讨论】:

      【解决方案2】:

      kubectl apply 命令之后,您可以检查部署是否成功推出,然后,如有必要,kubectl rollout undo 命令可以回滚到以前的版本。 此外,您可以在此之前使用sleep Linux 命令等待一段时间。

      在 Linux 上:

      sleep 900 && \
      if [[ $(timeout 5 kubectl rollout status -f <deployment_file>.yaml) != *"successfully rolled out"* ]]; then     
          kubectl rollout undo -f <deployment_file>.yaml
      fi > /dev/null 2>&1 &
      

      如果kubectl rollout status 在 5 秒后卡住,timeout 5 将停止它。

      &gt; /dev/null 2&gt;&amp;1 &amp; 在后台运行命令,没有终端输出。

      【讨论】:

        【解决方案3】:

        这是我撤消部署推出所遵循的步骤

        这里 client-depl 是部署的名称

        Step.1 要获取特定部署的历史列表,请使用此命令

        kubectl rollout history deploy client-depl
        

        之后你会得到这样的输出。

        rollout history deploy image

        假设我想将部署部署到 REVISION 1 然后使用此命令

        $ kubectl rollout undo deploy client-depl --to-revision=1
        

        之后你会得到这样的输出

        deployment rollback image

        恭喜您已成功将部署部署到以前的版本。如有任何疑问,请回复,我们很乐意为您提供帮助。

        【讨论】:

          猜你喜欢
          • 2019-03-14
          • 2010-10-04
          • 1970-01-01
          • 2017-10-10
          • 2019-11-03
          • 2016-03-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多