环境变量是用来做容器配置的非常重要的环节,容器制作时,如果配置文件已经被固定,这就意味着容器只能适用于一种环境。所以在容器制作过程中如果需要向容器内部传送环境变量来改变配置,则需要使用卷挂载或使用enterypoint脚本来实现。否则k8s向容器中传递的变量除了能出现在容器内的printenv中之外,其他将毫无意义。

以下以ikubernetes/demoapp:v1.0镜像为例,此境支持HOSTPORT变量的接收。

变量传递HOST

1.创建资源清单。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
root@k8s-master01:~/yaml/chapter01# vim mypod-with-env-var.yaml
apiVersion: v1
kind: Pod
metadata:
name: mypod-with-env-var
labels:
app: mypod
release: canary
spec:
containers:
- name: demoapp
image: ikubernetes/demoapp:v1.0
env:
- name: HOST
value: "127.0.0.1"

2.引用资源清单

1
2
root@k8s-master01:~/yaml/chapter01# kubectl apply -f mypod-with-env-var.yaml
pod/mypod-with-env-var created

3.验证

1
2
3
4
root@k8s-master01:~/yaml/chapter01# kubectl exec mypod-with-env-var -- ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 127.0.0.1:80 0.0.0.0:*
# 容器已经监听在回环地址上

变量传递HOST,PORT

1.修改资源清单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
root@k8s-master01:~/yaml/chapter01# vim mypod-with-env-var.yaml
apiVersion: v1
kind: Pod
metadata:
name: mypod-with-env-var
labels:
app: mypod
release: canary
spec:
containers:
- name: demoapp
image: ikubernetes/demoapp:v1.0
env:
- name: HOST
value: "127.0.0.1"
- name: PORT
value: "8080"

2.应用资源清单

1
2
root@k8s-master01:~/yaml/chapter01# kubectl apply -f mypod-with-env-var.yaml
pod/mypod-with-env-var created

3.验证

1
2
3
root@k8s-master01:~/yaml/chapter01# kubectl exec mypod-with-env-var -- ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 127.0.0.1:8080 0.0.0.0:*

注意事项

  1. 向容器内传递的变量,容器内必须存在,否则将没有意义
  2. ENV是容器级别的字段,只在容器内部生效,一个pod内可以存在多个容器