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