为k8s容器配置环境变量,在官方文档中有相关说明。本篇就是基于原内容的理解再加工。这里使用华为CCE集群我已准备好了k8s环境。

一、为容器设置一个环境变量

创建 Pod 时,可以为其下的容器设置环境变量。通过配置文件的 env 或者 envFrom 字段来设置环境变量。

基于以下yaml文件可以创建一个pod

 1apiVersion: v1
 2kind: Pod
 3metadata:
 4  name: envar-demo
 5  labels:
 6    purpose: demonstrate-envars
 7spec:
 8  containers:
 9  - name: envar-demo-container
10    image: gcr.io/google-samples/node-hello:1.0
11    env:
12    - name: DEMO_GREETING
13      value: "Hello from the environment"
14    - name: DEMO_FAREWELL
15      value: "Such a sweet sorrow"

也可以使用kubectl apply -f https://k8s.io/examples/pods/inject/envars.yaml命令直接创建。
pod创建完成后,可以通过printenv命令打印输出:

 1[root@testcce-38939 ~]# kubectl exec envar-demo -- printenv
 2PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
 3HOSTNAME=envar-demo
 4DEMO_GREETING=Hello from the environment
 5DEMO_FAREWELL=Such a sweet sorrow
 6KUBERNETES_SERVICE_PORT_HTTPS=443
 7KUBERNETES_PORT=tcp://10.247.0.1:443
 8KUBERNETES_PORT_443_TCP=tcp://10.247.0.1:443
 9KUBERNETES_PORT_443_TCP_PROTO=tcp
10KUBERNETES_PORT_443_TCP_PORT=443
11KUBERNETES_PORT_443_TCP_ADDR=10.247.0.1
12KUBERNETES_SERVICE_HOST=10.247.0.1
13KUBERNETES_SERVICE_PORT=443
14PAAS_POD_ID=460dedcc-d764-4042-afae-75f50df5cce4
15NPM_CONFIG_LOGLEVEL=info
16NODE_VERSION=4.4.2
17HOME=/root

注:如果Dockerfile中配置的变量和k8s yaml文件中指定的变量重叠,并且赋值不同,通过Dockerfile的 env 或 envFrom 字段设置的环境变量将覆盖容器镜像中指定的所有环境变量。

二、环境变量的使用

环境变量的配置是为了使用,不然配置也没有用,其主要用于pod启动时的传参。比如开发环境、生产环境传入的参数就是不一样的,对应pod启动时,内部执行的脚本动作也有区别。这里来两个比较容易理解的示例。

示例1:echo输出

 1apiVersion: v1
 2kind: Pod
 3metadata:
 4  name: print-greeting
 5spec:
 6  containers:
 7  - name: env-print-demo
 8    image: bash
 9    env:
10    - name: GREETING
11      value: "Warm greetings to"
12    - name: HONORIFIC
13      value: "The Most Honorable"
14    - name: NAME
15      value: "Kubernetes"
16    command: ["echo"]
17    args: ["$(GREETING) $(HONORIFIC) $(NAME)"]

以上这个pod执行后,会执行命令echo Warm greetings to The Most Honorable Kubernetes

示例2:mysql服务密码设置

这个不是官方文档示例,这个是在CCE k8s集群上创建mariadb应用的StatefulSet有状态应用的示例。这里重点关注下env部分,通过env部分,我们传了一个变量MARIADB_ROOT_PASSWORD,也就是数据库的root密码。

 1[root@testcce-38939 ~]# kubectl apply -f mysql-statefulset.yaml
 2statefulset.apps/mariadb created
 3[root@testcce-38939 ~]# cat mysql-statefulset.yaml
 4apiVersion: v1
 5items:
 6- apiVersion: apps/v1
 7  kind: StatefulSet
 8  metadata:
 9    annotations:
10      description: ""
11    generation: 1
12    labels:
13      appgroup: ""
14      version: v1
15    name: mariadb
16    namespace: default
17  spec:
18    podManagementPolicy: OrderedReady
19    replicas: 1
20    revisionHistoryLimit: 10
21    selector:
22      matchLabels:
23        app: mariadb
24        version: v1
25    serviceName: mariadb-headless
26    template:
27      metadata:
28        labels:
29          app: mariadb
30          version: v1
31      spec:
32        affinity: {}
33        containers:
34        - env:
35          - name: MARIADB_ROOT_PASSWORD
36            value: test@123
37          image: mariadb:latest
38          imagePullPolicy: Always
39          name: container-0
40          resources:
41            limits:
42              cpu: "2"
43              memory: 2Gi
44            requests:
45              cpu: 250m
46              memory: 512Mi
47          terminationMessagePath: /dev/termination-log
48          terminationMessagePolicy: File
49          volumeMounts:
50          - mountPath: /var/lib/mysql
51            name: pvc-mariadb-storage
52        dnsConfig:
53          options:
54          - name: timeout
55            value: ""
56          - name: ndots
57            value: "5"
58          - name: single-request-reopen
59        dnsPolicy: ClusterFirst
60        imagePullSecrets:
61        - name: default-secret
62        - name: default-secret
63        restartPolicy: Always
64        schedulerName: default-scheduler
65        securityContext: {}
66        terminationGracePeriodSeconds: 30
67        tolerations:
68        - effect: NoExecute
69          key: node.kubernetes.io/not-ready
70          operator: Exists
71          tolerationSeconds: 300
72        - effect: NoExecute
73          key: node.kubernetes.io/unreachable
74          operator: Exists
75          tolerationSeconds: 300
76    updateStrategy:
77      type: RollingUpdate
78    volumeClaimTemplates:
79    - apiVersion: v1
80      kind: PersistentVolumeClaim
81      metadata:
82        annotations:
83          everest.io/disk-volume-type: SAS
84        creationTimestamp: null
85        name: pvc-mariadb-storage
86        namespace: default
87      spec:
88        accessModes:
89        - ReadWriteOnce
90        resources:
91          requests:
92            storage: 10Gi
93        storageClassName: csi-disk
94        volumeMode: Filesystem
95kind: List

注:
1. 这里的设置比较多,因为涉及到数据持久化保存的问题,这里配置了PVC和PV,如果仅出于测试目的,这里部分可以省略。
2. everest.io/disk-volume-type 这个类型是华为云CCE里特有的,每家云厂商对存储部分的接口是不相同的,在不同的云厂商上要根据云厂商公布的存储接口情况进行修改该项和 storageClassName 项。

接下来我们使用环境变量创建的密码可以连接数据库看下:

k8s-env-mysql-password
k8s-env-mysql-password