当部署超过“progressDeadlineSeconds”时,如何自动将部署回滚到以前的修订版?

Swa*_*pta 11 docker kubernetes azure-aks

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

kubectl apply -f <deployment_file>.yaml
Run Code Online (Sandbox Code Playgroud)

并且容器已成功部署在 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

Run Code Online (Sandbox Code Playgroud)

我在上面的 yaml 文件中定义了“progressDeadlineSeconds”属性。

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

kubectl rollout status deployment.v1beta1.apps/publisher
Run Code Online (Sandbox Code Playgroud)

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

kubectl apply -f <deployment_file>.yaml
Run Code Online (Sandbox Code Playgroud)

应用更新。

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

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

P E*_*ram 9

请按照以下步骤操作。

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
Run Code Online (Sandbox Code Playgroud)


Ben*_*sur 5

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

在 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 &
Run Code Online (Sandbox Code Playgroud)

timeout 5kubectl rollout status如果 5 秒后卡住,则停止。

> /dev/null 2>&1 &在后台运行该命令并且没有终端输出。