IT 铁人赛 k8s 入门30天 -- day24 k8s Expose Pod Information to Containers by Environment Variables

前言

参考文件 https://kubernetes.io/docs/tasks/inject-data-application/environment-variable-expose-pod-information/

今天要来实作 Expose Pod Information to Containers Through Environment Variables 这个任务

k8s 可以透过两种方式来把 Pod 与 Container 的设定值传入执行中的 Container:

  1. Environment variables
  2. Volume Files

这两个种方式统称做 Downward API

布署目标

1 透过 Environment variables 传入 Pod 的设定值

2 透过 Environment variables 传入 Container 的设定值

透过 Environment variables 传入 Pod 的设定值

建立 dapi-envars-pod.yaml 如下:

apiVersion: v1
kind: Pod
metadata:
  name: dapi-envars-fieldref
spec:
  containers:
    - name: test-container
      image: k8s.gcr.io/busybox
      command: [ "sh", "-c"]
      args:
      - while true; do
          echo -en '\n';
          printenv MY_NODE_NAME MY_POD_NAME MY_POD_NAMESPACE;
          printenv MY_POD_IP MY_POD_SERVICE_ACCOUNT;
          sleep 10;
        done;
      env:
        - name: MY_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_POD_IP
          valueFrom:
            fieldRef:
              fieldPath: status.podIP
        - name: MY_POD_SERVICE_ACCOUNT
          valueFrom:
            fieldRef:
              fieldPath: spec.serviceAccountName
  restartPolicy: Never

建立一个 Pod

设定名称为 dapi-envars-fieldref

设定 container image 使用 k8s.gcr.io/busybox

设定 container 执行命令为 sh -c

设定 container 执行参数如下

while true; do
  echo -en '\n';
  printenv MY_NODE_NAME MY_POD_NAME MY_POD_NAMESPACE;
  printenv MY_POD_IP MY_POD_SERVICE_ACCOUNT;
  sleep 10;
done;

设定 container 环境变数 MY_NODE_NAME 为 Pod field spec.nodeName

设定 container 环境变数 MY_POD_NAME 为 Pod field metadata.name

设定 container 环境变数 MY_POD_NAMESPACE 为 Pod field metadata.namespace

设定 container 环境变数 MY_POD_IP 为 Pod field status.podIP

设定 container 环境变数 MY_POD_SERVICE_ACCOUNT 为 Pod field spec.serviceAccountName

建置 Pod 指令如下:

kubectl apply -f dapi-envars-pod.yaml

查询 Pod 状态指令如下:

kubectl get pods

查看 Container log 指令如下

kubectl logs dapi-envars-fieldref

透过互动式 terminal 进入 Container 指令如下

kubectl exec -it dapi-envars-fieldref -- sh

执行指令

printenv

透过 Environment variables 传入 Container 的设定值

建立 dapi-envars-container.yaml 如下:

apiVersion: v1
kind: Pod
metadata:
  name: dapi-envars-resourcefieldref
spec:
  containers:
    - name: test-container
      image: k8s.gcr.io/busybox:1.24
      command: [ "sh", "-c"]
      args:
      - while true; do
          echo -en '\n';
          printenv MY_CPU_REQUEST MY_CPU_LIMIT;
          printenv MY_MEM_REQUEST MY_MEM_LIMIT;
          sleep 10;
        done;
      resources:
        requests:
          memory: "32Mi"
          cpu: "125m"
        limits:
          memory: "64Mi"
          cpu: "250m"
      env:
        - name: MY_CPU_REQUEST
          valueFrom:
            resourceFieldRef:
              containerName: test-container
              resource: requests.cpu
        - name: MY_CPU_LIMIT
          valueFrom:
            resourceFieldRef:
              containerName: test-container
              resource: limits.cpu
        - name: MY_MEM_REQUEST
          valueFrom:
            resourceFieldRef:
              containerName: test-container
              resource: requests.memory
        - name: MY_MEM_LIMIT
          valueFrom:
            resourceFieldRef:
              containerName: test-container
              resource: limits.memory
  restartPolicy: Never

建立一个 Pod

设定名称为 dapi-envars-resourcefieldref

设定 container image 使用 k8s.gcr.io/busybox:1.24

设定 container 执行命令为 sh -c

设定 container 执行参数如下

while true; do
  echo -en '\n';
  printenv MY_CPU_REQUEST MY_CPU_LIMIT;
  printenv MY_MEM_REQUEST MY_MEM_LIMIT;
  sleep 10;
done;

设定 container resources 如下:

requests:
  memory: "32Mi"
  cpu: "125m"
limits:
  memory: "64Mi"
  cpu: "250m"

设定 container 环境变数 MY_CPU_REQUEST 为 Container resource field requests.cpu

设定 container 环境变数 MY_CPU_LIMIT 为 Container resource field limits.cpu

设定 container 环境变数 MY_MEM_REQUEST 为 Container resource field requests.memory

设定 container 环境变数 MY_MEM_LIMIT 为 Container resource field limits.memory

建置 Pod 指令如下:

kubectl apply -f dapi-envars-container.yaml

查询 Pod 状态指令如下:

kubectl get pods

查看 Container log 指令如下

kubectl logs  dapi-envars-resourcefieldref

後话

实务上对於需要在 container 内根据设定档而做不同执行策略

Downward API 提供了这样的弹性

後面将会使用这个 Downward API 来建制 IndexJob 来处理多个分配的 Task


<<:  Day 23 K-平均演算法 K-Means

>>:  Day 24 | 使用ManoMotion制作打地鼠游戏Part2 - 游戏管理

Javascript 运算子、型别与文法 - 陈述式与表达式

陈述式与表达式的差异 陈述式:不会回传结果,而是执行特定的程序码,如使用 if...else、swi...

Gulp 升级4.0 DAY97

由於前面我们都是使用 3.9.1版 来介绍 今天要来介绍 4.0 啦~~ gulp4.0 多了 pa...

认识CSS(九):CSS滤镜特效

滤镜特效 在影像处理软件中,我们常会用滤镜(filter)为影像加上各种不同的效果。CSS filt...

Day23 Android - RxJava+Post

那麽今天主要要用RxJava来结合retrofit做Post的部分,与上次用Retrofit的cal...

[Day 08] tinyML开胃菜Arduino IDE上桌(上)

书接上回,讲了一大堆如何做出好吃的AI咖哩饭,那到底要如何开始才能当上新一代的「AI食神」呢? 首先...