Kubernetes之Downward API

这里介绍Kubernetes如何通过Downward API实现将Pod的元数据暴露、传递到容器当中

Kubernetes之Downward API

abstract.png

基于环境变量

通过Downward API可以将Pod的元数据暴露、传递给容器。特别有的元数据是无法在容器运行前得知的,比如Pod的IP、名称等。具体地,Downward API支持通过环境变量、Downward API类型卷两种方式。这里我们先演示Downward API通过环境变量的方式向容器传递元数据,示例配置如下所示

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: my-app-rs-1
spec:  
  replicas: 1
  selector:
    matchLabels:
      app: my-app-1
  # Pod 模板
  template:
    metadata:      
      labels:
        app: my-app-1
    spec:
      # 容器信息
      containers:
      - name: my-app-container-1
        image: luksa/kubia
        resources:
          # 容器的资源请求
          requests:
            # CPU核数: 0.015个
            cpu: 15m
          # 容器的资源限制
          limits:
            # 内存: 40MB
            memory: 40Mi
        # 定义容器的环境变量
        env:
        - name: my_pod_name
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: my_pod_ns
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: my_pod_ip
          valueFrom:
            fieldRef:
              fieldPath: status.podIP
        - name: my_node_name
          valueFrom:
            fieldRef:
              fieldPath: spec.nodeName
        - name: my_cpu_request
          valueFrom:
            resourceFieldRef:
              resource: requests.cpu
              # 设定基数单位: 0.001个
              divisor: 1m
        - name: my_memory_limit
          valueFrom:
            resourceFieldRef:
              resource: limits.memory
              # 设定基数单位: 1MB
              divisor: 1Mi

效果如下所示

Kubernetes之Downward API

figure 1.jpeg

这里补充说明下,对于容器资源请求、限制的环境变量而言,其值的计算方式为:资源请求、限制的实际值 / 基数单位。例如,容器内存限制为:40MB,基数单位为:1MB,则my_memory_limit的值为 40MB/1MB = 40

基于环境变量的方式下,存在两个缺陷:首先,无法暴露、传递Pod的标签、注解给容器。原因在于一旦标签、注解修改了,环境变量无法在不重启容器的前提下进行更新;其次,当前容器无法获取其所在Pod中其他容器的资源请求、限制信息。即容器只能获取其自身的资源请求、限制信息

基于Downward API类型卷

在通过Downward API类型卷方式将Pod的元数据暴露给容器时,不仅可以使得容器能够访问Pod的标签、注解信息,还可以访问其所在Pod的其他容器的资源、限制信息

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: my-app-rs
spec:  
  replicas: 1
  selector:
    matchLabels:
      app: my-app
  # Pod 模板
  template:
    metadata:
      # Pod标签
      labels:
        app: my-app
        author: AaronZhu
      # Pod注解
      annotations:
        buildEnv: dev
        buildDate: 2022.08.13
    spec:
      # 容器信息
      containers:
      - name: my-app-container
        image: luksa/kubia
        resources:
          # 容器的资源限制
          limits:
            # CPU核数: 0.034个
            cpu: 34m
        # 将名为my-downward-volume的downward API卷挂载到容器内的/Data/MyDownwardData路径
        volumeMounts:
        - name: my-downward-volume
          mountPath: /Data/MyDownwardData
      volumes:
      # 定义名为my-downward-volume的downward API类型卷
      - name: my-downward-volume
        downwardAPI:
          items:
          # 将Pod的名称写入到名为 myPodName 的文件当中    
          - path: myPodName
            fieldRef:
              fieldPath: metadata.name
          # 将CPU限制值写入到名为 myCpuLimit 的文件当中
          - path: myCpuLimit
            resourceFieldRef:
              # 当引用容器的资源字段时, 需要明确指定容器的名称
              containerName: my-app-container
              resource: limits.cpu
              # 设定基数单位: 0.001个
              divisor: 1m
          # 将Pod的标签写入到名为 myPodLabels 的文件当中
          - path: myPodLabels
            fieldRef:
              fieldPath: metadata.labels
          # 将Pod的注解写入到名为 myPodAnnotations 的文件当中
          - path: myPodAnnotations
            fieldRef:
              fieldPath: metadata.annotations

效果如下所示,符合预期

Kubernetes之Downward API

figure 2.jpeg

量纲词头

这里对于资源的请求、限制信息所使用的量纲词头,如下所示

「1. 二进制词头」

Ki = 1024 = 2^10
Mi = 1024 * Ki = 2^20
Gi = 1024 * Mi = 2^30
Ti = 1024 * Gi = 2^40
Pi = 1024 * Ti = 2^50
Ei = 1024 * Pi = 2^60

「2. 十进制词头」

k = 1000 = 10^3
M = 1000 * k = 10^6
G = 1000 * M = 10^9
T = 1000 * G = 10^12
P = 1000 * T = 10^15
E = 1000 * P = 10^18
m = 0.001 = 10^-3 

参考文献

  1. Kubernetes in Action中文版 Marko Luksa著
  2. 深入剖析Kubernetes 张磊著

原文始发于微信公众号(青灯抽丝):Kubernetes之Downward API

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/41901.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!