当前位置: 代码网 > it编程>游戏开发>ar > K8s: 在Pod里面配置容器启动的命令参数及容器间依赖的环境变量

K8s: 在Pod里面配置容器启动的命令参数及容器间依赖的环境变量

2024年08月06日 ar 我要评论
在 Pod 配置文件中设置了一个命令与两个参数。现在,创建一个只包含单个容器的 Pod。2.2 将环境变量作为命令参数。以上是打印出来了几个环境变量。创建 args.yaml。

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

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com