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

232 阅读3分钟

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这里获取。

环境变量

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

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

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

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

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

上面的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架构详解