作为环境变量

实验基础:存在以下两个ConfigMap:cm-literal和cm-mul-env
$ kubectl get cm cm-literal -o yaml
apiVersion: v1
data:
  special.how: very
  special.type: charm
kind: ConfigMap
metadata:
  creationTimestamp: "2023-11-29T07:05:33Z"
  name: cm-literal
  namespace: default
  resourceVersion: "154501"
  uid: adbcdc21-28f1-4820-bdb6-82e561b02aa8
  
$ kubectl get cm cm-mul-env -o yaml
apiVersion: v1
data:
  allow.textmode: "true"
  color.bad: yellow
  color.good: purple
  enemies: aliens
  enemies.cheat: "true"
  enemies.cheat.level: noGoodRotten
  how.nice.to.look: fairlyNice
  lives: "3"
  secret.code.allowed: "true"
  secret.code.lives: "30"
  secret.code.passphrase: UUDDLRLRBABAS
kind: ConfigMap
metadata:
  creationTimestamp: "2023-11-29T07:03:50Z"
  name: cm-mul-env
  namespace: default
  resourceVersion: "154285"
  uid: 815a2cf7-c8e9-4b76-b3aa-cfd71db6d0eb

将ConfigMap中的数据用作Pod的变量有两种方式:

  • .containers.env.valueFrom

  • .containers.envFrom

使用valueFrom定义容器环境变量

deploy-valueFrom.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.25.3
        env:
          - name: TZ
            value: Asia/Shanghai
          - name: LANG
            value: C.UTF-8
          - name: ENEMIES
            valueFrom:
              configMapKeyRef:
                key: enemies      # ConfigMap 内容的键
                name: cm-mul-env  # ConfigMap 名称
          - name: SPECIAL_LEVEL_KEY
            valueFrom:
              configMapKeyRef:
                key: special.how  # ConfigMap 内容的键
                name: cm-literal  # ConfigMap 名称
        resources:
          limits:
            memory: "128Mi"
            cpu: "500m"
        ports:
        - containerPort: 80
$ kubectl create -f deploy-valueFrom.yaml 
deployment.apps/nginx-valuefrom created

$ kubectl get pod -l app=nginx
NAME                               READY   STATUS    RESTARTS   AGE
nginx-valuefrom-5889856f49-tcxmv   1/1     Running   0          55s

$ kubectl exec -it nginx-valuefrom-5889856f49-tcxmv -- env | grep SPECIAL_LEVEL_KEY
SPECIAL_LEVEL_KEY=very

$ kubectl exec -it nginx-valuefrom-5889856f49-tcxmv -- env | grep ENEMIES
ENEMIES=aliens

使用envFrom定义容器的环境变量

valueFrom通常用于使用ConfigMap的单个Key设置环境变量,但实际使用时更常用的是把ConfigMap里面所有的数据都作为环境变量,此时可以使用envFrom参数:

deploy-envFrom.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-envfrom
spec:
  selector:
    matchLabels:
      app: nginx
      func: envfrom
  template:
    metadata:
      labels:
        app: nginx
        func: envfrom
    spec:
      containers:
      - name: nginx
        image: nginx:1.25.3
        env:
        - name: TZ
          value: Asia/Shanghai
        - name: LANG
          value: C.UTF-8
        - name: ENEMIES
          valueFrom:
            configMapKeyRef:
              key: enemies      # ConfigMap 内容的键
              name: cm-mul-env  # ConfigMap 名称
        - name: SPECIAL_LEVEL_KEY
          valueFrom:
            configMapKeyRef:
              key: special.how  # ConfigMap 内容的键
              name: cm-literal  # ConfigMap 名称
        envFrom:
        - configMapRef:
            name: cm-literal
          prefix: fromCm_
        resources:
          limits:
            memory: "128Mi"
            cpu: "500m"
        ports:
        - containerPort: 80
$ kubectl create -f deploy-envFrom.yaml 
deployment.apps/nginx-envfrom created

$ kubectl get pod -l func=envfrom
NAME                             READY   STATUS    RESTARTS   AGE
nginx-envfrom-6dd6b779d8-4nlh8   1/1     Running   0          12s

$ kubectl exec -it nginx-envfrom-6dd6b779d8-4nlh8 -- env | grep fromCm_
fromCm_special.type=charm
fromCm_special.how=very

$ kubectl exec -it nginx-envfrom-6dd6b779d8-4nlh8 -- env | grep ENEMIES
ENEMIES=aliens

注意:

  • 使用envFrom时,环境变量的名字是ConfigMap中数据的key值

  • prefix参数是将ConfigMap中的key添加一个前缀,比如key名是self-key,加了prefix就是fromCm_self-key,prefix为可选参数。

最后更新于