kubernetes 配置部署删除现有文件
kubernetes config deployment removing existing files
我想在 helm 部署时更新容器中的现有文件 settings.ini
,而不损害容器中的现有数据。
这是我的 helm 文件 -
config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Values.metadata.name }}-config
data:
settings.ini: |
[server]
hostname = "localhost"
hot_deployment = false
# offset = 10
[user_store]
type = "read_only_ldap"
来自 Deployment.yaml
的部署部分
containers:
- name: {{ .Chart.Name }}
securityContext:
{{- toYaml .Values.securityContext | nindent 12 }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
ports:
- name: http
containerPort: 80
protocol: TCP
volumeMounts:
- name: config-volume
mountPath: /home/bin/conf/
subPath: settings.ini
volumes:
- name: config-volume
configMap:
name: {{ .Values.metadata.name }}-config
我可以看到它成功创建了配置映射,但是当我检查集群中的日志时,它抱怨缺少文件
我该如何解决这个问题?
如果我只是想在不同的环境中使用不同的值更新我的 settings.ini
文件的一些配置,还有什么有效的方法可以实现这一点?
如果您使用的是旧版本的 Kubernetes,更改 configmap 和密码不会重启您的容器。
您可以使用 YAML apply 或使用 CLI edit 手动更新 configmap。
更新 configmap 后,您可以简单地应用 helm 命令来推出更新和 change/udpate 新容器。在这种情况下,旧容器不会受到影响,并且只需推出更改即可。
如果您正在寻找自动化的方法,您可以使用:https://github.com/stakater/Reloader
Reloader 可以观察 ConfigMap 和 Secret 中的变化,并在 Pods 上对其相关的 DeploymentConfig、Deployments、Daemonsets Statefulsets 和 Rollouts 进行滚动升级。
这是一个很好的例子:https://github.com/stakater/Reloader/issues/46#issuecomment-457131306
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
annotations:
configmap.reloader.stakater.com/reload: "nginx-configmap"
spec:
selector:
matchLabels:
app: nginx
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
name: nginx
image: nginx
ports:
containerPort: 80
volumeMounts:
name: nginx-config1
mountPath: /etc/nginx/conf.d/default.conf
subPath: default.conf
volumes:
name: nginx-config1
configMap:
name: nginx-configmap
在最近的k8s版本中Mounted ConfigMaps are Updated Automatically:
When a ConfigMap currently consumed in a volume is updated, projected keys are eventually updated as well. The kubelet checks whether the mounted ConfigMap is fresh on every periodic sync.
A container using a subPath volume mount may not receive the updates.
可能的解决方案:
使用两个容器:
- 主容器:将 运行 您的应用程序侦听特定的 port/endpoint_path HTTP 请求。收到请求后,您的应用程序应重新加载配置。由于避免了
subPath
方法,您可以将 configMap 存储到其他目录,稍后在重新加载配置时 move/update 到所需目录。
- SideCar:将 运行 文件更改观察器,如 configmap-reload,在文件更改时它会向主容器发送 HTTP 请求。
样本:
containers:
- name: main-container
image: application:v1.0.0
ports:
- name: http
containerPort: 80
protocol: TCP
volumeMounts:
- name: config-volume
mountPath: /some/path
- name: side-car
image: jimmidyson/configmap-reload:latest
args:
- "-volume-dir=/some/path"
- "-webhook-url=localhost:80/reload-config"
volumeMounts:
- name: config-volume
mountPath: /some/path
volumes:
- name: config-volume
configMap:
name: {{ .Values.metadata.name }}-config
我想在 helm 部署时更新容器中的现有文件 settings.ini
,而不损害容器中的现有数据。
这是我的 helm 文件 -
config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Values.metadata.name }}-config
data:
settings.ini: |
[server]
hostname = "localhost"
hot_deployment = false
# offset = 10
[user_store]
type = "read_only_ldap"
来自 Deployment.yaml
containers:
- name: {{ .Chart.Name }}
securityContext:
{{- toYaml .Values.securityContext | nindent 12 }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
ports:
- name: http
containerPort: 80
protocol: TCP
volumeMounts:
- name: config-volume
mountPath: /home/bin/conf/
subPath: settings.ini
volumes:
- name: config-volume
configMap:
name: {{ .Values.metadata.name }}-config
我可以看到它成功创建了配置映射,但是当我检查集群中的日志时,它抱怨缺少文件
我该如何解决这个问题?
如果我只是想在不同的环境中使用不同的值更新我的 settings.ini
文件的一些配置,还有什么有效的方法可以实现这一点?
如果您使用的是旧版本的 Kubernetes,更改 configmap 和密码不会重启您的容器。
您可以使用 YAML apply 或使用 CLI edit 手动更新 configmap。
更新 configmap 后,您可以简单地应用 helm 命令来推出更新和 change/udpate 新容器。在这种情况下,旧容器不会受到影响,并且只需推出更改即可。
如果您正在寻找自动化的方法,您可以使用:https://github.com/stakater/Reloader
Reloader 可以观察 ConfigMap 和 Secret 中的变化,并在 Pods 上对其相关的 DeploymentConfig、Deployments、Daemonsets Statefulsets 和 Rollouts 进行滚动升级。
这是一个很好的例子:https://github.com/stakater/Reloader/issues/46#issuecomment-457131306
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
annotations:
configmap.reloader.stakater.com/reload: "nginx-configmap"
spec:
selector:
matchLabels:
app: nginx
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
name: nginx
image: nginx
ports:
containerPort: 80
volumeMounts:
name: nginx-config1
mountPath: /etc/nginx/conf.d/default.conf
subPath: default.conf
volumes:
name: nginx-config1
configMap:
name: nginx-configmap
在最近的k8s版本中Mounted ConfigMaps are Updated Automatically:
When a ConfigMap currently consumed in a volume is updated, projected keys are eventually updated as well. The kubelet checks whether the mounted ConfigMap is fresh on every periodic sync.
A container using a subPath volume mount may not receive the updates.
可能的解决方案:
使用两个容器:
- 主容器:将 运行 您的应用程序侦听特定的 port/endpoint_path HTTP 请求。收到请求后,您的应用程序应重新加载配置。由于避免了
subPath
方法,您可以将 configMap 存储到其他目录,稍后在重新加载配置时 move/update 到所需目录。 - SideCar:将 运行 文件更改观察器,如 configmap-reload,在文件更改时它会向主容器发送 HTTP 请求。
样本:
containers:
- name: main-container
image: application:v1.0.0
ports:
- name: http
containerPort: 80
protocol: TCP
volumeMounts:
- name: config-volume
mountPath: /some/path
- name: side-car
image: jimmidyson/configmap-reload:latest
args:
- "-volume-dir=/some/path"
- "-webhook-url=localhost:80/reload-config"
volumeMounts:
- name: config-volume
mountPath: /some/path
volumes:
- name: config-volume
configMap:
name: {{ .Values.metadata.name }}-config