kubernetes部署。如何更改容器环境变量以进行滚动更新?

yog*_*ogs 2 deployment docker kubernetes google-kubernetes-engine

以下是我在Google上使用Kunbernetes的方式。

我有一个节点应用程序,比如Book-portal

节点应用正在使用环境变量进行配置

步骤1:我创建了docker文件并推送

gcr.io/<project-id>/book-portal:v1
Run Code Online (Sandbox Code Playgroud)

步骤2:使用以下命令进行部署

kubectl run book-portal --image=gcr.io/<project-id>/book-portal:v1 --port=5555 --env ENV_VAR_KEY1=value1 --env ENV_VAR_KEY2=value2 --env ENV_VAR_KEY3=value3
Run Code Online (Sandbox Code Playgroud)

第三步:

kubectl expose deployment book-portal --type="LoadBalancer"
Run Code Online (Sandbox Code Playgroud)

步骤4:通过以下方式获取公共IP

kubectl get services book-portal
Run Code Online (Sandbox Code Playgroud)

现在假设我在下一版本中添加了新功能和新配置。

因此要推出新版本v2

步骤1:我创建了docker文件并推送

gcr.io/<project-id>/book-portal:v2
Run Code Online (Sandbox Code Playgroud)

步骤2:编辑部署

kubectl edit deployment book-portal

---------------yaml---------------
...
    spec:
      replicas: 1
      selector:
        matchLabels:
          run: book-portal
      strategy:
        rollingUpdate:
          maxSurge: 1
          maxUnavailable: 1
        type: RollingUpdate
      template:
        metadata:
          creationTimestamp: null
          labels:
            run: book-portal
        spec:
          containers:
          - env:
            - name: ENV_VAR_KEY1
              value: value1
            - name: ENV_VAR_KEY2
              value: value2
            - name: ENV_VAR_KEY3
              value: value3
            image: gcr.io/<project-id>/book-portal:v1
            imagePullPolicy: IfNotPresent
            name: book-portal
...
----------------------------------
Run Code Online (Sandbox Code Playgroud)

我能够成功进行更改

image:gcr.io/<project-id>/book-portal:v1 
Run Code Online (Sandbox Code Playgroud)

image:gcr.io/<project-id>/book-portal:v2 
Run Code Online (Sandbox Code Playgroud)

但是我不能添加/更改环境变量

          - env:
            - name: ENV_VAR_KEY1
              value: value1
            - name: ENV_VAR_KEY2
              value: value2
            - name: ENV_VAR_KEY3
              value: value3
            - name: ENV_VAR_KEY4
              value: value4
Run Code Online (Sandbox Code Playgroud)
  1. 谁能指导最佳实践在kubernetes上的节点应用中传递配置?
  2. 在滚动更新期间应如何处理环境变量更改?

Chr*_*zie 5

我认为最好的选择是在k8s中使用configmap,然后更改您的pod模板以从configmap中获取env变量值,请参阅在pod中使用ConfigMap。

编辑:我很抱歉我在这里输入了错误的链接。我已经更新,但是对于TL; DR,您可以执行以下操作。

apiVersion: v1
kind: ConfigMap
metadata:
 name: special-config
namespace: default
data:
 special.how: very
 special.type: charm
Run Code Online (Sandbox Code Playgroud)

然后pod的使用情况可能会如下所示。

apiVersion: v1
kind: Pod
metadata:
 name: dapi-test-pod
spec:
  containers:
  - name: test-container
    image: gcr.io/google_containers/busybox
    command: [ "/bin/sh", "-c", "env" ]
    env:
      - name: SPECIAL_LEVEL_KEY
        valueFrom:
          configMapKeyRef:
            name: special-config
            key: special.how
      - name: SPECIAL_TYPE_KEY
        valueFrom:
          configMapKeyRef:
            name: special-config
            key: special.type
  restartPolicy: Never
Run Code Online (Sandbox Code Playgroud)

  • 抱歉,我在此处输入了错误的文档链接,我已对其进行了更新,并在此复制了示例,以供后代参考 (2认同)