Kubernetes在容器内获取Pod信息

这篇具有很好参考价值的文章主要介绍了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地址等信息,然后将这些信息写入主程序的配置文件中,最后启动主程序。文章来源地址https://www.toymoban.com/news/detail-688450.html

到了这里,关于Kubernetes在容器内获取Pod信息的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Kubernetes】K8s 查看 Pod 的状态

    NAME :Pod 的名称。 READY :代表 Pod 里面有几个容器,前面是启动的,后面是总数, 1 / 1 1/1 1/1 。 STATUS :就是当前 Pod 状态,最常见的就是 Running 正在运行,最期望的状态,只要不是 Running 的就说明有问题,就算是 Running 的就不一定没有问题。 状态 说明 Pending 挂起 在执行创建

    2024年01月15日
    浏览(71)
  • kubernetes(k8s) pod(资源限制、基础概念)

    目录  一、资源限制 1、概念 1.2、Pod和容器的资源请求和限制 1.3、CPU资源单位 1.4、内存资源单位 1.5、CPU和内存的Requests和Limits的特点 1.6、案例 二、pod 的两种使用方式 三、pod 资源共享 四、底层容器Pause 1、pause 共享资源 1.1、网络 1.2、存储 1.3、小结 2、Pause主要功能 3、Pod

    2024年02月05日
    浏览(52)
  • Kubernetes(k8s)核心资源解析:Pod详解

    💖The Begin💖点点关注,收藏不迷路💖 Pod是Kubernetes中最小的调度单元,它可以包含一个或多个容器。Pod中的所有容器共享网络和存储卷,它们一起运行在同一个节点上。Pod提供了一种抽象层,使得容器可以作为一个逻辑单元来管理。 Pod中的容器共享IP地址、端口空间和存储

    2024年04月11日
    浏览(55)
  • K8S第四讲 Kubernetes删除pod阻塞问题

    在Kubernetes中,当您尝试删除一个Pod时,可能会遇到Pod一直阻塞的情况。这通常是由于Pod正在运行或被其他资源(例如ReplicaSet或Deployment)控制而导致的。以下是一些可能的解决方案: 1: 确认Pod是否正在运行:在执行删除Pod命令之前,请先检查Pod的状态,确保它没有在运行中

    2024年02月05日
    浏览(45)
  • Kubernetes(k8s):精通 Pod 操作的关键命令

    💖The Begin💖点点关注,收藏不迷路💖 Kubernetes 是一个强大的容器编排平台,其中的核心概念之一就是 Pod。Pod 是 Kubernetes 中最小的可部署单元,它由一个或多个容器组成,共享网络和存储资源。 在本篇博客中,我们将深入探讨 Kubernetes 集群中与 Pod 相关的一些重要命令,帮

    2024年04月14日
    浏览(39)
  • 【Kubernetes】 从基础认识 k8s核心pod相关概念

    提示:此篇帮助朋友们,养成从0到1不断延伸知识的一种方法 最简单的创建pod入手 访问官方文档,直接使用案例,进行修改即可! 官网地址:https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/assign-pods-nodes/ 删除不需要的部分,根据规则添加需要的参数即可得到需要的,代码如

    2024年01月25日
    浏览(45)
  • K8s(Kubernetes)学习(三):pod概念及相关操作

    摘取官网: https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/#working-with-pods 1.1 简介 Pod 是可以在 Kubernetes 中 创建和管理的、最小的可部署的计算单元 。 Pod (就像在鲸鱼荚或者豌豆荚中) 是一组(一个或多个)容器 ; 这些容器共享存储、网络、以及怎样运行这些容器的声明。 P

    2024年02月13日
    浏览(69)
  • Kubernetes(k8s):Pod 的 Node Selector详解

    💖The Begin💖点点关注,收藏不迷路💖 Node Selector是Kubernetes中一个用于指定Pod部署位置的重要概念。通过Node Selector,用户可以将Pod调度到具有特定标签的节点上。 这种标签通常用于区分节点的硬件配置、地理位置、网络特性等。通过合理地设置Node Selector,用户可以优化应用

    2024年04月08日
    浏览(69)
  • 【Kubernetes 系列】一文带你吃透 K8S 应用pod结点

    作者:半身风雪 上一节:创建K8s集群项目 简介:上一节我们一起学习了,如何去部署一个K8S 的应用程序,这一节,我们主要讲解一下,K8S 应用的框架结构。 本节我将和大家一起学习Kubernetes 应用中的pod结点 了解 Kubernetes Pod。 了解 Kubernetes 工作节点。 对已部署的应用故障排

    2023年04月08日
    浏览(37)
  • 【精品】kubernetes(K8S)集群top命令监控 Pod 度量指标

    提示:做到举一反三就要学会使用help信息 找出标签是name=cpu-user的Pod,并过滤出使用CPU最高的Pod,然后把它的名字写在已经存在的/opt/cordon.txt文件里 了解pod指标,主要需要关注,CPU与内存占用率;生产环境,可能有几十个pod,我们为了使其便于快速检索到需要的pod,可以学会

    2024年02月16日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包