如何在间隔期间滚动kubernetes更新

时间:2017-01-31 16:21:54

标签: kubernetes kubernetes-health-check

我们需要确保k8s中的pod具有最新版本。 实现此目的的最佳方法是什么?

第一个想法是在某个点之后杀死吊舱,知道新的吊舱将会拉出最新的图像。这是what we found so far。仍然不知道该怎么做。

另一个想法是每隔5小时按间隔执行rolling-update。有没有办法做到这一点?

4 个答案:

答案 0 :(得分:2)

如@svenwltr所述,使用activeDeadlineSeconds是一个简单的选择,但可能会立即失去所有pod。为了降低这种风险,我使用deployment来管理pod及其推出,并配置一个小的第二个容器以及实际的应用程序。可以像这样配置小助手(following the official docs):

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将确保在该周期内更新图像。

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

答案 1 :(得分:1)

要使用关联功能,您只需在广告连播中指定activeDeadlineSeconds

未经测试的例子:

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

这样做的缺点是,您无法控制截止日期何时开始。这意味着可能会发生,您的所有pod都会同时被杀死,整个服务都会脱机(这取决于您的应用程序)。< / p>

答案 2 :(得分:1)

另一种选择是使用deployment并让控制器处理滚动输出。更具体一点:如果您更新image yaml中的deployment字段,它会自动更新每个广告连播。 IMO是最干净的方式,但它有一些要求:

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

答案 3 :(得分:0)

我尝试使用Pagid的解决方案,但遗憾的是我的观察和subsequent research表明他断言失败的容器将重启整个pod是不正确的。事实证明,只有失败的容器才会重新启动,这显然没有多大帮助,因为要点是以随机的间隔重新启动容器中的其他容器。

好消息是我有一个似乎有效的解决方案,这个解决方案基于他的答案。基本上,您不是写入/ tmp / healthy,而是写入已安装pod中每个容器的共享卷。您还需要将活动探针添加到每个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