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

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐