Kubernetes 容器内获取Pod信息

概述

  我们知道,Pod的逻辑概念在容器之上,kubernetes在成功创建pod之后,会为pod和容器设置一些额外的信息,例如pod级别的 pod名称、pod IP、Node IP、Label、Annotation、容器级别的资源限制等。在很多的使用场景中,这些信息对容器内的应用有很大的用处,Kubernetes提供了Downward API机制来将Pod和容器的某些元数据信息注入到容器环境中以方便提供给容器中的应用使用。
  Downward API可以通过以下两种方式将Pod和容器的元数据信息注入容器内部。
⭕环境变量:将Pod或者容器信息设置为容器的环境变量。
⭕Volume挂载:将Pod或者容器信息以文件的形式挂载到容器内部。


环境变量方式

将Pod信息设置为容器内的环境变量

# dapi-envars-fieldref.yaml
apiVersion: v1
kind: Pod
metadata:
  name: dapi-envars-fieldref
spec:
  containers:
    - name: test-container
      image: 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

注意:环境变量不直接设置value,而是设置valueFrom对Pod的元数据进行引用
本例中通过对Downward API的设置使用了以下Pod的元数据信息设置环境变量。
⭕spec.nodeName:Pod所在的Node的名称
⭕metadata.name:Pod名称
⭕metadata.namespace:Pod所在的命名空间的名称
⭕status.podIP: Pod的IP地址
⭕spec.serviceAccountName:Pod使用的ServiceAccount名称

可以通过kubectl logs dapi-envars-fieldref 查看上述pod的日志信息


将Container信息设置为容器内的环境变量

# dapi-envars-container.yaml
apiVersion: v1
kind: Pod
metadata:
  name: dapi-envars-resourcefieldref
spec:
  containers:
    - name: test-container
      image: busybox
      imagePullPolicy: Never
      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

在上例中通过Downward API将Container的资源限制信息设置为环境变量。
⭕requests.cpu:容器的CPU请求值
⭕limits.cpu:容器的CPU限制值
⭕requests.memory: 容器的内存请求值
⭕limits.memory: 容器的内存限制值


Volume 挂载方式

将Pod信息挂载为容器内的文件

下面的例子通过Downward API将Pod的Label、Annotation信息通过Volume挂载为容器中的文件:

# dapi-volume.yaml
apiVersion: v1
kind: Pod
metadata:
  name: kubernetes-downwardapi-volume-example
  labels:
    zone: us-est-coast
    cluster: test-cluster1
    rack: rack-22
  annotations:
    build: two
    builder: john-doe
spec:
  containers:
    - name: client-container
      image: busybox
      command: ["sh", "-c"]
      args:
      - while true; do
          if [[ -e /etc/podinfo/labels ]]; then
            echo -en '\n\n'; cat /etc/podinfo/labels; fi;
          if [[ -e /etc/podinfo/annotations ]]; then
            echo -en '\n\n'; cat /etc/podinfo/annotations; fi;
          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.labels: Pod的Lable列表
⭕metadata.annotations:Pod的Annotation列表
  在上例中,系统将在容器内的/etc/podinfo目录下生成labels和annotations两个文件,在labels文件中将包含Pod的全部Label列表,在annotations文件中将包含Pod的全部Annotation列表。


将Container信息挂载为容器内的文件

# dapi-volume-resources.yaml
apiVersion: v1
kind: Pod
metadata:
  name: kubernetes-downwardapi-volume-example-2
spec:
  containers:
    - name: client-container
      image: busybox
      command: ["sh", "-c"]
      args:
      - while true; do
          echo -en '\n';
          if [[ -e /etc/podinfo/cpu_limit ]]; then
            echo -en '\n'; cat /etc/podinfo/cpu_limit; fi;
          if [[ -e /etc/podinfo/cpu_request ]]; then
            echo -en '\n'; cat /etc/podinfo/cpu_request; fi;
          if [[ -e /etc/podinfo/mem_limit ]]; then
            echo -en '\n'; cat /etc/podinfo/mem_limit; fi;
          if [[ -e /etc/podinfo/mem_request ]]; then
            echo -en '\n'; cat /etc/podinfo/mem_request; fi;
          sleep 5;
        done;
      resources:
        requests:
          memory: "32Mi"
          cpu: "125m"
        limits:
          memory: "64Mi"
          cpu: "250m"
      volumeMounts:
        - name: podinfo
          mountPath: /etc/podinfo
  volumes:
    - name: podinfo
      downwardAPI:
        items:
          - path: "cpu_limit"
            resourceFieldRef:
              containerName: client-container
              # 容器的CPU限制
              resource: limits.cpu					
              divisor: 1m
          - path: "cpu_request"
            resourceFieldRef:
              containerName: client-container
              # 容器的CPU请求
              resource: requests.cpu				
              divisor: 1m
          - path: "mem_limit"
            resourceFieldRef:
              containerName: client-container
              # 容器的内存限制
              resource: limits.memory				
              divisor: 1Mi
          - path: "mem_request"
            resourceFieldRef:
              containerName: client-container
              # 容器的内存请求
              resource: requests.memory				
              divisor: 1Mi



Downward API支持设置的Pod和Container信息

  1. 可以通过fieldRef设置的元数据
    metadata.name:Pod名称。
    metadata.namespace:Pod所在的命名空间名称。
    metadata.uid:Pod的UID,
    metadata.labels[‘’]:Pod某个Label的值,通过<key>进行引用
    metadata.annotations[‘’]:Pod某个Annotation的值,通过<key>进行引用
    status.podIP:Pod的IP地址
    spec.serviceAccountName:Pod使用的ServiceAccount名称。
    spec.nodeName:Pod所在Node的名称,
    status.hostIP:Pod所在Node的IP地址

  2. 可以通过resourceFieldRef设置的数据
    Container级别的CPU Limit。
    Container级别的CPU Request。
    Container级别的Memory Limit。
    Container级别的Memory Request。
    Container级别的临时存储空间(ephemeral-storage)Limit
    Container级别的临时存储空间(ephemeral-storage)Request,

参考来源:
《Kubernetes 权威指南》第5版

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要使用kubernetes-client java获取pod容器内存与CPU使用率,可以按照以下步骤进行操作。 首先,你需要在Java项目中添加kubernetes-client的依赖,例如在pom.xml文件中添加以下代码: ```xml <dependencies> <dependency> <groupId>io.kubernetes</groupId> <artifactId>client-java</artifactId> <version>9.0.0</version> </dependency> </dependencies> ``` 接下来,你可以使用以下代码获取pod的相关信息: ```java import io.kubernetes.client.apis.CoreV1Api; import io.kubernetes.client.custom.Quantity; import io.kubernetes.client.models.V1Container; import io.kubernetes.client.models.V1ContainerStatus; import io.kubernetes.client.models.V1NamespaceList; import io.kubernetes.client.models.V1Pod; import io.kubernetes.client.models.V1PodList; import io.kubernetes.client.models.V1PodMetrics; import io.kubernetes.client.models.V1PodMetricsList; import io.kubernetes.client.util.Config; import java.util.Map; public class KubernetesClientExample { public static void main(String[] args) throws Exception { // 创建Kubernetes客户端 io.kubernetes.client.Configuration config = Config.defaultClientConfig(); io.kubernetes.client.apis.CoreV1Api api = new CoreV1Api(); // 获取pod列表 V1PodList podList = api.listPodForAllNamespaces(null, null, null, null, null, null, null, null, null); for (V1Pod pod : podList.getItems()) { // 获取pod所属的命名空间和名称 String namespace = pod.getMetadata().getNamespace(); String name = pod.getMetadata().getName(); // 获取pod容器列表和相关状态信息 for (V1Container container : pod.getSpec().getContainers()) { String containerName = container.getName(); V1ContainerStatus containerStatus = pod.getStatus().getContainerStatuses().stream() .filter(status -> status.getName().equals(containerName)) .findFirst().orElse(null); if (containerStatus != null) { // 获取容器的CPU和内存使用率 Map<String, Quantity> usage = containerStatus.getUsage(); Quantity cpuUsage = usage.get("cpu"); Quantity memoryUsage = usage.get("memory"); System.out.println("Namespace: " + namespace + ", Pod: " + name + ", Container: " + containerName + ", CPU Usage: " + cpuUsage + ", Memory Usage: " + memoryUsage); } } } } } ``` 上述代码中,我们首先创建了Kubernetes的客户端,然后通过CoreV1Api实例来获取pod列表。对于每个pod,我们遍历其容器列表,并获取容器的名称以及相关状态信息。在状态信息中,我们可以找到容器的CPU和内存使用率,以及其他相关指标。 需要注意的是,这里获取的是当前时刻的使用率数据,如果你想要定时获取容器的使用率信息,可以使用定时任务等方法来实现。 这是一个简单的示例,你可以根据实际需求和项目结构进行相应的扩展和修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值