k8s-容器内获取Pod信息和资源限制

前言:
从容器内获取容器的IP/端口/namespace等信息,以及k8s对容器的内存/CPU等资源限制的值。

1. 获取pod信息

说明:容器中获取pod的所有信息,先看一个简单示例,然后我们说明怎么获取其他信息。

1.1 一个简单示例

说明:定义一些变量,以获取POD状态信息(如节点名/容器名/namespace等)

  • yml文件如下
apiVersion: v1
kind: Pod
metadata:
  name: busybox-infor
  namespace: test
spec:
  containers:
  - name: busybox-infor
    image:  harbocto.boe.com.cn/public/nginx
    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
    ports:
    - containerPort: 80
  • 结果测试
    用上边的yml文件启动容器(略)之后,进入容器,并打印yml文件中定义的变量,可以看见容器的信息被以变量形式传入容器。
[root@DoM01 test]# kubectl exec -it -n test busybox-infor bash
root@busybox-infor:/# echo ${MY_NODE_NAME}
don03
root@busybox-infor:/# echo ${MY_POD_NAME}
busybox-infor
root@busybox-infor:/# echo ${MY_POD_NAMESPACE}
test
root@busybox-infor:/# echo ${MY_POD_IP}
10.244.5.20
root@busybox-infor:/# echo ${MY_POD_SERVICE_ACCOUNT}
default

1.2 可以获取那些信息

上边通过k8s提供的这些接口看到的信息,实际上我们用edit 查看pod信息时都可以看到。

从示例中我们可以看到变量的valueFrom都是诸如: metadata.namespace, spec.nodeName, metadata.name …… 很容易猜到,这和我们使用edit pod 看到的信息应该是一致的。所以我们可以用变量取到这里的所有信息。

  • 我们验证一下,执行如下命令:
[root@DoM01 test]# kubectl edit -n test pod busybox-infor

可以查找到刚才的信息,如我们可以看到 namespace的key如下:

在这里插入图片描述

而我们刚才定义变量获取值的位置是:

metadata.namespace

这是一致的。如此我们可以定义你查到的pod的任意信息了。

2. 获取容器资源限制

说明:此处获取的是k8s对容器的资源限制,区别前边的容器信息。当然我们通过edit也是可以看到的。

  • 创建podinfo.yml文件如下:
apiVersion: v1
kind: Pod
metadata:
  name: busybox-infor
  namespace: test
spec:
  containers:
  - name: busybox-infor
    image:  harbocto.boe.com.cn/public/nginx
    env:
      - name: MY_CPU_REQUEST
        valueFrom:
          resourceFieldRef:
            resource: requests.cpu
      - name: MY_CPU_LIMIT
        valueFrom:
          resourceFieldRef:
            resource: limits.cpu
      - name: MY_MEM_REQUEST
        valueFrom:
          resourceFieldRef:
            resource: requests.memory
      - name: MY_MEM_LIMIT
        valueFrom:
          resourceFieldRef:
            resource: limits.memory
    resources:
      requests:
        cpu: "250m"
        memory: "64Mi"
      limits:
        cpu: "4000m"
        memory: "8Gi"
  • 启动容器
[root@DoM01 test]# kubectl create -f podinfo.yml
pod/pod-infor created
[root@DoM01 test]# kubectl get pod -n test
NAME             READY   STATUS    RESTARTS   AGE
pod-infor        1/1     Running   0          5s
  • 验证
    进入容器,打印刚才的变量如下:
[root@DoM01 test]# kubectl exec -it -n test busybox-infor bash
root@busybox-infor:/# echo ${MY_MEM_LIMIT}
8589934592
root@busybox-infor:/# echo ${MY_MEM_REQUEST}
67108864

如上,变量值和我们刚才设置的一样。如果没有设置,变量值为0


在这里插入图片描述

posted on 2021-08-15 21:44  运维开发玄德公  阅读(139)  评论(0编辑  收藏  举报  来源

导航