前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >23-Kubernetes扩展学习实践笔记

23-Kubernetes扩展学习实践笔记

作者头像
全栈工程师修炼指南
发布于 2022-12-30 07:55:30
发布于 2022-12-30 07:55:30
60800
代码可运行
举报
运行总次数:0
代码可运行

[TOC]

0x00 如何将K8S中源数据通过环境变量注入到容器?

描述: Kubernetes 自从1.7开始,可以在 pod 的container 内获取pod的spec,metadata 等源数据信息,实际上是使用 downward API 通过环境变量把自身的信息呈现给 Pod 中运行的容器

pod一共有三种类型容器 • Infrastructure Container:基础容器 • 维护整个Pod网络空间 • InitContainers:初始化容器 • 先于业务容器开始执行 • Containers:业务容器 • 并行启动

需求: 假如你有一个根据主机名词尾缀进行选择要使用GPU资源序号,或者是获取资源控制器生成的Pod相关IP或标签信息,此时都可以使用注入环境变量的方式(希望对大家有帮助)

目标:通过使用 env 和 fieldRef,将 k8s 的源数据和容器字段变成环境变量注入到了容器中。

当前资源控制器env对象 (valueFrom.fieldRef.fieldPath) 支持的注入字段信息如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Pod 名称(主机名称)
metadata.name
# 名称空间
metadata.namespace
# 标签
metadata.labels['']
# 注释
metadata.annotations['']
# 节点名词
spec.nodeName
# 服务账户名词
spec.serviceAccountName
# 宿主机IP地址信息
status.hostIP
# Pod IPV4地址信息
status.podIP
# 获取 Pod 的 IPv4 和 IPv6 地址
status.podIPs

示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: v1
kind: Pod
metadata:
  name: dapi-envars-fieldref
  namespace: devtest
  labels:
    app: downwardAPI
  annotations:
    demo: dapi-envars
spec:
  containers:
    - name: test-container
      image: busybox:latest
      command: [ "sh", "-c"]
      args:
      - while true; do
          echo -en '\n';
          printenv MY_NODE_NAME MY_POD_NAME MY_POD_NAMESPACE;
          printenv MY_POD_IP MY_POD_IPS MY_POD_SERVICE_ACCOUNT;
          printenv MY_POD_LABELS_APP MY_POD_ANNOTATIONS_DEMO;
          printenv MY_CPU_REQUEST MY_CPU_LIMIT;
          printenv MY_MEM_REQUEST MY_MEM_LIMIT;
          sleep 10;
        done;
      resources:
        requests:
          memory: "32Mi"
          cpu: "125m"
        limits:
          memory: "64Mi"
          cpu: "250m"
      env:
        - name: NODE_NAME
          valueFrom:
            fieldRef:
              fieldPath: spec.nodeName
        - name: MY_NODE_NAME
          valueFrom:
            fieldRef:
              fieldPath: spec.nodeName
       - name: HOST_IP
          valueFrom:
            fieldRef:
              fieldPath: status.hostIP
        - 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_IPS
          valueFrom:
            fieldRef:
              fieldPath: status.podIPs
        - name: MY_POD_SERVICE_ACCOUNT
          valueFrom:
            fieldRef:
              fieldPath: spec.serviceAccountName
        - name: MY_POD_LABELS_APP
          valueFrom:
            fieldRef:
              fieldPath: metadata.labels['app']
        - name: MY_POD_ANNOTATIONS_DEMO
          valueFrom:
            fieldRef:
              fieldPath: metadata.annotations['demo']
        - 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

运行Pod后查看注入的环境变量:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
~$ kubectl apply -f test-container.yaml
pod/dapi-envars-fieldref created

~$ kubectl logs -n devtest dapi-envars-fieldref
dapi-envars-fieldref
devtest
10.66.182.247
10.66.182.247
default
downwardAPI
dapi-envars
1
1
33554432
67108864

~$ kubectl exec -n devtest dapi-envars-fieldref -- printenv
HOSTNAME=dapi-envars-fieldref
MY_MEM_REQUEST=33554432
HOST_IP=192.168.12.226
MY_POD_NAME=dapi-envars-fieldref
MY_POD_NAMESPACE=devtest
MY_POD_IP=10.66.182.247
MY_POD_IPS=10.66.182.247
MY_POD_SERVICE_ACCOUNT=default
MY_POD_ANNOTATIONS_DEMO=dapi-envars
NODE_NAME=weiyigeek-226
MY_POD_LABELS_APP=downwardAPI
MY_CPU_REQUEST=1
MY_CPU_LIMIT=1
MY_MEM_LIMIT=67108864
....

实践示例: 根据Pod名称截取最后一个-字符后的数字来选择该Pod调用的GPU序号(即使用那一块gpu)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: v1
kind: Service
metadata:
  name: healthcode
  namespace: devtest
  labels:
    app: healthcode
    use: gpu
  annotations:
    author: weiyigeek
    blog: blog.weiyigeek.top
spec:
  type: NodePort
  ports:
    - name: http
      port: 8000
      targetPort: 8000
      protocol: TCP
      nodePort: 30000
  selector:
    app: healthcode
    use: gpu
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: healthcode-0
  namespace: devtest
  labels:
    app: healthcode
spec:
  replicas: 6
  selector:
    matchLabels:
      app: healthcode
      use: gpu
  serviceName: "healthcode"
  template:
    metadata:
      labels:
        app: healthcode
        use: gpu
    spec:
      volumes:
      - name: workdir
        emptyDir: {}
      - name: workspace
        hostPath:
          path: /storage/webapp/project/MultiTravelcodeocr
          type: DirectoryOrCreate
      - name: model
        hostPath:
          path: /storage/webapp/project/.EasyOCR
          type: DirectoryOrCreate
      - name: img
        hostPath:
          path: /storage/webapp/project/upfile
          type: DirectoryOrCreate
      initContainers:
      - name: init  # 使用初始化容器进行相应处理
        image: busybox:1.35.0
        imagePullPolicy: IfNotPresent
        command:  # 设置 Pod 使用的 GPU 显卡序号
        - /bin/sh
        - -c
        - "echo export CUDA_VISIBLE_DEVICES=${GPU_DEVICES##*-}> /app/${GPU_DEVICES}"
        env:
        - name: GPU_DEVICES
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        # - name: CUDA_VISIBLE_DEVICES    # 此种方式不行,env不能直接截取变量
        #   value: ${GPU_DEVICES##*-}
        volumeMounts:
        - name: workdir
          mountPath: /app/
      containers:
        - name: app
          image: harbor.weiyigeek.top/python/easyocr-healthcode:v1.6.2
          command: ['/bin/bash', '-c','source /app/${HOSTNAME}; echo ${CUDA_VISIBLE_DEVICES}; python ./setup.py --imgdir=/imgs --logdir=
/logs --gpu=True'] # 加载进行环境变量之中,实际上我们也可以在app容器直接在source命令前echo export CUDA_VISIBLE_DEVICES=${HOSTNAME##*-}> /app/${HOSTNAME}使用搞定,总之条条大路通罗马,学习就是思路。
          imagePullPolicy: IfNotPresent
          resources:
            limits: {}
            #  cpu: "8"
            #  memory: 8Gi
          volumeMounts:
            - name: workdir
              mountPath: /app/
            - name: workspace
              mountPath: /workspace
            - name: model
              mountPath: /root/.EasyOCR
            - name: img
              mountPath: /imgs
          ports:
            - name: http
              protocol: TCP
              containerPort: 8000

执行结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 一个6个pod,每个pod使用对应的GPU,例如0-0则使用0CPU0-1则使用1CPU 
$ kubectl get pod -n devtest
NAME             READY   STATUS    RESTARTS   AGE
healthcode-0-5   1/1     Running   0          15h 
healthcode-0-4   1/1     Running   0          15h
healthcode-0-3   1/1     Running   0          15h
healthcode-0-2   1/1     Running   0          15h
healthcode-0-1   1/1     Running   0          15h
healthcode-0-0   1/1     Running   0          15h

# 查看 GPU 服务器使用情况
$ nvidia-smi
Fri Dec  9 10:08:32 2022
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 465.19.01    Driver Version: 465.19.01    CUDA Version: 11.3     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  NVIDIA Tesla V1...  Off  | 00000000:1B:00.0 Off |                    0 |
| N/A   41C    P0    36W / 250W |   6697MiB / 32510MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
|   1  NVIDIA Tesla V1...  Off  | 00000000:1D:00.0 Off |                    0 |
| N/A   51C    P0    53W / 250W |   9489MiB / 32510MiB |     14%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
|   2  NVIDIA Tesla V1...  Off  | 00000000:3D:00.0 Off |                    0 |
| N/A   53C    P0    42W / 250W |   5611MiB / 32510MiB |     20%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
|   3  NVIDIA Tesla V1...  Off  | 00000000:3F:00.0 Off |                    0 |
| N/A   37C    P0    35W / 250W |  10555MiB / 32510MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
|   4  NVIDIA Tesla V1...  Off  | 00000000:40:00.0 Off |                    0 |
| N/A   45C    P0    51W / 250W |   5837MiB / 32510MiB |      5%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
|   5  NVIDIA Tesla V1...  Off  | 00000000:41:00.0 Off |                    0 |
| N/A   37C    P0    37W / 250W |  10483MiB / 32510MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    0   N/A  N/A    167660      C   python                           6693MiB |
|    1   N/A  N/A    166790      C   python                           9485MiB |
|    2   N/A  N/A    165941      C   python                           5607MiB |
|    3   N/A  N/A    165032      C   python                          10551MiB |
|    4   N/A  N/A    164226      C   python                           5833MiB |
|    5   N/A  N/A    163344      C   python                          10479MiB |
+-----------------------------------------------------------------------------+

参考文章:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-12-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Metadata获取的三种方式
这些信息都可以通过kubectl命令获取,但是有的情况下,我们需要从应用内获取,例如获取当前Pod的地址、主机名等一些信息,这就要求我们必须知道如何在应用内获取Pod的metadata,本文介绍三种应用内获取Pod的metadata的方式,供大家参考。
大江小浪
2018/12/06
2.1K0
Metadata获取的三种方式
k8s Pod 环境变量和配置注入
指定了items将会只创建指定的配置文件,如果不指定items,将会configMap中所有的配置项都分别创建配置文件。
前Thoughtworks-杨焱
2021/12/07
5.2K0
深入理解Pod(二)
将应用所需的配置信息与程序进行分离,可以使应用程序更好的被复用,通过不同的配置实现更灵活的功能。如果将应用打包成镜像,再用环境变量或者外挂文件的方式挂载配置,在大型容器集群中会变得异常繁琐,所以出现了统一的配置管理:ConfigMap
Liusy
2020/10/23
6860
深入理解Pod(二)
kubernetes - kubeadm
首先Kubernetes首字母为K,末尾为s,中间一共有8个字母,所以简称K8s。
断痕
2021/01/21
4330
kubernetes - kubeadm
020.掌握Pod-Pod基础使用
Pod可以由1个或多个容器组合而成,通常对于紧耦合的两个应用,应该组合成一个整体对外提供服务,则应该将这两个打包为一个pod。
木二
2019/11/21
6850
一文学会 Kubernetes 之 ConfigMap
我们知道,在几乎所有的应用开发中,都会涉及到配置文件的变更,比如说在web的程序中,需要连接数据库,缓存甚至是队列等等。而我们的一个应用程序从写第一行代码开始,要经历开发环境、测试环境、预发布环境只到最终的线上环境。而每一个环境都要定义其独立的各种配置。如果我们不能很好的管理这些配置文件,你的运维工作将顿时变的无比的繁琐。为此业内的一些大公司专门开发了自己的一套配置管理中心,如360的Qcon,百度的disconf等。kubernetes也提供了自己的一套方案,即ConfigMap。kubernetes通过ConfigMap来实现对容器中应用的配置管理。
kubernetes中文社区
2019/06/24
7760
k8s env、configmap、secret外部数据加载配置
K8s提供了多种外部数据注入容器的方式,今天我们主要学习环境变量、ConfigMap以及Secret的使用和配置。
你大哥
2022/01/10
1.9K0
k8s env、configmap、secret外部数据加载配置
kubernetes学习记录(12)——Ingress(demo为TCP的负载均衡)
胡了了
2017/12/28
2.4K0
kubernetes学习记录(12)——Ingress(demo为TCP的负载均衡)
k8s如何访问 pod 元数据
我们在 pod 中运行容器的时候,是否也会有想要获取当前 pod 的环境信息呢?咱们写的 yaml 清单写的很简单,实际上部署之后, k8s 会给我们补充在 yaml 清单中没有写的字段,那么我们的 pod 环境信息和容器的元数据如何传递到容器中呢?是不是也是通过获取这些 k8s 默认给我填写的字段呢?
阿兵云原生
2023/09/01
3800
k8s如何访问 pod 元数据
K8S集群模式下fluent-bit日志收集方案设计和实践
「随着 K8s 不断更新迭代,使用 K8s 日志系统建设的开发者,逐渐遇到了各种复杂的问题和挑战。本篇文章中结合作者使用经验,分析和设计 K8s 日志收集实践过程。」
用户5166556
2020/06/07
3.7K0
Kubernetes Dynamic Volume Provisioning - NFS Provisioner
场景:在 非 Master 节点 添加了 1T 的磁盘,挂载到 /mnt 路径,然后实现在此存储上动态创建 PVC。
轻量级云原生架构实验室
2018/08/02
6680
Kubernetes Dynamic Volume Provisioning - NFS Provisioner
kubernetes教程入门_centos7搭建k8s集群
kubernetes本质是一组服务器集群,可以在集群的每个节点上运行特定的程序,来对节点中的容器进行管理。
全栈程序员站长
2022/09/22
1.6K0
kubernetes教程入门_centos7搭建k8s集群
研发工程师玩转Kubernetes——emptyDir
kubernets可以通过emptyDir实现在同一Pod的不同容器间共享文件系统。
方亮
2023/08/09
2630
研发工程师玩转Kubernetes——emptyDir
K8s版本V1.18.0单节点Master部署
–apiserver-advertise-address:通告侦听地址 –image-repository:指定镜像地址使用阿里云的,默认会使用谷歌镜像 –kubernetes-version:指定当前的kubernetes的版本 –pod-network-cidr=10.244.0.0/16:flannel网络的固定地址范围
互联网-小阿宇
2022/11/21
3880
k8s 学习(1)——CentOS 系统搭建 k8s 环境
最近准备系统地学习一下 k8s,所以第一件事就是搭建环境,本篇文章就来记录一下自己在 CentOS 系统上搭建 k8s 环境的经历。
Hopetree
2022/09/26
1.2K0
Kubernetes集群中使用ingress发布服务
当我们将kubernetes的应用部署完之后,就需要对外发布服务的访问地址。kubernetes 将服务发布到外部访问的方式主要有: LoadBlancer Service NodePort Service Ingress
星哥玩云
2022/07/13
5990
Kubernetes集群中使用ingress发布服务
kubernetes集群搭建(9):docker 镜像的导入与导出
由于K8s搭建时官方提供的镜像不FQ是访问不了的,所以搭建过程中很多时间都耗费在去找镜像去了
肖哥哥
2018/08/02
2.7K0
kubernetes集群搭建(9):docker 镜像的导入与导出
在容器内获取 Pod 信息
注意:env 不直接设置 value,而是使用 valueFrom 对 Pod 的元数据进行引用
看、未来
2022/09/27
9850
Prometheus监控神器-Kubernetes篇(一)
本篇使用StorageClass来持久化数据,搭建Statefulset的Prometheus联邦集群,对于数据持久化,方案众多,如Thanos、M3DB、InfluxDB、VictorMetric等,根据自己的需求进行选择,后面会详细讲解针对数据持久化的具体细节。
Kubernetes技术栈
2020/09/09
2.1K0
Kubernetes 策略管理引擎 - Kyverno
Kyverno 是来自 Nirmata 的开源项目,后来捐赠给了 CNCF。Kyverno 是一个具有验证和变异能力的 Kubernetes 策略引擎,但是它还有生成资源的功能,还加入了 API 对象查询的能力。Kyverno 原本就是为 Kubernetes 编写的,除了对象生成功能之外,无需专用语言即可编写策略。
我是阳明
2024/04/19
4710
Kubernetes 策略管理引擎 - Kyverno
相关推荐
Metadata获取的三种方式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验