23. Kubernetes深入Pod-Pod命令及变量

释放双眼,带上耳机,听听看~!

command命令

创建Pod资源时,可以在容器中自定义要运行的命令以及选项和参数。
在容器的配置上下文中,使用command字段指定要运行的程序,而args字段则可用于指定传递给程序的选项和参数。在配置文件中定义command和args会覆盖镜像文件中相关的默认设定,这类程序会被直接运行,而不会由shell解释器解释运行,因此与sehll相关的特性均不被支持,如命令行展开符号 {}、重定向等操作。

下面是定义在 command-demo.yaml 文件中的Pod资源示例,它在容器 command-demo-container中将busybox镜像文件中默认运行的命令 ["/bin/sh", "-c"]修改为["httpd"],并为其额外传递了["-f"]选项。

cat command-demo.yaml
apiVersion: v1
kind: Pod
metadata:
  name: command-demo
  labels:
    purpose: demonstrate-commdn
spec:
  containers:
  - name: command-demo-container
    image: busybox
    command: ["httpd"]
    args: ["-f"]
    ports:
    - containerPort: 80

资源清单编辑之后创建Pod对象,然后查看容器所运行的程序,结果如下父进程为 httpd -f

kubectl exec -it pods/command-demo -- ps aux
PID   USER     TIME  COMMAND
    1 root      0:00 httpd -f
   22 root      0:00 ps aux

事实上,我们也可以只在容器配置的上下文提供 args 字段,以实现向默认运行的程序提供额外的参数,如果默认的命令为Shell解析器或 entrypoint 启动脚本,那么这些参数本身甚至还可以是要运行的命令及其参数,例如,下面的容器配置,表示要运行的程序为/bin/sh -c httpd -f,实现了shell解释器解释运行执行的程序之目的。

cat command-demo.yaml
apiVersion: v1
kind: Pod
metadata:
  name: command-demo
  labels:
    purpose: demonstrate-commdn
spec:
  containers:
  - name: command-demo-container
    image: busybox
    args: ["httpd","-f"]
    ports:
    - containerPort: 80

创建Pod对象,并查看容器的父进程

kubectl exec -it pods/command-demo -- ps aux
PID   USER     TIME  COMMAND
    1 root      0:00 httpd -f
    8 root      0:00 ps aux

由上述的示例可见,Kubernetes配置文件中的command对应于Dockerfile中的ENTRYPOINT,而配置文件的args则对应于Dockerfile中的CMD。在Kubernetes中只给出command字段时,他会覆盖Dockerfile中的ENTRYPOINT和CMD,只给出args字段时,它仅覆盖CMD,而同时给出command和args时,它会对应覆盖ENTRYPOINT和CMD。

ENV变量

在Kubernetes中使用镜像启动容器时,可以在Pod资源或Pod模版资源为容器配置使用env参数来定义所使用的环境变量列表,即便容器中的应用本身不处于环境变量,也一样可以向容器传递环境变量,只不过它不被使用罢了。

环境变量配置容器化应用时,需要在容器配置段中嵌套使用env字段,它的值是一个由环境变量构建的列表。环境变量由name和value(或valueFrom)字段构成。

  • name<string>:环境变量的名称,必须字段。
  • value<string>:环境变量的值,通过 ${VAR_NAME} 引用,默认值为空。
  • valueFrom<Object>:环境变量值的引用源,例如,当前Pod资源的名称、名称空间、标签等,不能与非空值的value字段同时使用,即环境变量的值要么源于value字段,要么源于valueFrom字段,二者不可同时提供数据。valueFrom字段可引用的值有多种来源,包括当前Pod资源的属性值,容器相关的系统资源配置、ConfigMap对象中的Key以及Secret对象中的Key,它们应分别使用不同的嵌套字段进行定义。
  • fieldRef<Object>:当前Pod资源的指定字段,目前支持使用的字段包括 metadata.name、metadata.namespace、metadata.labels、metadata.annotations、spec.nodeName、spec.serviceAccountName、status.hostIP和status.podIP。
  • configMapKeyRef<Object>:ConfigMap对象中的特定Key。
  • secretKeyRef<Object>:Secret对象中的特定Key。
  • resourceFieldRef<Object>:当前容器的特定系统资源的最小值(配额)或最大值(限额),目前支持的引用包括limits.cpu、limts.ephemeral-storage、requests、cpu、requests.memory、requests.ephemeral-storage。

下面是定义在配置文件 env-demo.yaml 中的Pod资源,其通过环境变量引用当前Pod资源及其所在节点的相关属性值配置容器,fieldRef字段的值是一个对象,它一般由apiVersion(创建当前Pod资源的API版本)或fidldPath嵌套字段所定义:

cat env-demo.yaml
apiVersion: v1
kind: Pod
metadata:
  name: env-demo
  labels:
    purpose: demonstrate-environment-variables
spec:
  containers:
  - name: env-demo-container
    image: busybox
    command: [ "httpd" ]
    args: [ "-f" ]
    env:
    - name: HELLO_WORLD
      value: just a demo
    - name: MY_NODE_NAME
      valueFrom:
        fieldRef:
          fieldPath: spec.nodeName
    - name: MY_NODE_IP
      valueFrom:
        fieldRef:
          fieldPath: status.hostIP
    - name: MY_POD_NAMESPACE
      valueFrom:
        fieldRef:
          fieldPath: metadata.namespace
  restartPolicy: OnFailure

创建Pod对象

kubectl apply -f env-demo.yaml

然后打印它的环境变量列表

kubectl exec -it pods/env-demo -- printenv
HELLO_WORLD=just a demo                         #在清单中定义的HELLO_WORLD变量与值
MY_NODE_NAME=k8s-node03                         #在清单中定义的MY_NODE_NAME变量与从spec.nodeName获取到的值
MY_NODE_IP=192.168.31.233                         #在清单中定义的MY_NODE_IP变量与从status.hostIP获取的值
MY_POD_NAMESPACE=default                           #在清单中定义的MY_POD_NAMESPACE变量与从metadata.namespec获取到的值

容器的启动脚本或应用程序调用或处理这些环境变量、即可实现容器化应用的配置。相较于命令行参数的方式来说,使用环境变量的配置方式更清晰、易懂,尤其是对于首次使用相关容器的用户来说,这种方式能够快速了解容器的配置方式,不过这两种配置方式有一个共同缺陷:无法在容器应用运行过程中更新环境变量从而达到更新应用目的。这通常意味着用户不得不为production、development和qa等不同的环境分别配置Pod资源。好在,用户还有ConfigMap资源可用。

Ops工具

22. Kubernetes深入Pod-Pod镜像拉取策略

2020-6-16 11:42:06

Ops工具

24. Kubernetes深入Pod-Pod资源限制

2020-6-16 11:43:08

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索