1

We have a case where we need to make sure that pods in k8s have the latest version possible. What is the best way to accomplish this?

First idea was to kill the pod after some point, knowing that the new ones will come up pulling the latest image. Here is what we found so far. Still don't know how to do it.

Another idea is having rolling-update executed in intervals, like every 5 hours. Is there a way to do this?

4

4 回答 4

2

正如@svenwltr 所提到的,使用activeDeadlineSeconds是一个简单的选择,但有一次丢失所有 pod 的风险。为了减轻这种风险,我将使用 adeployment来管理 pod 及其部署,并配置一个小的第二个容器以及实际的应用程序。小助手可以这样配置(按照官方文档):

apiVersion: v1
kind: Pod
metadata:
  name: app-liveness
spec:
  containers:
  - name: liveness
    args:
    - /bin/sh
    - -c
    - touch /tmp/healthy; sleep $(( RANDOM % (3600) + 1800 )); rm -rf /tmp/healthy; sleep 600
    image: gcr.io/google_containers/busybox

    livenessProbe:
      exec:
        command:
        - cat
        - /tmp/healthy
      initialDelaySeconds: 5
      periodSeconds: 5

  - name: yourapplication
    imagePullPolicy: Always
    image: nginx:alpine

使用此配置,每个 pod 都会在配置的时间范围内(此处为 30 到 90 分钟)随机中断,这将触发新 pod 的启动。然后imagePullPolicy: Always将确保在该周期内更新图像。

这当然假设您的应用程序版本始终以相同的名称/标签可用。

于 2017-01-31T19:28:15.593 回答
1

要使用您的链接功能,您只需activeDeadlineSeconds在您的 pod 中指定。

未测试示例:

apiVersion: v1
kind: Pod
metadata:
  name: "nginx"
spec:
  activeDeadlineSeconds: 3600
  containers:
  - name: nginx
    image: nginx:alpine
    imagePullPolicy: Always

这样做的缺点是,您无法控制截止日期何时开始。这意味着它可能会发生,您的所有 Pod 同时被杀死并且整个服务离线(这取决于您的应用程序)。

于 2017-01-31T18:06:38.783 回答
1

另一种选择是使用 adeployment并让控制器处理推出。更具体地说:如果您更新yamlimage中的字段,它会自动更新每个 pod。deploymentIMO 这是最干净的方式,但它有一些要求:

  • 您不能使用latest标签。假设容器只需要更新,当图像标签发生变化时。
  • 如果发生更新,您必须以某种方式手动更新图像标签。这可以通过自定义控制器来完成,该控制器检查新标签并相应地更新部署。或者这可以由持续交付系统触发。
于 2017-01-31T18:13:17.730 回答
0

我尝试使用 Pagid 的解决方案,但不幸的是,我的观察和随后的研究表明,他关于失败的容器将重新启动整个 pod 的断言是不正确的。事实证明,只有失败的容器会被重新启动,当关键是要以随机间隔重新启动 pod 中的其他容器时,这显然没有多大帮助。

好消息是我有一个似乎可行的解决方案,该解决方案基于他的回答。基本上,不是写入 /tmp/healthy,而是写入 pod 中的每个容器都已挂载的共享卷。您还需要将 liveness probe 添加到每个 pod。这是一个基于我正在使用的示例:

  volumes:
  - name: healthcheck
    emptyDir:
      medium: Memory
  containers:
    - image: alpine:latest
      volumeMounts:
        - mountPath: /healthcheck
          name: healthcheck
      name: alpine
      livenessProbe:
        exec:
          command:
          - cat
          - /healthcheck/healthy
        initialDelaySeconds: 5
        periodSeconds: 5
    - name: liveness
      args:
      - /bin/sh
      - -c
      - touch /healthcheck/healthy; sleep $(( RANDOM % (3600) + 1800 )); rm -rf /healthcheck/healthy; sleep 600
      image: gcr.io/google_containers/busybox
      volumeMounts:
        - mountPath: /healthcheck
          name: healthcheck
      livenessProbe:
        exec:
          command:
          - cat
          - /healthcheck/healthy
        initialDelaySeconds: 5
        periodSeconds: 5
于 2018-01-28T23:30:33.313 回答