在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的位置和引用的位置
- 不能多加
$
- 还有,解析不正确的环境变量通常不会阻止容器启动
发表评论