在Pod里面配置容器启动的命令参数
1 ) 概述
- 创建 Pod 时,可以为其下的容器设置启动时要执行的命令及其参数
- 如果要设置命令,就填写在配置文件的 command 字段下
- 如果要设置命令的参数,就填写在配置文件的 args 字段下
- 一旦 Pod 创建完成,该命令及其参数就无法再进行更改了
- 如果在配置文件中设置了容器启动时要执行的命令及其参数
- 那么容器镜像中自带的命令与参数将会被覆盖而不再执行
- 如果配置文件中只是设置了参数,却没有设置其对应的命令
- 那么容器镜像中自带的命令会使用该新参数作为其执行时的参数
- 说明: 在有些容器运行时中,
command
字段对应entrypoint
2 )示例
2.1 基本配置
-
现在,创建一个只包含单个容器的 Pod
-
在 Pod 配置文件中设置了一个命令与两个参数
-
创建 args.yaml
apiVersion: v1 kind: Pod metadata: name: command-demo labels: purpose: demonstrate-command spec: containers: - name: command-demo-container image: nginx # 这里正常来说替换成 centos command: ["printenv"] args: ["HOSTNAME", "KUBERNETES_PORT"] restartPolicy: OnFailure
-
$
kubectl apply -f args.yaml
pod/args-demo created
-
$
kubectl get po | grep args
args-demo 0/1 Completed 0 34s
-
$
kubectl logs args-demo
args-demo tcp://10.1.0.1:443
-
以上是打印出来了几个环境变量
2.2 将环境变量作为命令参数
- 在上面的示例中,直接将一串字符作为命令的参数
- 除此之外,我们还可以将环境变量作为命令的参数
- 现在,我们想要自己定义一些环境变量,修改 yaml 文件
- 关键修改如下
spec: containers: - name: args-demo-container image: nginx # 这里正常来说替换成 centos env: - name: MSG value: 'hello world' resources: limits: memory: "64Mi" cpu: "200m" ports: - containerPort: 80 command: ["/bin/echo"] args: ["$(MSG)"] restartPolicy: OnFailure
- 重新 delete pod 后,重新 apply 之后查看日志
- $
kubectl logs args-demo
hello world
- 以上,可见输出了定义的环境变量
Pod容器间依赖的环境变量
- 当创建一个 Pod 时,可以为运行在 Pod 中的容器设置相互依赖的环境变量
- 设置相互依赖的环境变量,你就可以在配置清单文件的 env 的 value 中使用
$(VAR_NAME)
- 现在创建一个单容器的 Pod, 此 Pod 的配置文件定义了一个已定义常用用法的相互依赖的环境变量
- 创建 env-dep.yaml
apiVersion: v1 kind: Pod metadata: name: env-dep-demo labels: name: env-dep-demo spec: containers: - name: env-dep-demo image: busybox resources: limits: memory: "64Mi" cpu: "200m" command: - sh - -c args: - printf SERVICE_ADDRESS=$SERVICE_ADDRESS'\n'; printf ESCAPED_REFERENCE=$ESCAPED_REFERENCE'\n'; sleep 120 env: - name: SERVICE_IP value: "172.17.0.1" - name: SERVICE_PORT value: "80" - name: SERVICE_ADDRESS value: "$(PROTOCOL)://$(SERVICE_IP):$(SERVICE_PORT)" - name: PROTOCOL value: "https" - name: ESCAPED_REFERENCE value: "$(PROTOCOL)://$(SERVICE_IP):$(SERVICE_PORT)"
- 注意,上述配置中,args 中要加上 sleep, 否则就会退出
- $
kubectl apply -f env-dep.yaml
创建 pod
pod/env-dep-demo created
- $
kubectl get po | grep env
获取 pod 状态env-dep-demo 1/1 Running 0 21s
- $
kubectl logs env-dep-demo
查看 pod 日志SERVICE_ADDRESS=$(PROTOCOL)://172.17.0.1:80 ESCAPED_REFERENCE=https://172.17.0.1:80
- 以上可以看到,因为 PROTOCOL 的定义位置
- 导致了第一个没有正确打印出来,但是第二个正常
- 修改yaml文件的最后一行,这里多加了
$
, 也就是$$
- name: ESCAPED_REFERENCE value: "$$(PROTOCOL)://$(SERVICE_IP):$(SERVICE_PORT)"
- 重新 apply 等待运行后,执行 $
kubectl logs env-dep-demo
SERVICE_ADDRESS=$(PROTOCOL)://172.17.0.1:80 ESCAPED_REFERENCE=$(PROTOCOL)://172.17.0.1:80
- 可见,多加了一个
$
, 就无法正常显示了 - 总结,以下几点需要特别注意:
- 定义env的位置和引用的位置
- 不能多加
$
- 还有,解析不正确的环境变量通常不会阻止容器启动