【k8s 系列】k8s 学习二十四,如何访问 pod 元数据

简介: **我们在 pod 中运行容器的时候,是否也会有想要获取当前 pod 的环境信息呢?**咱们写的 yaml 清单写的很简单,实际上部署之后, k8s 会给我们补充在 yaml 清单中没有写的字段,那么我们的 pod 环境信息和容器的元数据如何传递到容器中呢?是不是也是通过获取这些 k8s 默认给我填写的字段呢?

【k8s 系列】k8s 学习二十四,如何访问 pod 元数据

**我们在 pod 中运行容器的时候,是否也会有想要获取当前 pod 的环境信息呢?**咱们写的 yaml 清单写的很简单,实际上部署之后, k8s 会给我们补充在 yaml 清单中没有写的字段,那么我们的 pod 环境信息和容器的元数据如何传递到容器中呢?是不是也是通过获取这些 k8s 默认给我填写的字段呢?

有 3 种方式:

  • 通过环境变量的方式
  • 通过  Downward Api 的方式
  • 通过和 ApiServer 交互的方式

通过环境变量的方式

通过环境变量的方式获取 pod 的信息,还是比较简单的,还记得我们之前将卷中的数据转成环境变量传入到容器中的方式吗?

本次我们也是使用类似的方式来传递数据,应该说比之前的还要简单,不过我们本次传递的是环境信息,例如 pod 的 IP,pod 的 名称,命名空间,pod 所属的服务账号,节点的名称,CPU / 内存的请求 / 限制大小等等

我们任意看一下 pod 的 yaml 清单信息

image.png

image.png

image.png

上述 yaml 清单信息中,每一个字段我们都可以用来传递到容器中作为环境变量,我们可以来尝试写一个

  • 写一个 yaml 清单,创建名称为 my-downward 的 pod
  • 容器里面的使用 busybox 作为基础镜像,由于容器需要运行在 pod 中,因此我们需要运行一个程序在容器中,例如 sleep 8888888 或者其他的任意一个可以长期运行的程序

image.png

apiVersion: v1
kind: Pod
metadata:
  name: my-downward
spec:
  containers:
  - name: my-downward
    image: busybox
    command: ["sleep","8888888"]
    env:
    - name: XMT_POD_NAME
      valueFrom:
        fieldRef:
          fieldPath: metadata.name
    - name: XMT_NAMESPACE
      valueFrom:
        fieldRef:
          fieldPath: metadata.namespace
    - name: XMT_NODENAME
      valueFrom:
        fieldRef:
          fieldPath: spec.nodeName
    - name: XMT_SERVICE_ACCOUNT
      valueFrom:
        fieldRef:
          fieldPath: spec.serviceAccountName
    - name: XMT_REQUEST_CPU
      valueFrom:
        resourceFieldRef:
          resource: requests.cpu
          divisor: 1m
    - name: XMT_LIMITS_MEMORY
      valueFrom:
        resourceFieldRef:
          resource: limits.memory
          divisor: 1Ki

上述自己配置了多个 XMT_* 的环境变量,来源都是在 pod 中的对应配置,kubectl create 上述 yaml 文件后,可以查看效果如下

image.png

环境变量如上所示,当我们容器里面需要使用该环境变量的时候,就可以随取随用了,很方便

可以看到容器中的环境变量和 yaml 清单上的 env 一一对应

image.png

通过 Downward Api 卷的方式

当然,我们也可以使用第二种方式,那就是通过 Downward Api 卷的方式,具体的操作方式和上述环境变量的方式类似,但是使用卷的方式,会在指定的路径下生成文件

Downward Api 看上去会不会想起 Restful Api,是不是都是通过访问接口的方式获取数据呢?

并不是这样的, Downward Api 实际上是将 pod 的定义和状态信息,作为容器的环境变量或者文件的方式,来给容器传递数据的,如图

image.png

Downward Api 卷的方式可以这么写:

apiVersion: v1
kind: Pod
metadata:
  name: my-downward-vv
  labels:
    xmtconf: dev
spec:
  containers:
  - name: my-downward-vv
    image: busybox
    command: ["sleep","8888888"]
    volumeMounts:
    - name: my-downward-vv
      mountPath: /etc/myvv
  volumes:
  - name: my-downward-vv
    downwardAPI:
      items:
      - path: "xmtPodName"
        fieldRef:
          fieldPath: metadata.name
      - path: "xmtNamespace"
        fieldRef:
          fieldPath: metadata.namespace
      - path: "xmtLabels"
        fieldRef:
          fieldPath: metadata.labels

看这个 yaml 还是比较简单的,和写挂载的方式类似的,此处使用 downwardAPI 下的 items,来传递每一个数据,数据的来源写法和上述的环境变量类似

image.png

我们可以看到,Downward Api 挂载数据,具体的文件里面会以键值对的方式来呈现,也会以文本的形式来呈现

我们来将 pod 的标签修改成 prod,验证容器里面对应的文件是否会对应修改?

kubectl label pod my-downward-vv xmtconf=prod --overwrite

进入容器中查看 /etc/myvv/xmtLabels 文件是否有变化

image.png

通过上述效果,可以看出,当使用 Downward Api 卷的时候,对应的环境变量会以文件的形式存在于我们指定的目录下

若我们在程序运行中修改了环境变量对应的值,那么卷中的文件内容也会相应修改

如何与 APiServer 进行交互?

既然可以用第三种方式与 ApiServer 的方式,咋还使用环境变量和 Downward Api 的方式呢?

自然是因为 Downward Api 的方式有所局限,局限就是 Downward Api 的方式只能获取自身 pod 的数据,如果我们想获取其他 pod 的资源信息,这个时候我们就需要和 Api Server 进行交互了

类似于这样:

image.png

那么我们来写一个 pod, 让 pod 里面的容器与 ApiServer 进行交互,此处我们需要注意两点:

  • 我们要确定 ApiServer 的位置,我们才能有机会正确访问到
  • 需要通过 ApiServer 的认证

咱们写一个 pod ,用于在这个 pod 里面使用 curl 访问 ApiServer

自己制作一个简单的带有 curl 的镜像

FROM ubuntu:latest
RUN  apt-get update -y
RUN  apt install curl -y
ENTRYPOINT ["sleep", "8888888"]

制作该镜像,推送镜像到 dockerhub

docker build -t xiaomotong888/xmtcurl .
docker push xiaomotong888/xmtcurl

写一个简单的 yaml,运行 pod

mycurl.yaml

apiVersion: v1
kind: Pod
metadata:
  name: xmt-curl
spec:
  containers:
  - name: xmt-curl
    image: xiaomotong888/xmtcurl
    command: ["sleep","8888888"]

pod 运行成功后,咱们进入到 容器里面

kubectl exec -it xmt-curl bash

咱们可以在 k8s 环境中查看一下 kubernetes 服务的 ip ,我们可以这样来访问

image.png

在容器中访问 kubernetes

image.png

这是因为没有证书,我们需要导入证书和 token , 这样才能正确的访问到 ApiServer,并且还需要一个重要的操作

创建一个  clusterrolebinding,需要创建了该绑定之后,才能正常的访问到 ApiServer,若没有创建该绑定,那么后面的步骤都做好了,ApiServer 也会报 403  Forbidden

kubectl create clusterrolebinding gitlab-cluster-admin --clusterrole=cluster-admin --group=system:serviceaccounts --namespace=dev

=cluster-admin --group=system:serviceaccounts --namespace=dev

证书的位置还记的吗?

image.png

之前我们查看过默认的 k8s 挂载的位置,/var/run/secrets/kubernetes.io/serviceaccount 这里面有 命名空间,证书,token

image.png

这个时候,我们访问 k8s ApiServer 的时候,可以加上该证书

curl --cacert /var/run/secrets/kubernetes.io/serviceaccount/ca.crt https://kubernetes

https://kubernetes

我们可以导入一个环境变量,访问 k8s ApiServer 的时候就不需要收到导入证书了

export CURL_CA_BUNDLE=/var/run/secrets/kubernetes.io/serviceaccount/ca.crt

unt/ca.crt

gitee.com/common_dev/…

可以看到效果和刚才不一样了,现在报 403 是因为没有 token ,这个时候,我们在加上 token 即可

TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)

n)

image.png

这样就可以看到 apiServer 都有哪些 api 了 , 这些 api 可都是我们在写 yaml 清单时候 apiVersion 的是时候填写的

那么用一个图来结束今天的分享

image.png

容器里面的应用通过证书与 ApiServer 完成认证,通过 token 和 namespace 和 ApiServer 完成接口的交互

今天就到这里,学习所得,若有偏差,还请斧正


欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

image.png

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
6月前
|
Kubernetes Docker 容器
Kubernetes与Docker参数对照:理解Pod中的command、args与Dockerfile中的CMD、ENTRYPOINT。
需要明确的是,理解这些都需要对Docker和Kubernetes有一定深度的理解,才能把握二者的区别和联系。虽然它们都是容器技术的二个重要组成部分,但各有其特性和适用场景,理解它们的本质和工作方式,才能更好的使用这些工具,将各自的优点整合到生产环境中,实现软件的快速开发和部署。
201 25
|
10月前
|
Prometheus Kubernetes 监控
深入探索Kubernetes中的Pod自动扩展(Horizontal Pod Autoscaler, HPA)
深入探索Kubernetes中的Pod自动扩展(Horizontal Pod Autoscaler, HPA)
|
6月前
|
Kubernetes Shell Windows
【Azure K8S | AKS】在AKS的节点中抓取目标POD的网络包方法分享
在AKS中遇到复杂网络问题时,可通过以下步骤进入特定POD抓取网络包进行分析:1. 使用`kubectl get pods`确认Pod所在Node;2. 通过`kubectl node-shell`登录Node;3. 使用`crictl ps`找到Pod的Container ID;4. 获取PID并使用`nsenter`进入Pod的网络空间;5. 在`/var/tmp`目录下使用`tcpdump`抓包。完成后按Ctrl+C停止抓包。
213 12
|
9月前
|
Kubernetes 网络协议 应用服务中间件
Kubernetes Ingress:灵活的集群外部网络访问的利器
《Kubernetes Ingress:集群外部访问的利器-打造灵活的集群网络》介绍了如何通过Ingress实现Kubernetes集群的外部访问。前提条件是已拥有Kubernetes集群并安装了kubectl工具。文章详细讲解了Ingress的基本组成(Ingress Controller和资源对象),选择合适的版本,以及具体的安装步骤,如下载配置文件、部署Nginx Ingress Controller等。此外,还提供了常见问题的解决方案,例如镜像下载失败的应对措施。最后,通过部署示例应用展示了Ingress的实际使用方法。
290 2
|
10月前
|
存储 Kubernetes Docker
【赵渝强老师】Kubernetes中Pod的基础容器
Pod 是 Kubernetes 中的基本单位,代表集群上运行的一个进程。它由一个或多个容器组成,包括业务容器、基础容器、初始化容器和临时容器。基础容器负责维护 Pod 的网络空间,对用户透明。文中附有图片和视频讲解,详细介绍了 Pod 的组成结构及其在网络配置中的作用。
171 1
【赵渝强老师】Kubernetes中Pod的基础容器
|
10月前
|
运维 Kubernetes Shell
【赵渝强老师】K8s中Pod的临时容器
Pod 是 Kubernetes 中的基本调度单位,由一个或多个容器组成,包括业务容器、基础容器、初始化容器和临时容器。临时容器用于故障排查和性能诊断,不适用于构建应用程序。当 Pod 中的容器异常退出或容器镜像不包含调试工具时,临时容器非常有用。文中通过示例展示了如何使用 `kubectl debug` 命令创建临时容器进行调试。
176 1
|
应用服务中间件 调度 nginx
Kubernetes-项目中pod调度使用法则
前言kubernetes中部署的pod默认根据资源使用情况自动调度到某个节点。可在实际项目的使用场景中都会有更细粒度的调度需求,比如:某些pod调度到指定主机、某几个相关的服务的pod最好调度到一个节点上、Master节点不允许某些pod调度等。
2128 0
|
Kubernetes 应用服务中间件 调度
Kubernetes之Pod调度
Kubernetes调度器根据特定的算法与策略将pod调度到工作节点上。在默认情况下,Kubernetes调度器可以满足绝大多数需求,例如调度pod到资源充足的节点上运行,或调度pod分散到不同节点使集群节点资源均衡等。
1524 0
|
Kubernetes 应用服务中间件 调度
Kubernetes之Pod调度
本文讲的是Kubernetes之Pod调度【编者的话】Kubernetes调度器根据特定的算法与策略将pod调度到工作节点上。在默认情况下,Kubernetes调度器可以满足绝大多数需求,例如调度pod到资源充足的节点上运行,或调度pod分散到不同节点使集群节点资源均衡等。
2897 0
|
4月前
|
资源调度 Kubernetes 调度
从单集群到多集群的快速无损转型:ACK One 多集群应用分发
ACK One 的多集群应用分发,可以最小成本地结合您已有的单集群 CD 系统,无需对原先应用资源 YAML 进行修改,即可快速构建成多集群的 CD 系统,并同时获得强大的多集群资源调度和分发的能力。
154 9

推荐镜像

更多