Answers:
在配置映射更新中向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;
当前解决此问题的最佳方法(在同级答案中的https://github.com/kubernetes/kubernetes/issues/22368中进行了深入引用)是使用Deployments,并认为您的ConfigMap是不可变的。
当您要更改配置时,请使用要进行的更改创建一个新的ConfigMap,并将部署指向新的ConfigMap。如果新配置损坏,则部署将拒绝按比例缩小您的工作副本集。如果新配置有效,则旧的ReplicaSet将缩放为0个副本并删除,新的Pod将以新的配置启动。
速度不如仅编辑ConfigMap那样快,但更安全。
kustomize
支持自动创建确定性的configmap哈希,这意味着您无需手动创建新的configmap:github.com/kubernetes-sigs/kustomize/blob/…–
通常,将configmap或密钥作为配置文件注入到容器中。根据应用程序的不同helm upgrade
,如果使用后续版本进行更新,则可能需要重新启动,但是如果部署规范本身未更改,则应用程序将继续使用旧配置运行,从而导致部署不一致。
该sha256sum
功能可以与该include
功能一起使用,以确保在其他规范更改时更新部署模板部分:
kind: Deployment
spec:
template:
metadata:
annotations:
checksum/config: {{ include (print $.Template.BasePath "/secret.yaml") . | sha256sum }}
[...]
就我而言,由于某些原因,它$.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 }}
helm
3是最近发布的。因此,链接已过时。它指向master
分支。下面的网址会导致(目前)最新helm
2个文档:github.com/helm/helm/blob/release-2.16/docs/...
Deployment.apps "xxx" is invalid: metadata.labels: Invalid value: "xxx": must be no more than 63 characters
。替代方法是| trunc 63
,但是sha1sum应该“更独特”。
我发现最好的方法是运行Reloader
它允许您定义要查看的配置映射或机密,当它们更新时,将对您的部署执行滚动更新。这是一个例子:
您有一个部署foo
和一个名为的ConfigMap foo-configmap
。您希望每次更改configmap时都滚动部署的Pod。您需要使用以下命令运行Reloader:
kubectl apply -f https://raw.githubusercontent.com/stakater/Reloader/master/deployments/kubernetes/reloader.yaml
然后在部署中指定此注释:
kind: Deployment
metadata:
annotations:
configmap.reloader.stakater.com/reload: "foo-configmap"
name: foo
...
您可以更新与您的部署无关的元数据标签。它将触发滚动更新
例如:
metadata:
labels:
configmap-version: 1
template.spec
如果部署位于子图表中,而控制它的值位于父图表的值文件中,则出现此问题。这是我们用来触发重启的内容:
spec:
template:
metadata:
annotations:
checksum/config: {{ tpl (toYaml .Values) . | sha256sum }}
显然,这将在任何值更改时触发重新启动,但适用于我们的情况。仅当子图中的config.yaml更改时,子图中的原始内容才有效:
checksum/config: {{ include (print $.Template.BasePath "/config.yaml") . | sha256sum }}
另一种方法是将其粘贴到“部署”的命令部分:
...
command: [ "echo", "
option = value\n
other_option = value\n
" ]
...
另外,要使其更像ConfigMap,请使用其他Deployment,它将只在该command
部分中托管该配置并kubectl create
在其上执行,同时为其名称添加唯一的“版本”(例如计算内容的哈希值)并修改所有使用该配置的部署:
...
command: [ "/usr/sbin/kubectl-apply-config.sh", "
option = value\n
other_option = value\n
" ]
...
kubectl-apply-config.sh
如果它能正常工作,我可能会发布。
(不要那样做;它看起来太糟糕了)
$ kubectl set env deployment my deployment --env="LAST_RESTART=$(date)" --namespace ...
为我做这份工作