Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >23-Kubernetes扩展学习实践笔记

23-Kubernetes扩展学习实践笔记

作者头像
全栈工程师修炼指南
发布于 2022-12-30 07:55:30
发布于 2022-12-30 07:55:30
63100
代码可运行
举报
运行总次数: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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
020.掌握Pod-Pod基础使用
Pod可以由1个或多个容器组合而成,通常对于紧耦合的两个应用,应该组合成一个整体对外提供服务,则应该将这两个打包为一个pod。
木二
2019/11/21
7280
在容器中获取配置及上下文信息 -- Projected Volumes
在实际的线上场景中,我们并不能在配置 Pod 的 yaml 里描述所有需要的信息,因为总有一些信息或因为其保密性,或因为其动态变化性,是不能够放在配置文件里的,那么,这类信息要怎么加入到我们的 Pod 配置体系中呢?
用户3147702
2022/06/27
1.2K0
在容器内获取 Pod 信息
注意:env 不直接设置 value,而是使用 valueFrom 对 Pod 的元数据进行引用
看、未来
2022/09/27
1.1K0
【重识云原生】第六章容器6.4.2.2节——Pod使用(上)
        通过 yaml 或 json 描述 Pod 和其内容器的运行环境以及期望状态,比如一个最简单的 nginx pod 可以定义为:
江中散人_Jun
2022/10/04
6230
【重识云原生】第六章容器6.4.2.2节——Pod使用(上)
k8s Pod 环境变量和配置注入
指定了items将会只创建指定的配置文件,如果不指定items,将会configMap中所有的配置项都分别创建配置文件。
前Thoughtworks-杨焱
2021/12/07
5.3K0
Metadata获取的三种方式
这些信息都可以通过kubectl命令获取,但是有的情况下,我们需要从应用内获取,例如获取当前Pod的地址、主机名等一些信息,这就要求我们必须知道如何在应用内获取Pod的metadata,本文介绍三种应用内获取Pod的metadata的方式,供大家参考。
大江小浪
2018/12/06
2.1K0
Metadata获取的三种方式
kubernetes - kubeadm
首先Kubernetes首字母为K,末尾为s,中间一共有8个字母,所以简称K8s。
断痕
2021/01/21
4580
kubernetes - kubeadm
k8s如何访问 pod 元数据
我们在 pod 中运行容器的时候,是否也会有想要获取当前 pod 的环境信息呢?咱们写的 yaml 清单写的很简单,实际上部署之后, k8s 会给我们补充在 yaml 清单中没有写的字段,那么我们的 pod 环境信息和容器的元数据如何传递到容器中呢?是不是也是通过获取这些 k8s 默认给我填写的字段呢?
阿兵云原生
2023/09/01
4130
k8s如何访问 pod 元数据
Kubernetes 策略管理引擎 - Kyverno
Kyverno 是来自 Nirmata 的开源项目,后来捐赠给了 CNCF。Kyverno 是一个具有验证和变异能力的 Kubernetes 策略引擎,但是它还有生成资源的功能,还加入了 API 对象查询的能力。Kyverno 原本就是为 Kubernetes 编写的,除了对象生成功能之外,无需专用语言即可编写策略。
我是阳明
2024/04/19
5820
Kubernetes 策略管理引擎 - Kyverno
深入理解Pod(二)
将应用所需的配置信息与程序进行分离,可以使应用程序更好的被复用,通过不同的配置实现更灵活的功能。如果将应用打包成镜像,再用环境变量或者外挂文件的方式挂载配置,在大型容器集群中会变得异常繁琐,所以出现了统一的配置管理:ConfigMap
Liusy
2020/10/23
7220
深入理解Pod(二)
Kubernetes 部署 Compute storage coupled 模式 Doris 高可用集群实战指南
今天分享的主题是:如何在 k8s 集群上部署 Compute storage coupled(存算耦合) 模式的 Doris 高可用集群?
运维有术
2024/12/02
2500
Kubernetes 部署 Compute storage coupled 模式 Doris 高可用集群实战指南
如何在K8s上设置生产级的EFK?(上)
在Kubernetes集群上运行多个服务和应用程序时,统一的日志收集不可或缺,Elasticsearch、Filebeat和Kibana(EFK)堆栈是目前较受欢迎的日志收集解决方案。在本教程中,我们将为部署在集群中的应用和集群本身设置生产级Kubernetes日志记录。将使用Elasticsearch作为日志后端,同时Elasticsearch的设置将具有极高的可扩展性和容错性。本教程一共有两篇,这是第一篇。
CNCF
2020/09/22
3K0
如何在K8s上设置生产级的EFK?(上)
Kubernetes 1.20.5搭建nacos
后端小伙伴们准备搞pvp对战服务。配置中心选型选择了阿里云的nacos服务。参照https://nacos.io/zh-cn/docs。由于业务规划都在kubernetes集群上,就简单参照https://nacos.io/zh-cn/docs/use-nacos-with-kubernetes.html做了一个demo让他们先玩一下。
对你无可奈何
2021/04/12
1.7K0
Kubernetes 部署 Compute storage coupled 模式 Doris 高可用集群实战指南
今天分享的主题是:如何在 k8s 集群上部署 Compute storage coupled(存算耦合) 模式的 Doris 高可用集群?
运维有术
2024/11/29
3630
Kubernetes 部署 Compute storage coupled 模式 Doris 高可用集群实战指南
k8s env、configmap、secret外部数据加载配置
K8s提供了多种外部数据注入容器的方式,今天我们主要学习环境变量、ConfigMap以及Secret的使用和配置。
你大哥
2022/01/10
2K0
k8s env、configmap、secret外部数据加载配置
.Net微服务实战之Kubernetes的搭建与使用
  说到微服务就得扯到自动化运维,然后别人就不得不问你用没用上K8S。K8S的门槛比Docker Compose、Docker Swarm高了不少,无论是概念上还是在实施搭建时。我自己也经过了多次的实践,整理出一套顺利部署的流程。
陈珙
2020/08/12
9770
.Net微服务实战之Kubernetes的搭建与使用
kubernetes安装及集群搭建
环境准备 为了修改文件传输文件的方便,将主机名更改为安装环境所述的node,并写入hosts文件
互联网-小阿宇
2022/11/21
5320
kubernetes安装及集群搭建
mac 上学习k8s系列(31)istio part I
Istio 提供一种简单的方式来为已部署的服务建立网络, Istio 使用 Envoy 代理的扩展版本, Envoy 被部署为 sidecar,和对应服务在同一个 Kubernetes pod 中。下面我们开始在mac m1环境搭建istio。
golangLeetcode
2022/08/02
3060
Kubernetes | 存储 - Storage
ConfigMap 功能在 Kubernetes1.2 版本中引入,许多应用程序会从配置文件、命令行参数或环境变量中读取配置信息。ConfigMap API 给我们提供了向容器中注入配置信息的机制,ConfigMap 可以被用来保存单个属性,也可以用来保存整个配置文件或者 JSON 二进制大对象。
Zkeq
2023/05/13
1K0
Kubernetes | 存储 - Storage
kubernetes学习记录(12)——Ingress(demo为TCP的负载均衡)
胡了了
2017/12/28
2.4K0
kubernetes学习记录(12)——Ingress(demo为TCP的负载均衡)
相关推荐
020.掌握Pod-Pod基础使用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验