k8s Environment

可以向docker容器里面传入环境变量,例如:

docker run -e APP_COLOR=red my-color-app

k8s也一样:

创建 Pod 时,可以为 Pod 中运行的容器设置环境变量。要设置环境变量,请在配置文件中包含“env”或“envFrom”字段。

向pod里面传入环境变量一般有三种方式——Plain Key Value, ConfigMap, Secrets:

image-20200316185132591

Plain Text Value

创建一个pod,yaml文件里定义了env:

apiVersion: v1
kind: Pod
metadata:
  name: env-demo
spec:
  containers:
  - name: nginx
    image: nginx
    env:
    - name: USERINFO
      value: "kongpingfan"
    - name: GREETING
      value: "HELLO my friend"

进入pod进行验证:

image-20200316190712074

参考: https://kubernetes.io/docs/tasks/inject-data-application/define-environment-variable-container/

ConfigMap

上节介绍了将env直接写到yaml文件中。

当有许多的yaml文件,他们都有一套环境变量时,管理起来就非常麻烦。

例如有dev环境和prod环境,里面维护了不同的变量:

Dev env: app.env=dev app.mem=2048m app.properties=dev.env.url

Prod env: app.env=prod app.mem=8096m app.properties=prod.env.url

可以将这些环境变量提取出来,放到ConfigMap里面统一管理。类比于aws的parameter store,一模一样的作用。

使用ConfigMap非常简单:先创建、再映射到Pod里。

创建ConfigMap

和其他对象一样,ConfigMap也有两种创建方式:使用命令行和使用yaml文件。

命令行:kubectl create configmap [NAME] [DATA-SOURCE]

  • File
  • directory
  • Literal value

from-literal

[root:etc]$ kubectl create configmap dev-config --from-literal=app.mem=2048m
configmap/dev-config created

查看创建的configmap:

[root:etc]$ kubectl get configmap dev-config -o yaml
apiVersion: v1
data:
  app.mem: 2048m
kind: ConfigMap
metadata:
  creationTimestamp: "2020-01-26T04:26:10Z"
  name: dev-config
  namespace: default
  resourceVersion: "20135077"
  selfLink: /api/v1/namespaces/default/configmaps/dev-config
  uid: fa982d7b-3ff3-11ea-8d48-06a014a4eb80

from file

创建一个文件dev-config,里面内容:

app.env=dev
app.mem=2048m
app.properties=dev.env.url
[root:pod]$ kubectl create configmap dev-env --from-file=dev-config 
configmap/dev-env created

[root:pod]$ kubectl get configmap dev-env -o yaml
apiVersion: v1
data:
  dev-config: |-
    app.env=dev
    app.mem=2048m
    app.properties=dev.env.url
kind: ConfigMap
metadata:
  creationTimestamp: "2020-01-26T04:31:43Z"
  name: dev-env
  namespace: default
  resourceVersion: "20135689"
  selfLink: /api/v1/namespaces/default/configmaps/dev-env
  uid: c17275e3-3ff4-11ea-8103-02c2b593c912

pod使用configmap

pod使用ConfigMap有两种方式:一种是映射到环境变量里,另一种将配置映射到pod某个目录下。

映射到环境变量

apiVersion: v1
kind: Pod
metadata:
  name: configmap-pod
spec:
  containers:
  - name: nginx
    image: nginx
    envFrom: 
      - configMapRef:
            name: app-configmap

创建pod后,可以进入pod查看环境变量:

image-20200316203440074

以文件形式映射到pod目录

apiVersion: v1
kind: Pod
metadata:
  name: configmap-pod
spec:
  containers: 
    - name: test-container
      image: nginx
      volumeMounts:
      - name: config-volume
        mountPath: /etc/config
  volumes:
    - name: config-volume
      configMap:
        name: dev-env

进入pod查看挂载的文件:

[@root:pod]$ kubectl apply -f configmap-pod.yaml 
pod/configmap-pod created

[@root:pod]$ kubectl exec -it configmap-pod bash
root@configmap-pod:/# cd /etc/config
root@configmap-pod:/etc/config# ls
dev-config
root@configmap-pod:/etc/config# cat dev-config 
app.env=dev
app.mem=2048m
app.properties=dev.env.url