← Back to blog

16.【云原生-K8S】 往容器中注入数据

K8S容器云原生

16.【云原生-K8S】: 往容器中注入数据

Downward API

在实际应用中,很多程序都需要拥有K8S的相关信息,比如运行在哪个Pod、哪个Cluster、哪个Namespace下,而为了避免容器或容器内部的应用程序和K8S过度耦合,引入了Downward API这种方式,将Pod和容器字段暴露给运行中的容器。

Downward API又分为两种具体的方法

  • 作为环境变量
  • 作为downward api卷中的文件

fieldRef与resourceFieldRef

这两个字段给了我们动态向容器运行时传递Pod和容器级别字段的能力。

可通过**fieldRef**获取的字段

  • metadata.name Pod名称
  • metadata.namespace Pod命名空间
  • metadata.uid Pod的UID
  • metadata.annotations['Key'] Pod的某个注释
  • metadata.lables['Key'] Pod的某个label
  • spec.serviceAccountName Pod的服务账号名称
  • spec.nodeName Pod所在节点的名称
  • status.hostIP Pod所在节点的IP地址
  • status.podIP Pod的IP地址

可通过**resourceFieldRef**获取的字段,这些都是容器的资源**Request和limit值**

  • limits.cpu
  • requests.cpu
  • limits.memory
  • requests.memory
  • limits.hugepages
  • requests.hugepages
  • limits.ephemeral-storage
  • requests.ephemeral-storage

具体的详情字段可以在Downward API这里获取。

环境变量

[code] apiVersion: v1 kind: Pod metadata: name: test-env-pod spec: containers: - name: test-env-container image: alpine:latest command: [‘/bin/sh’, ‘-c’] args: - while true; do echo env; env; done; resources: requests: memory: “320Mi” cpu: “125m” limits: memory: “640Mi” cpu: “250m” env: - name: MY_TEST value: ‘1’ - name: ANOTHER_TEST value: ‘2’ - name: NODE_NAME valueFrom: fieldRef: fieldPath: spec.nodeName - name: MY_POD_NAME valueFrom: fieldRef: fieldPath: metadata.name - name: MY_POD_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace - name: MY_CPU_REQUEST valueFrom: resourceFieldRef: containerName: test-env-container resource: requests.cpu - name: MY_CPU_LIMIT valueFrom: resourceFieldRef: containerName: test-env-container resource: limits.cpu [/code]

上面的Pod里的容器配置了Entrypoint,作用是每十秒钟打印一次容器内部的环境变量,之后配置了一些环境变量,分为三种

  • 手动添加的环境变量MY_TESTANOTHER_TEST
  • 读取的Pod级别的环境变量,比如NODE_NAMEPOD_NAME
  • 读取的容器级别的环境变量,容器的两个资源字段

能看到这里已经打印出了所有设置的环境变量,这里因为resource字段是向上取整的,所以打印出来的limit和request都是1

[code] apiVersion: v1 kind: Pod metadata: name: test-downward-volume-pod labels: zone: shenzhen cluster: test-cluster1 rack: rack-22 annotations: build: anne builder: annesheartrecord spec: containers: - name: test-container image: alpine:latest command: [“sh”, “-c”] args: - while true; do env; sleep 5; done; volumeMounts: - name: podinfo mountPath: /etc/podinfo volumes: - name: podinfo downwardAPI: items: - path: “labels” fieldRef: fieldPath: metadata.labels - path: “annotations” fieldRef: fieldPath: metadata.annotations

[/code]

上面的Pod设置了metadata的annotations和labels,以便于验证挂载downward volume是否生效,具体的entrypoint的内容和上一个pod类似,也是开启一个循环不断打印容器内部环境变量的值

结语

这篇博客主要介绍了临时容器和Pod调试 相关操作。《每天十分钟,轻松入门K8S》的第16篇16.【云原生-K8S】: 往容器中注入数据 到这里就结束了,感兴趣的朋友欢迎点赞、评论、收藏、订阅,您的支持就是我最大的动力。

推荐阅读

08.源码级别Pod详解(四): Pod readiness与Container Probe

06.源码级别Pod详解(三):Container 生命周期

05.源码级别Pod详解(二):Pod生命周期

02.K8S架构详解