【问题标题】:Scheduled restart of Kubernetes pod without downtimeKubernetes pod 计划重启而不会停机
【发布时间】:2019-07-12 18:38:22
【问题描述】:

我有 6 个 pod 副本正在运行,我想每 5 分钟重新启动\重新创建一次。

这需要滚动更新 - 这样所有更新都不会立即终止,也不会出现停机时间。我如何做到这一点?

我尝试使用 cron 作业,但似乎无法正常工作:

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: scheduled-pods-recreate
spec:
  schedule: "*/5 * * * *"
  concurrencyPolicy: Forbid
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: ja-engine
            image: app-image
            imagePullPolicy: IfNotPresent
          restartPolicy: OnFailure

虽然该作业已成功创建并按照以下说明安排,但它似乎从未运行过:

Name:                       scheduled-pods-recreate
Namespace:                  jk-test
Labels:                     <none>
Annotations:                <none>
Schedule:                   */5 * * * *
Concurrency Policy:         Forbid
Suspend:                    False
Starting Deadline Seconds:  <unset>
Selector:                   <unset>
Parallelism:                <unset>
Completions:                <unset>
Pod Template:
  Labels:  <none>
  Containers:
   ja-engine:
    Image:           image_url
    Port:            <none>
    Host Port:       <none>
    Environment:     <none>
    Mounts:          <none>
  Volumes:           <none>
Last Schedule Time:  Tue, 19 Feb 2019 10:10:00 +0100
Active Jobs:         scheduled-pods-recreate-1550567400
Events:
  Type    Reason            Age   From                Message
  ----    ------            ----  ----                -------
  Normal  SuccessfulCreate  23m   cronjob-controller  Created job scheduled-pods-recreate-1550567400

首先,我如何确保它正在运行以便重新创建 pod?

另外我怎样才能确保不停机?

cronjob 的更新版本:

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - kubectl patch deployment runners -p '{"spec":{"template":{"spec":{"containers":[{"name":"jp-runner","env":[{"name":"START_TIME","value":"'$(date +%s)'"}]}]}}}}' -n jp-test
          restartPolicy: OnFailure

Pod 未以消息 Back-off restarting failed container 和错误开始,如下所示:

State:          Terminated
      Reason:       Error
      Exit Code:    127

【问题讨论】:

    标签: kubernetes kubernetes-helm kubernetes-cronjob


    【解决方案1】:

    目前 Kubernetes 中没有滚动重启功能,但您可以使用以下命令作为解决方法来重启特定部署中的所有 pod:
    (将部署名称和 pod 名称替换为真实的)

    kubectl patch deployment mydeployment -p '{"spec":{"template":{"spec":{"containers":[{"name":"my-pod-name","env":[{"name":"START_TIME","value":"'$(date +%s)'"}]}]}}}}'
    

    要安排它,您可以在主节点上创建一个 cron 任务来定期运行此命令。
    拥有该任务的用户应具有正确的 kubectl 配置 (~/.kube/config) 并有权更改提及的部署对象。

    可以从/etc/kubernetes/admin.conf 复制默认集群管理员配置:
    (通常由kubeadm init创建):

    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
    

    可以指定两种类型的 deployment update strategy重新创建 (.spec.strategy.type==Recreate.) 和滚动更新 (.spec.strategy.type==RollingUpdate)。

    只有使用滚动更新策略才能避免服务停机。您可以在部署 YAML 中指定maxUnavailablemaxSurge 参数来控制滚动更新过程。

    【讨论】:

    • 我希望将其作为 helm 图表本身的一部分,以及作为 CronJob yaml 文件的一部分
    • 这行得通,所以如果我将策略设置为 RollingUpdate 并进行补丁部署,它会进行滚动更新吗?
    • 是的,当容器规范发生变化时,deployment开始重启pods。
    • 你也可以从 CronJob 运行 kubectl patch 命令,你只需要从 CronJob Pod 中使用 kubectl 或 curl 访问集群 api-server。对于 kubectl,您需要正确的配置,对于 curl,您需要身份验证令牌。你可以在这个问题的答案中找到一个很好的例子:stackoverflow.com/questions/42642170/…
    • 所以我决定使用补丁部署,但不能真正让它作为 cronjob 运行 - 也更新了我的问题 - 我错过了什么吗?
    【解决方案2】:

    从 Kubernetes 1.15 开始,使用以下命令进行滚动重启。

    kubectl rollout restart deployment <deployment name>
    

    【讨论】:

    • 这个答案没有解决问题的“预定”/工作方面
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-22
    • 2020-03-01
    • 1970-01-01
    • 2020-04-17
    • 1970-01-01
    相关资源
    最近更新 更多