研发工程师玩转Kubernetes——使用环境变量给容器中程序传递参数

news2025/2/25 4:12:07

在《研发工程师玩转Kubernetes——构建、推送自定义镜像》中,Pod的IP是通过代码获取的

def get_ip():
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        s.connect(('8.8.8.8', 80))
        ip = s.getsockname()[0]
    finally:
        s.close()
        return ip

实际我们可以在清单文件中,通过环境变量将该值传递给容器中的程序。

让程序接受环境变量

我们对程序进行相关改造

from http.server import HTTPServer, BaseHTTPRequestHandler
import argparse
import os
 
version = 0

class Resquest(BaseHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200)
        self.send_header('Content-type', 'application/json')
        self.end_headers()
        data = "This service's version is {0}\nIP is:{1}".format(version, os.environ.get("POD_IP", ""))
        self.wfile.write(data.encode())
 
if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Process some integers.')
    parser.add_argument('-port', metavar='N', type=int, help='port of service', required=True)
    parser.add_argument('-version', metavar='N', type=int, help='version of service', required=True)
    args = parser.parse_args()
    version = args.version
    host = ('0.0.0.0', args.port)
    server = HTTPServer(host, Resquest)
    print("Starting server, listen at: {0}:{1}".format(os.environ.get("POD_IP", ""), args.port))
    server.serve_forever()

IP是通过os.environ.get(“POD_IP”, “”)获取。
在这里插入图片描述
为了充分展现kubernetes的功能,我们还对Dockerfile做了修改,删除了镜像自动执行命令的指令。这样镜像仅仅是环境,不涉及任何运行操作。
在这里插入图片描述

生成并推送镜像

这些环境准备好后,我们生成镜像并推送

docker build -t simple_http:v3 .
Sending build context to Docker daemon  16.25MB
Step 1/5 : From python:3.11
 ---> 815c8c75dfc0
Step 2/5 : RUN pip install --upgrade pip
 ---> Using cache
 ---> e26af84d8b3e
Step 3/5 : COPY requirements.txt /requirements.txt
 ---> Using cache
 ---> 9e14379efd70
Step 4/5 : RUN pip install -r /requirements.txt
 ---> Using cache
 ---> 964f97edf3b5
Step 5/5 : COPY main.py /main.py
 ---> f84ff4a7c50d
Successfully built f84ff4a7c50d
Successfully tagged simple_http:v3
docker tag simple_http:v3 localhost:32000/simple_http:v3
docker push localhost:32000/simple_http:v3
The push refers to repository [localhost:32000/simple_http]
e332834a526b: Pushed 
dff24bf5a998: Layer already exists 
288d113a8d9c: Layer already exists 
91d4152a99e8: Layer already exists 
889828f94722: Layer already exists 
b0f747a5176b: Layer already exists 
7dac77253a2b: Layer already exists 
0007505dc811: Layer already exists 
f43725f97b9f: Layer already exists 
9c42af2c6418: Layer already exists 
d96e248f10e6: Layer already exists 
d925e0fae4e6: Layer already exists 
v3: digest: sha256:b38b4baddca283822da1fe70276708a28a7e6fb807fb934e086be01d14da9626 size: 2841

部署

参考《研发工程师玩转Kubernetes——使用Deployment进行多副本维护》,我们使用Deployment部署镜像。
我们会对清单文件做响应修改:

  • 新增启动程序的命令command
  • 新增环境变量env
apiVersion: apps/v1
kind: Deployment
metadata:
  name: simple-http-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: simple_http
  template:
    metadata:
      labels:
        app: simple_http
    spec:
      containers:
      - name: simple-http-container
        image: localhost:32000/simple_http:v3
        ports:
        - containerPort: 8888
        command: ["python","main.py","-port","$(SERVER_PORT)","-version","3"]
        env:
        - name: SERVER_PORT
          value: "8888"
        - name: POD_IP
          valueFrom:
            fieldRef:
              fieldPath: status.podIP
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name

在这里插入图片描述
可以看到之前在Dockerfile中的启动程序指令被搬到清单文件中。
比较特殊的是参数中的port值,我们使用了env中的自定义的字段SERVER_PORT——在命令(command)中要使用$(SERVER_PORT)表达。

        - name: SERVER_PORT
          value: "8888"

env中还定义了一个字段POD_IP,它表示Deployment创建的Pod的IP。由于这个IP是在Pod创建后确定的,我们就需要使用status.podIP来表达它。

        - name: POD_IP
          valueFrom:
            fieldRef:
              fieldPath: status.podIP

然后我们使用下面命令创建该Deployment

kubectl create -f simple_http_deployment.yaml

deployment.apps/simple-http-deployment created

检查

使用kubectl describe pod来获取pod信息

Name:             simple-http-deployment-69579df7b8-zkjz7
Namespace:        default
Priority:         0
Service Account:  default
Node:             fangliang-virtual-machine/192.168.137.248
Start Time:       Wed, 24 May 2023 00:06:37 +0800
Labels:           app=simple_http
                  pod-template-hash=69579df7b8
Annotations:      cni.projectcalico.org/containerID: d103d97a8b9506fa4aa8b2172cf889f02874d02cb6cbe24dab1ee9c4f07dc2dd
                  cni.projectcalico.org/podIP: 10.1.62.179/32
                  cni.projectcalico.org/podIPs: 10.1.62.179/32
Status:           Running
IP:               10.1.62.179
IPs:
  IP:           10.1.62.179
Controlled By:  ReplicaSet/simple-http-deployment-69579df7b8
Containers:
  simple-http-container:
    Container ID:  containerd://a3d6a26a85a4e9476fa182fce0b350a4f6893cdd63b4b9f72e293b95a0d336c9
    Image:         localhost:32000/simple_http:v3
    Image ID:      localhost:32000/simple_http@sha256:b38b4baddca283822da1fe70276708a28a7e6fb807fb934e086be01d14da9626
    Port:          8888/TCP
    Host Port:     0/TCP
    Command:
      python
      main.py
      -port
      $(SERVER_PORT)
      -version
      3
    State:          Running
      Started:      Wed, 24 May 2023 00:06:38 +0800
    Ready:          True
    Restart Count:  0
    Environment:
      SERVER_PORT:               8888
      POD_IP:                     (v1:status.podIP)
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-7sq6n (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  kube-api-access-7sq6n:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    ConfigMapOptional:       <nil>
    DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:                      <none>


Name:             simple-http-deployment-69579df7b8-mfsvh
Namespace:        default
Priority:         0
Service Account:  default
Node:             fangliang-virtual-machine/192.168.137.248
Start Time:       Wed, 24 May 2023 00:06:37 +0800
Labels:           app=simple_http
                  pod-template-hash=69579df7b8
Annotations:      cni.projectcalico.org/containerID: fd14cd14683f59d10fc562e6ae829c30d1b654436670a149f093c12a596bc5fa
                  cni.projectcalico.org/podIP: 10.1.62.182/32
                  cni.projectcalico.org/podIPs: 10.1.62.182/32
Status:           Running
IP:               10.1.62.182
IPs:
  IP:           10.1.62.182
Controlled By:  ReplicaSet/simple-http-deployment-69579df7b8
Containers:
  simple-http-container:
    Container ID:  containerd://2dccf799cfff5d7fad3ea033bba837acab06f9738933cd87cf7a689588f9164a
    Image:         localhost:32000/simple_http:v3
    Image ID:      localhost:32000/simple_http@sha256:b38b4baddca283822da1fe70276708a28a7e6fb807fb934e086be01d14da9626
    Port:          8888/TCP
    Host Port:     0/TCP
    Command:
      python
      main.py
      -port
      $(SERVER_PORT)
      -version
      3
    State:          Running
      Started:      Wed, 24 May 2023 00:06:38 +0800
    Ready:          True
    Restart Count:  0
    Environment:
      SERVER_PORT:               8888
      POD_IP:                     (v1:status.podIP)
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-l2cqd (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  kube-api-access-l2cqd:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    ConfigMapOptional:       <nil>
    DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:                      <none>

我们可以看到清单文件中的信息在这儿都得到了体现,比如Command和Environment字段。
访问任意一个Pod的服务,可以看到结果是正常的。
在这里插入图片描述

其他参数和设置方法

名字写法值例子
Pod的名称- name: POD_NAME
valueFrom:
fieldRef:
          fieldPath: metadata.name
simple-http-deployment-69579df7b8-mfsvh
Pod的IP- name: POD_IP
valueFrom:
fieldRef:
          fieldPath: status.podIP
10.1.62.182
Pod所在的命名空间- name: POD_NAMESPACE
valueFrom:
fieldRef:
          fieldPath: metadata.namespace
default
Pod所在Node的名称- name: NODE_NAME
valueFrom:
fieldRef:
          fieldPath: spec.nodeName
fangliang-virtual-machine
Pod所在Node的IP- name: HOST_IP
valueFrom:
fieldRef:
          fieldPath: status.hostIP
192.168.137.248

参考资料

  • https://kubernetes.io/zh-cn/docs/tasks/inject-data-application/define-command-argument-container/
  • https://kubernetes.io/zh-cn/docs/tasks/inject-data-application/define-interdependent-environment-variables/
  • https://kubernetes.io/zh-cn/docs/tasks/inject-data-application/define-environment-variable-container/
  • https://kubernetes.io/zh-cn/docs/tasks/inject-data-application/environment-variable-expose-pod-information/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/561531.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python 正则表达式使用总结

re库使用 re.findall import re## 存在匹配的 txt "ai aiThe rain in Spain" x re.findall("ai", txt) print(x) # 没有匹配的 txt "adafda dafasdf" x re.findall("ai", txt) print(x)s中国人adfadsfasfasdfsdaf中国万岁\n pri…

chatgpt赋能Python-python_pythonw

Python和Pythonw——SEO助您成功 Python和Pythonw是两个最广泛使用的编程语言之一。不仅是它们提供了丰富的编程功能和轻松上手的学习曲线&#xff0c;它们还具有出色的SEO优化功能&#xff0c;因为它们是自由和开源的。 Python是什么&#xff1f; Python是一种高级编程语言…

SpringCloud微服务踩坑系列:参数不全造成的空指针

服务一直报500错误&#xff0c;看了一下后台出现了空指针异常 异常如下&#xff1a; java.lang.NullPointerException: null at com.cyf.serviceOrder.service.OrderInfoService.add(OrderInfoService.java:93) ~[classes/:na] at com.cyf.serviceOrder.controller.Or…

chatgpt赋能Python-python_qq群

Python QQ群&#xff1a;学习Python的最佳社区 Python是一个非常流行的编程语言&#xff0c;因其简单易学、可读性高等特点&#xff0c;备受开发人员的青睐。为了交流学习Python&#xff0c;越来越多的人开始组建Python QQ群。本文将介绍Python QQ群的意义、特点和如何找到合适…

深入理解Java虚拟机:JVM高级特性与最佳实践-总结-10

深入理解Java虚拟机&#xff1a;JVM高级特性与最佳实践-总结-10 虚拟机类加载机制类加载的过程初始化 类加载器类与类加载器双亲委派模型 虚拟机类加载机制 类加载的过程 初始化 类的初始化阶段是类加载过程的最后一个步骤&#xff0c;前几个类的加载动作里&#xff0c;除了…

Unity 新建你的第一个游戏,以及如何按WASD控制角色运动 (Unity Demo2D)

文章目录 初始化项目新建角色物体游戏资源管理试着导入资源试着管理资源试着使用资源 脚本是啥新建脚本编辑脚本行为逻辑按键检测获取按键移动位置★ 最终代码 (有基础请直接跳到这) 初始化项目 当你打开 Unity Hub&#xff0c;初始化一个 2D 项目&#xff0c;进入了 Unity 编…

人工智能TensorFlow MNIST手写数字识别——训练篇

上期我们分享了CNN的基本结构,本期我们就拿MNIST数据集来训练一下手写数字的数据库,以便我们下期能够使用训练好的模型,来进行手写数字的识别。 分享一下几个可视化网站,可以看到神经网络的识别过程。 http://scs.ryerson.ca/~aharley/vis/conv/ 1、插入MNIST数据集 #利…

Java安全和防护:如何保护Java应用程序和用户数据的安全

第一章&#xff1a;引言 在当今数字化时代&#xff0c;Java已经成为主流的编程语言之一。无论是企业级应用程序还是个人项目&#xff0c;Java应用程序都承载着大量的敏感数据和业务逻辑。然而&#xff0c;随着网络攻击日益猖獗&#xff0c;保护Java应用程序和用户数据的安全变…

Java-API简析_java.lang.Package类(基于JDK1.8)(浅析源码)

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/130806567 出自【进步*于辰的博客】 其实我的【Java-API】专栏内的博文对大家来说意义是不大的。…

什么是 Spring?为什么学它?

前言 欢迎来到本篇文章&#xff01;在这里&#xff0c;我将带领大家快速学习 Spring 的基本概念&#xff0c;并解答两个关键问题&#xff1a;什么是 Spring&#xff0c;以及为什么学习 Spring。 废话少说&#xff0c;下面&#xff0c;我们开始吧&#xff01; Spring 官方文档…

MySQL索引详解(IT枫斗者)

MySQL索引详解 什么是索引 官方介绍索引是帮助MySQL高效获取数据的数据结构。简单来讲&#xff0c;数据库索引就像是书前面的目录&#xff0c;能加快数据库的查询速度。事实上&#xff0c;索引是一种数据结构&#xff0c;用于帮助我们在大量数据中快速定位到我们想要查找的数…

chatgpt赋能Python-python_pyyaml

Python与PYAML的SEO 介绍 在当今以数据为中心的时代&#xff0c;数据的存储、传输和处理出现了许多新的挑战。Python作为一门强大的编程语言&#xff0c;已经成为数据处理的利器。而PYAML则是Python中一款重要的yaml库。 YAML与PYAML YAML&#xff08;YAML Ain’t Markup L…

语法速通 uni-app随笔【uni-app】【微信小程序】【vue】

1、微信小程序 1.1、wx 小程序 工程目录 其中&#xff0c; pages目录/index目录【必有】&#xff1a; index.js 编写业务逻辑 【初始数据&#xff0c;生命周期函数】 index.json 编写配置 index.wxml 编写模板 【可理解为本页html】 index.wxss 【可理解为本页css】 1.2、wx…

The Development of DBMS in History--人工翻译

导言 数据库类型 &#xff0c;有时称为数据库模型或数据库族&#xff0c;是用于在数据库管理系统内组织数据的模式和结构。多年来已经开发了许多不同的数据库类型。一些主要是当前数据库的历史前辈&#xff0c;而另一些则经受住了时间的考验。在过去的几十年中&#xff0c;新的…

chatgpt赋能Python-python_plot散点图

Python Plot散点图&#xff1a;详细介绍与使用教程 Python是一种广泛使用的编程语言&#xff0c;特别适合处理数据科学任务。Python有大量的用于数据可视化的库&#xff0c;其中matplotlib是最重要的之一。在本文中&#xff0c;我们将探讨matplotlib中的散点图plot&#xff0c…

[ 云计算 Azure ] Chapter 07 | Azure 网络服务中的虚拟网络 VNet、网关、负载均衡器 Load Balancer

本系列已经更新文章列表&#xff08;已更新&#xff09;&#xff1a; [ Azure 云计算从业者 ] Chapter 03 | 描述云计算运营中的 CapEx 与 OpEx&#xff0c;如何区分 CapEx 与 OpEx[ Azure 云计算从业者 ] Chapter 04 | Azure核心体系结构组件之数据中心、区域与区域对、可用区…

什么是智能合约存储布局?

本指南将解释智能合约中存储的数据。合约存储布局是指控制合约存储变量在长期内存中排布的规则。 读者先决条件知识 以下一般先决条件有助于理解本文&#xff1a; 熟悉面向对象的语言 位和字节 十六进制 智能合约 以太坊虚拟机&#xff08;EVM&#xff09; 哈希 无符号整数 静态…

图像噪声类别

什么是图像噪声&#xff1f; 图像噪声是图像在获取或是传输过程中受到随机信号干扰&#xff0c;妨碍人们对图像理解及分析处理 的信号。 图像噪声的产生来自图像获取中的环境条件和传感元器件自身的质量&#xff0c;图像在传输过程中产 生图像噪声的主要因素是所用的传输信道…

chatgpt赋能Python-python_quad

Python quad是什么&#xff1f; 在Python编程中&#xff0c;Quad是指四元组的缩写。它是一个包含四个元素的有序组。Quad通常在图形学和计算机图像处理中广泛应用。 在Quad中&#xff0c;每个元素都可以是数字或点的组合。 在Python编程中&#xff0c;quad被广泛用于三维计算机…

我最近的练习一些全栈项目

嘿&#xff0c;大家好&#xff01;作为一个程序员&#xff0c;我突然出现在这里&#xff0c;就像程序里的一个Bug一样突兀。我知道我很久没有发博客了&#xff0c;你们一定在想&#xff0c;这家伙是被代码迷宫困住了还是被Bug们抓走了&#xff1f;实际上&#xff0c;我一直忙于…