在Kubernetes中更新configmap时重新启动pod?

Joh*_*han 92 kubernetes

我知道有人谈论在配置映射发生变化时自动重启pod的能力,但据我所知,Kubernetes 1.2尚未提供.

那么(我认为)我想做的是与使用配置映射的pod相关联的部署资源的"滚动重启" .是否有可能,如果是这样,如何在Kubernetes中强制重新启动部署而不更改实际模板中的任何内容?这是目前最好的方式还是有更好的选择?

Sym*_*ric 113

当前解决此问题的最佳解决方案(在兄弟答案中链接的https://github.com/kubernetes/kubernetes/issues/22368中深入引用)是使用Deployments,并认为您的ConfigMaps是不可变的.

如果要更改配置,请使用要进行的更改创建新的ConfigMap,并将部署指向新的ConfigMap.如果新配置中断,部署将拒绝缩小您正在工作的ReplicaSet.如果新配置有效,则旧的ReplicaSet将缩放为0个副本并删除,新的pod将使用新配置启动.

不像仅仅编辑ConfigMap那么快,但更安全.

  • 值得一提的是,新的实验工具 `kustomize` 支持自动创建确定性的 configmap 哈希,这意味着您无需手动创建新的 configmap:https://github.com/kubernetes-sigs/kustomize/blob/12d1771bb349e1523bc546e314da67fas684 /configGeneration.md#L5 (7认同)
  • 这也是我们采用的方法 (2认同)

Pra*_*h B 47

在配置地图更新上发信号通知pod是一项功能(https://github.com/kubernetes/kubernetes/issues/22368).

您可以随时编写一个自定义pid1,注意到confimap已更改并重新启动您的应用.

您还可以例如:在2个容器中安装相同的配置映射,如果配置映射内容的散列发生更改,则在第二个容器中显示http运行状况检查,并将其作为第一个容器的活动探测器(因为容器中的容器) pod共享相同的网络命名空间).当探针失败时,kubelet将为您重新启动第一个容器.

当然,如果你不关心pod所在的节点,你可以简单地删除它们,复制控制器将为你"重启"它们.

  • 使用部署我会缩小它然后向上.尽管如此,你仍然会有那么少的停机时间.你可以在一行中做到这一点来减少...`kubectl scale deployment/update-demo --replicas = 0; kubectl scale deployment/update-demo --replicas = 4;` (5认同)
  • 更容易运行“kubectl rollout restart deployment/my-deploy”,k8s 将管理滚动重启,类似于更新部署的工作方式。这也适用于 DaemonSets 和 StatefulSets (4认同)

Vin*_*nay 24

对于我来说k8s > 1.15,作为 CI/CD 的一部分,将应用程序配置路径与卷挂载连接起来,重新启动部署对我来说效果最好。部署清单 YML 中的重新加载器插件或设置restartPolicy: Always对我不起作用。无需更改应用程序代码,适用于静态资产和微服务。

kubectl rollout restart deployment/<deploymentName> -n <namespace> 
Run Code Online (Sandbox Code Playgroud)


qua*_*nta 22

https://github.com/kubernetes/helm/blob/master/docs/charts_tips_and_tricks.md#user-content-automatically-roll-deployments-when-configmaps-or-secrets-change

配置映射或秘密通常作为配置文件注入容器中.根据应用程序的不同helm upgrade,如果使用后续应用程序进行更新,则可能需要重新启动,但如果部署规范本身未更改,则应用程序将继续使用旧配置运行,从而导致部署不一致.

sha256sum函数可与include函数一起使用,以确保在另一个规范更改时更新部署模板部分:

kind: Deployment
spec:
  template:
    metadata:
      annotations:
        checksum/config: {{ include (print $.Template.BasePath "/secret.yaml") . | sha256sum }}
[...]
Run Code Online (Sandbox Code Playgroud)

在我的情况下,由于某些原因,$.Template.BasePath没有工作,但$.Chart.Name确实:

spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: admin-app
      annotations:
        checksum/config: {{ include (print $.Chart.Name "/templates/" $.Chart.Name "-configmap.yaml") . | sha256sum }}
Run Code Online (Sandbox Code Playgroud)

  • 不适用于一般Kubernetes用法,仅适用于Helm (4认同)
  • 答案很有帮助,但可能与这个问题无关 (2认同)

小智 19

我发现这样做的最好方法是运行Reloader

https://github.com/stakater/Reloader

它允许您定义要监视的配置映射或机密,当它们更新时,将执行部署的滚动更新.这是一个例子:

您有一个部署foo和一个名为ConfigMap的foo-configmap.您希望每次更改configmap时都滚动部署的pod.您需要运行Reloader:

kubectl apply -f https://raw.githubusercontent.com/stakater/Reloader/master/deployments/kubernetes/reloader.yaml
Run Code Online (Sandbox Code Playgroud)

然后在部署中指定此批注:

kind: Deployment
metadata:
  annotations:
    configmap.reloader.stakater.com/reload: "foo-configmap"
  name: foo
...
Run Code Online (Sandbox Code Playgroud)

  • @SteveWu 这已经发生了 https://kubernetes.io/docs/concepts/configuration/configmap/#mounted-configmaps-are-updated-automatically 但如果您正在运行的应用程序需要发出信号或重新启动以获取更新的文件,那就是这个问题是关于什么的。 (2认同)

Mao*_*dok 7

您可以更新与您的部署无关的元数据标签。它将触发滚动更新

例如:

metadata:
  labels:
    configmap-version: 1
Run Code Online (Sandbox Code Playgroud)

  • 元数据标签更改不会触发Pod重新启动 (5认同)
  • 我相信只要元数据标签位于“template.spec”下,这就有效 (3认同)
  • 确认使用“spec.template.metadata.labels”下的标签有效!(已编辑正在审查的答案)。非常优雅的方法来做到这一点:+1 (3认同)
  • 对于这种方法,我建议使用注释而不是标签,因为您可以自由更新注释,并且标签不能改变。或者在更新版本的 kubectl 中可以简单地调用“kubectl rollout restart deployment/mydeployname”来触发相同配置的新部署。https://kubernetes.io/docs/reference/ generated/kubectl/kubectl-commands#-em-restart-em- (3认同)
  • 这个答案有很多赞,所以我需要问一下。如果我们更新元数据,Kubernetes集群会触发滚动更新吗?@maoz-zadok (2认同)

Bry*_*yji 6

在部署位于子图表中并且控制它的值位于父图表的值文件中时遇到了这个问题。这是我们用来触发重启的:

spec:
  template:
    metadata:
      annotations:
        checksum/config: {{ tpl (toYaml .Values) . | sha256sum }}
Run Code Online (Sandbox Code Playgroud)

显然,这将在任何值更改时触发重新启动,但它适用于我们的情况。子图表中最初的内容只有在子图表中的 config.yaml 本身发生更改时才有效:

    checksum/config: {{ include (print $.Template.BasePath "/config.yaml") . | sha256sum }}
Run Code Online (Sandbox Code Playgroud)