首页 > 其他分享 >从应用访问Pod元数据-DownwardApi的应用

从应用访问Pod元数据-DownwardApi的应用

时间:2022-09-25 22:45:44浏览次数:52  
标签:容器 name float64 443 cpu 应用 Pod DownwardApi pod

对于某些需要调度之后才能知道的数据,比如 pod 的 ip,主机名,或者 pod 自身的名称等等,k8s 依旧很贴心的提供了 Downward API 的方式来获取此类数据,并且可以通过环境变量或者文件(downwardApi卷中)来传递 pod 的元数据。

可以传递的容器数据包括如下:

  • pod的名称,IP,所在命名空间,运行节点的名称,运行所归属的服务账户名称
  • 每个容器请求的 CPU 和内存的使用量
  • 每个容器可以使用的 CPU 和内存的限制
  • pod 的标签
  • pod 的注解

 

通过环境变量暴露元数据

  创建一个但容器的 pod

$ vim ./dowanwardapi-learn.yaml

apiVersion: v1
kind: Pod
metadata:
  name: downward-learn
spec:
  containers:
  - name: main
    image: busybox
    command: ["sleep", "999999"]
    resources:
      requests:
        cpu: "15m"
        memory: "100Ki"
      limits:
        cpu: "100m"
        memory: "4Mi"
    env:
    - name: POD_NAME
      valueFrom:
        fieldRef:
          fieldPath: metadata.name
    - name: POD_IP
      valueFrom:
        fieldRef:
          fieldPath: status.podIP
    - name: NODE_NAME
      valueFrom:
        fieldRef:
          fieldPath: spec.nodeName
    - name: CONTAINER_CPU_REQUEST_MILLICORES
      valueFrom:
        resourceFieldRef:
          resource: requests.cpu
          divisor: "1m"
    - name: CONTAINER_MEMORY_LIMIT_KIBIBYTES
      valueFrom:
        resourceFieldRef:
          resource: limits.memory
          divisor: "1Ki"

  创建完成后我们可以使用 kubectl exec 命令来查看容器中的所有环境变量,如下:

$ kubectl exec downward-learn env
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl kubectl exec [POD] -- [COMMAND] instead.
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=downward-learn
POD_NAME=downward-learn
POD_IP=10.44.0.3
NODE_NAME=node1
CONTAINER_CPU_REQUEST_MILLICORES=15
CONTAINER_MEMORY_LIMIT_KIBIBYTES=4096
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
KUBERNETES_SERVICE_HOST=10.96.0.1
KUBERNETES_SERVICE_PORT=443
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
HOME=/root

  但是有一些变量并不能根据环境变量暴露,比如 lables 标签和 annotations 注释等等,但是这些可以使用过 dowanwardApi 卷的方式来进行载入。

 

通过 downwardAPI 卷来传递元数据

  和环境变量一样,通过文件卷的方式也需要显式指定元数据字段来暴露给进程,如下:

apiVersion: v1
kind: Pod
metadata:
  name: downward-learn
spec:
  containers:
  - name: main
    image: busybox
    command: ["sleep", "999999"]
    resources:
      requests:
        cpu: "15m"
        memory: "100Ki"
      limits:
        cpu: "100m"
        memory: "4Mi"
    volumeMounts:
    - name: downward
      mountPath: /etc/downard
  volumes:
  - name: downward
    downwardAPI:
      iterms:
      - path: "podName"
        fileRef:
          fieldPath: metadata.name
......    

  其中声明元数据和配置的方式没什么不同。

  但是其中需要注意的是,如果是暴露容器级的元数据时,比如容器可使用的资源限制和资源请求(如使用字段 resourceFieldRef),必须指定引入资源字段的容器名称,比如:

spec:
  volumes:
  - name: downward
    downwardAPI:
      items:
      - path: "containerCpuRequestMilliCores"
        resourceFieldRef: 
          containerName: main      ## 容器名称
          resource: requests.cpu
          divisor: 1m

  这里由于引入了cpu资源限制,所以也贴一下所用到的,在 pod 内查询当前的 cpu 使用进程代码,因为 pod 容器内的查询 cpu 使用和物理机上的还不太一样,在网上找了一些但是都不太适合容器使用,所以自己写了一个

$ vim cpu.go

package handler import ( "fmt" "os" linuxproc "github.com/c9s/goprocinfo/linux" ) var ( prevUsageUser int64 = 0 prevUsageSystem int64 = 0 cpuNum = 1 // 设置该容器内使用的cpu个数 ) func GetCpuCount(stat *linuxproc.Stat) (count float64) { cfsQuota := getCgoupValueByPath("/sys/fs/cgroup/cpu/cpu.cfs_quota_us") cfsPeriod := getCgoupValueByPath("/sys/fs/cgroup/cpu/cpu.cfs_period_us") if cfsQuota == -1 { return float64(len(stat.CPUStats)) } return float64(cfsQuota) / float64(cfsPeriod) } func CpuCountToString(c float64) string { if c == float64(int64(c)) { return fmt.Sprintf("%v", c) } return fmt.Sprintf("%0.1f", c) } // GetCpuUsage should be called every 1 seconds. not quite precise. func GetCpuUsage(cpus float64) (user, system, idle float64) { var currentUsageUser, currentUsageSystem int64 currentUsageUser = getCgoupValueByPath("/sys/fs/cgroup/cpuacct/cpuacct.usage_user") currentUsageSystem = getCgoupValueByPath("/sys/fs/cgroup/cpuacct/cpuacct.usage_sys") if prevUsageUser == 0 && prevUsageSystem == 0 { prevUsageUser = currentUsageUser prevUsageSystem = currentUsageSystem return } user = float64(currentUsageUser-prevUsageUser) / 10000000 / cpus // / 1000,000,000 * 100 = /10,000,000 system = float64(currentUsageSystem-prevUsageSystem) / 10000000 / cpus // / 1000,000,000 * 100 = /10,000,000 idle = 100 - user - system if idle < 0 { idle = 0 } prevUsageUser = currentUsageUser prevUsageSystem = currentUsageSystem return } func getCgoupValueByPath(path string) int64 { data, err := os.ReadFile(path) if err != nil { return 0 } var value int64 n, err := fmt.Sscanf(string(data), "%d", &value) if err != nil || n != 1 { return 0 } return value }

计算出来当前的容器数值换算为:use 80% = 800

这样在容器内就能根据元数据和监控脚本时刻监控容器的 cpu 使用率了。

标签:容器,name,float64,443,cpu,应用,Pod,DownwardApi,pod
From: https://www.cnblogs.com/blackbinbin/p/16686167.html

相关文章

  • UKF和EKF算法在非线性系统中的应用比较
    参考内容:书籍《卡尔曼滤波原理及应用------matlab仿真》这本书对kalman算法的解析很清晰,MATLAB程序很全,适合初学者(如有侵权,请联系删除(qq:1491967912))之前学习了EKF算法和......
  • Request应用
    Request请求一般Request和Response都是对应的简单的一个demo:输出前端请求过来的数据值得注意的是请求转发:req.getRequestDispatcher()请求不需要ApplicationContext/应......
  • 我在 Flutter 应用中使用 Bloc 的方式
    我在Flutter应用中使用Bloc的方式Flutter世界中的每个人(几乎)都知道集团状态管理库。但并不是每个人都知道何时(或如何)使用它。我也是。这篇文章只是我对事物的看......
  • 阿里巴巴-《码出高效》-任务队列实际应用
    Java项目开发中处理一些复杂的计算任务时,很多时候不使用同步的处理方式,而是使用异步多线程的方式来进行处理,并且会使用到Java中的任务队列。本篇文章就来讲讲任务队列......
  • 2022/9/25GUI输入对话框的应用
    在java语言中,除了从控制台获取输入之外,还可以通过调用JOptionPane.showInputDialog方法从一个输入对话框中获取输入,JOptionPane放在java预定义(无需再编写,可以重复使用)的类j......
  • 应用Lombok 插件--提高使用 POJO 类的效率
    不评价使用Lombok的好坏什么是Lombok?lombok⼀个优秀的Java代码库,简化了Java的编码,为Java代码的精简提供了⼀种⽅式可以自动生成JavaBean的getter,setter,equal......
  • 【代码片段】Qt6.2.4 C++ 退出应用程序方式
    转载https://blog.csdn.net/kidults/article/details/78549336正文触发析构函数方式//这种方式不会触发析构函数QApplication::exit(0);不触发析构函数方式(直接......
  • 基于外部prometheus监控k8s 集群及k8s应用服务
    一、在k8s集群外部准备一个Prometheus监控系统搭建部署可参考:https://www.cnblogs.com/cyh00001/p/16701266.html二、创建用户并授权catcase4-prom-rbac.yamlapiVers......
  • 报告分享|2022年移动应用运营增长洞察白皮书
    报告链接:http://tecdat.cn/?p=28649通过展现国内移动运营增长的现状、环境和广告投放趋势,分析和探讨移动应用的运营思路变化和相关的运营服务革新,为运营人员提供最新市场......
  • [Jetpack Compose] 使用 Snackbar 实现退出应用再确认功能
    @OptIn(ExperimentalMaterial3Api::class)@ComposablefunDemoFun(){varscope=rememberCoroutineScope()varsnackbarHostState=remember{SnackbarHos......