Kubernetes在容器内获取Pod信息

Kubernetes在容器内获取Pod信息

我们知道,每个 Pod 在被成功创建出来之后,都会被系统分配唯一的名字、IP 地址,并且处于某个 Namespace

中,那么我们如何在 Pod 的容器内获取 Pod 的这些重要信息呢?答案就是使用 Downward API。

Downward API 可以通过以下两种方式将 Pod 信息注入容器内部。

(1)环境变量:用于单个变量,可以将 Pod 信息和 Container 信息注入容器内部。

(2)Volume 挂载:将数组类信息生成为文件并挂载到容器内部。

下面通过几个例子对 Downward API 的用法进行说明。

1、环境变量方式将Pod信息注入为环境变量

下面的例子通过 Downward API 将 Pod 的 IP、名称和所在 Namespace 注入容器的环境变量中,容器应用使用

env 命令将全部环境变量打印到标准输出中。

配置文件 010-dapi-test-pod.yaml 的内容为:

apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
  - name: test-container
    image: busybox
    command: [ "/bin/sh", "-c", "env" ]
    env:
    - 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
  restartPolicy: Never

注意到上面 valueFrom 这种特殊的语法是 Downward API 的写法,目前 Downward API 提供了以下变量。

  • metadata.name:Pod 的名称,当 Pod 通过 RC 生成时,其名称是 RC 随机产生的唯一名称。

  • status.podIP:Pod 的 IP 地址,之所以叫作 status.podIP 而非 metadata.IP,是因为 Pod 的 IP 属于状态

    数据,而非元数据。

  • metadata.namespace:Pod 所在的 Namespace。

运行 kubectl create 命令创建 Pod:

[root@master cha3]# kubectl create -f 010-dapi-test-pod.yaml
pod/dapi-test-pod created
[root@master cha3]# kubectl get pods dapi-test-pod
NAME            READY   STATUS      RESTARTS   AGE
dapi-test-pod   0/1     Completed   0          67s

查看 dapi-test-pod 的日志:

[root@master cha3]# kubectl logs dapi-test-pod
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT=tcp://10.96.0.1:443
HOSTNAME=dapi-test-pod
SHLVL=1
HOME=/root
MY_POD_NAMESPACE=default
MY_POD_IP=10.244.140.197
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_SERVICE_HOST=10.96.0.1
PWD=/
MY_POD_NAME=dapi-test-pod

从日志中我们可以看到 Pod 的 IP、Name 及 Namespace 等信息都被正确保存到了 Pod 的环境变量中。

2、环境变量方式将容器资源信息注入为环境变量

下面的例子通过 Downward API 将 Container 的资源请求和限制信息注入容器的环境变量中,容器应用使用

printenv 命令将设置的资源请求和资源限制环境变量打印到标准输出中。

配置文件 011-dapi-test-pod-container-vars.yaml 的内容为:

apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod-container-vars 
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 3600;
        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

注意 valueFrom 这种特殊的 Downward API 语法,目前 resourceFieldRef 可以将容器的资源请求和资源限制等

配置设置为容器内部的环境变量。

  • requests.cpu:容器的 CPU 请求值。

  • limits.cpu:容器的 CPU 限制值。

  • requests.memory:容器的内存请求值。

  • limits.memory:容器的内存限制值。

运行 kubectl create 命令来创建 Pod:

[root@master cha3]# kubectl create -f 011-dapi-test-pod-container-vars.yaml
pod/dapi-test-pod-container-vars created
[root@master cha3]# kubectl get pods dapi-test-pod-container-vars
NAME                           READY   STATUS    RESTARTS   AGE
dapi-test-pod-container-vars   1/1     Running   0          14s

查看 dapi-test-pod-container-vars 的日志:

[root@master cha3]# kubectl logs dapi-test-pod-container-vars

1
1
33554432
67108864

从日志中我们可以看到Containerrequests.cpulimits.cpurequests.memorylimits.memory

信息都被正确保存到了 Pod 的环境变量中。

3、Volume挂载方式

下面的例子通过 Downward API 将 Pod 的 Label、Annotation 列表通过 Volume 挂载为容器中的一个文件,容器

应用使用 echo 命令将文件的内容打印到标准输出中。

配置文件 012-dapi-test-pod-volume.yaml 的内容为:

apiVersion: v1 
kind: Pod 
metadata:
  name: dapi-test-pod-volume
  labels:
    zone: us-est-coast
    cluster: test-cluster1
    rack: rack-22
  annotations:
    build: two
    builder: john-doe
spec:
  containers:
    - name: test-container
      image: busybox
      imagePullPolicy: Never
      command: ["sh", "-c"]
      args:
      - while true; do
          if [[ -e /opt/labels ]]; then
            echo -en '\n\n'; cat /opt/labels; fi;
          if [[ -e /opt/annotations ]]; then
            echo -en '\n\n'; cat /opt/annotations; fi;
          sleep 3600;
        done;
      volumeMounts:
        - name: podinfo
          mountPath: /opt
          readOnly: false
  volumes:
    - name: podinfo
      downwardAPI:
        items:
          - path: "labels"
            fieldRef:
              fieldPath: metadata.labels
          - path: "annotations"
            fieldRef:
              fieldPath: metadata.annotations 

这里要注意 volumes 字段中 downwardAPI 的特殊语法,通过 items 的设置,系统会根据 path 的名称生成文

件。根据上例的设置,系统将在容器内生成 /opt/labels/opt/annotations 两个文件。在 /opt/labels

文件中将包含 metadata.labels 的全部 Label 列表,在 /opt/annotations 文件中将包含

metadata.annotations的全部 Label 列表。

运行 kubectl create 命令创建 Pod:

[root@master cha3]# kubectl create -f 012-dapi-test-pod-volume.yaml
pod/dapi-test-pod-volume created
[root@master cha3]# kubectl get pods dapi-test-pod-volume
NAME                   READY   STATUS    RESTARTS   AGE
dapi-test-pod-volume   1/1     Running   0          16s

查看 dapi-test-pod-volume 的日志:

[root@master cha3]# kubectl logs dapi-test-pod-volume


cluster="test-cluster1"
rack="rack-22"
zone="us-est-coast"

build="two"
builder="john-doe"
kubernetes.io/config.seen="2023-07-02T17:02:42.357753840+08:00"

从日志中我们看到 Pod 的 Label 和 Annotation 信息都被保存到了容器内的 /opt/labels/opt/annotations

文件中。

[root@master cha3]# kubectl exec -it dapi-test-pod-volume --  ls /opt
annotations  labels
[root@master cha3]# kubectl exec -it dapi-test-pod-volume --  cat /opt/annotations
build="two"
builder="john-doe"
kubernetes.io/config.seen="2023-07-02T17:02:42.357753840+08:00"
kubernetes.io/config.source="api"
[root@master cha3]# kubectl exec -it dapi-test-pod-volume --  cat /opt/labels
cluster="test-cluster1"
rack="rack-22"
zone="us-est-coast"

那么,Downward API有什么价值呢?

在某些集群中,集群中的每个节点都需要将自身的标识(ID)及进程绑定的 IP 地址等信息事先写入配置文件中,进程

在启动时会读取这些信息,然后将这些信息发布到某个类似服务注册中心的地方,以实现集群节点的自动发现功

能。此时 Downward API 就可以派上用场了,具体做法是先编写一个预启动脚本或 Init Container,通过环境变量

或文件方式获取 Pod 自身的名称、IP地址等信息,然后将这些信息写入主程序的配置文件中,最后启动主程序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用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和内存使用率,以及其他相关指标。 需要注意的是,这里获取的是当前时刻的使用率数据,如果你想要定时获取容器的使用率信息,可以使用定时任务等方法来实现。 这是一个简单的示例,你可以根据实际需求和项目结构进行相应的扩展和修改。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值