k8s容器配置环境变量
为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
项。
接下来我们使用环境变量创建的密码可以连接数据库看下:
捐赠本站(Donate)
如您感觉文章有用,可扫码捐赠本站!(If the article useful, you can scan the QR code to donate))
- Author: shisekong
- Link: https://blog.361way.com/k8s-pod-set-env/6778.html
- License: This work is under a 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. Kindly fulfill the requirements of the aforementioned License when adapting or creating a derivative of this work.