环境变量
以环境变量的形式暴露元数据给Pod中的容器,与其他两种方式相比,其缺点主要体现在:仅可以暴露本Pod的元数据,并且可使用的元数据有限。
Pod在生成后,会有自己的定义(配置文件),这种方式就是通过从定义(配置文件)和状态中取得相关数据,并将其作为容器的环境变量,从而被容器中的应用读取和使用。
可用元数据
该方式下,可暴露的元数据如下:
本Pod的名称(
metadata.name
);本Pod的IP地址;(
status.podIP
)本Pod所在的命名空间(
metadata.namespace
);本Pod运行的Node的名称(
spec.nodeName
);本Pod运行所归属的ServiceAccount名称(
spec.serviceAccountName
);本Pod中每个容器的CPU和内存的请求量(
spec.containers.resources.requests.cpu
);本Pod中每个容器可使用的CPU和内存的上限(
spec.containers.resources.limits.cpu
);
注意,由于Pod中不同的容器具有不同的资源量,因此在配置文件中可以通过指定容器名的方式(spec.containers.env.valueFrom.resourceFieldRef.containerName
),将本容器或其他容器的资源请求量和使用上限元数据传入本容器中。
使用案例
由于是将元数据以环境变量的方式传递至容器中,因此需要对pod.spec.containers.env.valueFrom
进行配置。
在上面介绍可用元数据时,已经提到,针对非资源相关的元数据是在pod.spec.containers.env.valueFrom.fieldRef
中指定的,而针对资源相关的元数据则是在pod.spec.containers.env.valueFrom.resourceFieldRef
中指定的。
并且在上面也介绍了各元数据所对应的Pod的配置文件中的字段。
这里展示一个案例,创建一个仅包含一个容器的Pod,并且将该方式支持的所有元数据都传入容器中:
apiVersion: v1
kind: Pod
metadata:
name: downward
spec:
containers:
- name: main
image: busybox
command: ["sleep", "9999999"]
resources: # 容器资源相关配置
requests: # 资源请求量
cpu: 1m
memory: 100Ki
limits: # 资源使用上限
cpu: 2m
memory: 100Mi
env: # 配置环境变量
- name: POD_NAME # 元数据:本Pod的名称
valueFrom: # 以环境变量的方式,将元数据传入容器
fieldRef: # 非资源相关元数据,使用fieldRef
fieldPath: metadata.name # Pod配置文件中的字段
- name: POD_NAMESPACE # 元数据:本Pod所在命名空间名称
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: POD_IP # 元数据:本Pod的IP地址
valueFrom:
fieldRef:
fieldPath: status.podIP
- name: NODE_NAME # 元数据:本Pod所在Node名称
valueFrom:
fieldRef:
fieldPath: spec.nodeName
- name: SERVICE_ACCOUNT # 元数据:本Pod运行所归属的ServiceAccount名称
valueFrom:
fieldRef:
fieldPath: spec.serviceAccountName
- name: CONTAINER_CPU_REQUEST_MILLICORES # 元数据:本Pod中名为main的容器的CPU请求量
valueFrom:
resourceFieldRef: # 资源相关元数据,使用resourceFieldRef
# containerName: main # 由于env是容器级别字段,因此这里若不指定,即指本容器
resource: requests.cpu # Pod配置文件中pod.spec.containers.resources中的字段
divisor: 1m # 基数,例如本容器requests.cpu=1m,因此这里显示为1(1m/1m=1)
- name: CONTAINER_MEMORY_REQUEST_KIBIBYTES # 元数据:本Pod中名为main的容器的内存请求量
valueFrom:
resourceFieldRef:
# containerName: main
resource: requests.memory
divisor: 1Ki
- name: CONTAINER_CPU_LIMIT_MILLICORES # 元数据:本Pod中名为main的容器的可使用CPU上限
valueFrom:
resourceFieldRef:
# containerName: main
resource: limits.cpu
divisor: 1m
- name: CONTAINER_MEMORY_LIMIT_KIBIBYTES # 元数据:本Pod中名为main的容器的可使用内存上限
valueFrom:
resourceFieldRef:
# containerName: main
resource: limits.memory
divisor: 1Ki
Last updated
Was this helpful?