Kubernetes 存储 Downward API

1.介绍

1.提供容器元数据

比如我们 golang语言 我们说他会根据当前CPU的数量 以此去确认我们的进程 线程 和协程之间的关系 以此去释放我们当前CPU的更大的  这么一个并行任务的能力 但是这里会出现一个问题 容器它是把当前的应用 封装在我们固定的名称空间了 而且给它以特定的资源 当然它的背后是基于我们的 cgroup  我们叫控制组 换句话的意思 它看起来 这里有4个CPU 那我就通过我们的四个线程 的方式去创建更多协程 以此去占用更多的CPU资源 但其次呢 其实我只给它限制允许使用两个CPU 那这里是不是就不搭了 可能会出现一些我们的运行的缓慢啊 还不如不优化的结果 那再包括我们类似nginx的服务 它的工作进程数量 叫 worker processes 它需要根据当前的CPU数量 去进行绑定的 那如果我们看起来现在有4个CPU 实际上只有两个在用 那我们worker processes是不是设定也会有问题 那我们怎么把当前的真实的CPU数量 内存数量 传递给容器内部的进程 或应用呢 ,就可以通过Downward API 来使用

2.动态配置 

我们有时候会根据当前的pod名称 或 pod标签去修改我们的配置参数 难在需要你给我提供准确的数那这个数据怎么提供  就由 downwardAPI 

3.与 kubernetes 环境集成

我们可以调取当前kubernetes内部的一些需要的数据  以此去修改 让我得到一个最稳妥的恰当的运行方式 这都是我们的 downward API 可以去实现可以去用到的的一种情况 比如我们的CPU实际的真实数量的传入

2.案例1 env案例

创建 12.pod.yaml

apiVersion: v1
kind: Pod
metadata:
 name: downward-api-env-example
spec:
 containers:
   - name: my-container
     image: wangyanglinux/myapp:v1.0
     env:
      - name: POD_NAME
        valueFrom:
          fieldRef:
            fieldPath: metadata.name
      - name: POD_NAMESPACE
        valueFrom:
          fieldRef:
             fieldPath: metadata.namespace
      - name: POD_IP
        valueFrom:
          fieldRef:
           fieldPath: status.podIP
      - name: CPU_REQUEST
        valueFrom:
          resourceFieldRef:
            resource: requests.cpu
      - name: CPU_LIMIT
        valueFrom:
          resourceFieldRef:
           resource: limits.cpu
      - name: MEMORY_REQUEST
        valueFrom:
          resourceFieldRef:
           resource: requests.memory
      - name: MEMORY_LIMIT
        valueFrom:
          resourceFieldRef:
            resource: limits.memory
 restartPolicy: Never
 kubectl create -f 12.pod.yaml
 kubectl exec -it downward-api-env-example -- /bin/bash
env

3.案例2 volume 案例

 如果对当前资源不做限制,默认是可以使用当前机器的所有资源,如果你觉得太多了你想加资源限制你可以使用 resources 下的 limits 和 requests关键字

apiVersion: v1
kind: Pod
metadata:
 name: downward-api-volume-example
spec:
 containers:
  - name: my-container
    image: wangyanglinux/myapp:v1.0
    resources:
     limits:
       cpu: "1"
       memory: "512Mi"
     requests:
       cpu: "0.5"
       memory: "256Mi"
    volumeMounts:
      - name: downward-api-volume
        mountPath: /etc/podinfo
 volumes:
  - name: downward-api-volume
    downwardAPI:
      items:
       - path: "annotations"
         fieldRef:
           fieldPath: metadata.annotations
       - path: "labels"
         fieldRef:
           fieldPath: metadata.labels
       - path: "name"
         fieldRef:
           fieldPath: metadata.name
       - path: "namespace"
         fieldRef:
           fieldPath: metadata.namespace
       - path: "uid"
         fieldRef:
           fieldPath: metadata.uid
       - path: "cpuRequest"
         resourceFieldRef:
           containerName: my-container
           resource: requests.cpu
       - path: "memoryRequest"
         resourceFieldRef:
           containerName: my-container
           resource: requests.memory
       - path: "cpuLimit"
         resourceFieldRef:
           containerName: my-container
           resource: limits.cpu
       - path: "memoryLimit"
         resourceFieldRef:
           containerName: my-container
           resource: limits.memory
 restartPolicy: Never

requests含义初识资源

limits 最大资源

kubectl create -f 13.pod.yaml
 kubectl exec -it downward-api-volume-example -- /bin/bash
cd /etc/podinfo
ls -l

1.给加标签这文件的值会更新

kubectl get po --show-labels

 kubectl label pod downward-api-volume-example jmj=admin

这样就加载过来了 热更新 

cat labels

 

 

4.案例3  Pod之间传递元数据 基于ApiServer访问集群

 1.创建一个RBAC的基于角色的权限

1.rbac.yaml 

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
 name: test-api-cluster-admin-binding
subjects:
- kind: ServiceAccount
  name: test-api
  namespace: default
roleRef:
 kind: ClusterRole
 name: cluster-admin
 apiGroup: rbac.authorization.k8s.io
kubectl create -f 1.rbac.yaml

2.创建 一个Service Account 简称 sa  test-api 

kubectl create sa test-api

3.创建pod

apiVersion: v1
kind: Pod
metadata:
 name: curl
spec:
 serviceAccountName: test-api
 containers:
 - name: main
   image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/curlimages/curl:8.9.1
   command: ["sleep", "9999"]

赋予权限等会访问Api服务器

kubectl apply -f 1.pod.yaml
root@curl:/# TOKEN=$( cat /var/run/secrets/kubernetes.io/serviceaccount/token )
root@curl:/# CAPATH="/var/run/secrets/kubernetes.io/serviceaccount/ca.crt"
root@curl:/# NS=$( cat /var/run/secrets/kubernetes.io/serviceaccount/namespace )
root@curl:/# curl -H "Authorization: Bearer $TOKEN" --cacert $CAPATH 
https://kubernetes/api/v1/namespaces/$NS/pods

这是另一种获取pod相关属性的方式

5.kubernetes api文档

kubectl proxy --port=8080

相当于把我们apiserver 服务器做了 类似于nginx 在外面桥接一次 把https 转化为 http 你就不需要提供证书了 而且基于这样的端口访问的时候 是不需要做授权的判断的 更简单 

curl localhost:8080/openapi/v2 > k8s-swagger.json
cat k8s-swagger.json

用图形化界面去读取 这个json文件

docker run --rm -d -p 80:8080 -e SWAGGER_JSON=/k8s-swagger.json -v $(pwd)/k8s-swagger.json:/k8s-swagger.json swaggerapi/swagger-ui

这样就获取到官方的接口文档了

 

<think>好的,我现在需要给用户介绍一下KubernetesDownward API。首先,我得确保自己对这个概念有正确的理解。Downward API允许Pod将自身的信息,比如标签、注解、资源限制等暴露给容器内的应用程序,而不需要直接与Kubernetes API交互。这样做的目的是让应用程序能够方便地获取Pod或容器级别的元数据。 接下来,我需要回忆一下Downward API的两种主要使用方式:环境变量和卷文件。用户可能想知道这两种方式的具体应用场景和配置方法。比如,环境变量适合传递简单的信息,而卷文件则适合需要动态更新的数据,比如注解的变化。 然后,我应该考虑用户可能关心的问题,比如使用Downward API的好处是什么,有哪些使用限制。例如,通过Downward API获取的信息不需要额外的权限,降低了安全风险,但只能暴露Pod自身的信息,不能获取其他Pod的信息。 还需要注意举例说明,帮助用户更好地理解。比如,如何通过环境变量注入Pod的名称和命名空间,或者通过卷文件挂载标签和资源限制。同时,要提醒用户某些字段可能需要容器运行时支持,比如资源限制的字段在容器创建后不可更改,所以可能需要使用卷的方式来获取。 此外,需要确保回答结构清晰,分点说明,符合用户可见层的指引。可能的结构是先定义Downward API,再介绍两种使用方式,接着列举使用场景,最后提到注意事项和限制。 最后,检查是否有遗漏的重要信息,比如使用Downward API的字段类型,哪些属于metadata,哪些属于spec,以及安全性和权限方面的考虑。确保回答准确,并且用中文自然表达,避免技术术语过于晦涩,同时保持专业性。</think>Kubernetes 的 **Downward API** 是一种将 Pod 或容器的元数据信息暴露给容器内应用程序的机制,无需直接调用 Kubernetes API。以下是逐步解析: --- ### 一、核心作用 1. **简化元数据获取** 容器内应用可直接获取自身所在 Pod 的信息(如名称、标签、资源限制等),无需依赖额外 SDK 或 API 查询。 2. **降低权限依赖** 避免为容器授予 Kubernetes API 的访问权限,提升安全性。 --- ### 二、两种使用方式 #### 方式 1:通过环境变量注入 在 Pod 定义中,将 Pod/容器的字段映射到容器的环境变量。 ```yaml apiVersion: v1 kind: Pod metadata: name: demo-pod labels: app: my-app spec: containers: - name: main-container image: busybox env: - name: POD_NAME # 环境变量名 valueFrom: fieldRef: fieldPath: metadata.name # 注入 Pod 名称 - name: CPU_LIMIT # 容器资源限制 valueFrom: resourceFieldRef: containerName: main-container resource: limits.cpu ``` #### 方式 2:通过卷挂载文件 将元数据以文件形式挂载到容器内,支持动态更新(如标签、注解变化)。 ```yaml apiVersion: v1 kind: Pod metadata: name: demo-pod annotations: buildVersion: "v2.1" spec: containers: - name: main-container image: busybox volumeMounts: - name: pod-info mountPath: /etc/podinfo volumes: - name: pod-info downwardAPI: items: - path: "labels" # 文件名 fieldRef: fieldPath: metadata.labels # 挂载 Pod 标签 - path: "annotations" fieldRef: fieldPath: metadata.annotations ``` --- ### 三、典型使用场景 1. **日志标记** 应用程序将 `metadata.name` 或 `metadata.labels` 写入日志,便于追踪问题。 2. **配置差异化** 根据 `metadata.namespace` 动态加载不同环境的配置。 3. **资源监控** 容器内监控工具读取 `limits.cpu` 或 `requests.memory` 实现资源使用率统计。 --- ### 四、支持暴露的字段 | 类型 | 示例字段 | 说明 | |---------------------|----------------------------|--------------------------| | Pod 元数据 | `metadata.name` | Pod 名称 | | | `metadata.labels` | Pod 标签 | | | `metadata.annotations` | Pod 注解 | | 容器元数据 | `limits.cpu` | 容器 CPU 限制 | | | `requests.memory` | 容器内存请求量 | | Pod 运行信息 | `spec.nodeName` | 所在节点名称 | | | `status.podIP` | Pod 的 IP 地址 | --- ### 五、注意事项 1. **字段限制** 仅支持特定字段(见官方文档),部分字段需容器运行时支持(如资源限制字段)。 2. **静态 vs 动态** - 环境变量方式的值在容器启动后**不可更新**。 - 卷文件方式的值在元数据变化时(如标签修改)会自动更新。 3. **安全边界** Downward API 仅暴露**当前 Pod** 的信息,无法获取集群其他资源数据。 --- 通过 Downward APIKubernetes 实现了容器与平台元数据的低耦合交互,平衡了灵活性与安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值