下篇1:将 ConfigMap 中的键值对作为容器的环境变量

K8s 中 ConfigMap 使用介绍 ConfigMap 是一种 API 对象,用来将非机密性的数据保存到键值对中。使用时,Pods 可以将其用作环境变量、命令行参数或者存储卷中的配置文件。ConfigMap 的主要作用就是为了让镜像和配置文件解耦,以便实现镜像的可移植性和可复用性。... 阅读详情

写在开篇

继续接上篇,《一文了解K8S的ConfigMap》。上篇聊过,官方文档中提到的可以使用下面4种方式来使用 ConfigMap 配置 Pod 中的容器:

  • 容器的环境变量:可以将 ConfigMap 中的键值对作为容器的环境变量。
  • 在只读卷里面添加一个文件,让应用来读取:可以将 ConfigMap 中的内容作为一个只读卷挂载到 Pod 中的容器内部,然后在容器内读取挂载的文件。
  • 编写代码在 Pod 中运行,使用 Kubernetes API 来读取 ConfigMap:可以在 Pod 中运行自定义代码,使用 Kubernetes API 来读取 ConfigMap 中的内容。
  • 在容器命令和参数内:可以在容器的启动命令中通过引用环境变量的方式来使用 ConfigMap。

为了控制篇幅,计划分4篇进行分享,本篇分享以使用“容器的环境变量”的方式进行实战。 关于使用ConfigMap的更多详情,可参考官方文档:https://kubernetes.io/zh-cn/docs/concepts/configuration/configmap/#using-configmaps

开发示例应用

  1. goweb项目目录结构
[root@workhost goweb]# tree
.
├── Dockerfile
├── go.mod
├── main.go
├── README.md
└── static
    └── login.html
  1. main.go
package main

import (
        "fmt"
        "log"
        "net/http"
        "os"
        "text/template"
)

type Message struct {
        Msg string
}

func home(w http.ResponseWriter, r *http.Request) {
        if r.Method == "GET" {
                w.Header().Set("Location", "/login")
                w.WriteHeader(http.StatusFound)
        }
}

func login(w http.ResponseWriter, r *http.Request) {
        t, _ := template.ParseFiles("./static/login.html")
        if r.Method == "GET" {
                t.Execute(w, nil)
        }
}

func main() {
        http.HandleFunc("/", home)
        http.HandleFunc("/login", login)
        args := os.Args
        if args[1] == "-p" {
                port := args[2]
                listenAddr := fmt.Sprintf(":%v", port)
                log.Println("ListenAndserve", listenAddr)
                err := http.ListenAndServe(listenAddr, nil)
                if err != nil {
                        log.Println(err)
                }
        }
}

本次代码在上次的基础上做了点小改造:接受命令行参数,使用 os.Args 获取程序运行时的参数。如果传入的参数中包含 -p,则说明需要指定监听的端口,将端口值读取出来并使用 http.ListenAndServe 启动 HTTP 服务。

  1. login.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Login K8S</title>
    <style>
      body {
        background-color: #f2f2f2;
        font-family: Arial, sans-serif;
      }

      #login-box {
        background-color: #fff;
        border-radius: 5px;
        box-shadow: 0 2px 5px rgba(0, 0, 0, 0.3);
        margin: 100px auto;
        max-width: 400px;
        padding: 20px;
      }

      h1 {
        font-size: 24px;
        margin: 0 0 20px;
        text-align: center;
      }

      label {
        display: block;
        font-size: 14px;
        font-weight: bold;
        margin-bottom: 5px;
      }

      input[type="text"],
      input[type="password"] {
        border-radius: 3px;
        border: 1px solid #ccc;
        box-sizing: border-box;
        font-size: 14px;
        padding: 10px;
        width: 100%;
      }

      input[type="submit"] {
        background-color: #007bff;
        border: none;
        border-radius: 3px;
        color: #fff;
        cursor: pointer;
        font-size: 14px;
        padding: 10px;
        width: 100%;
      }

      input[type="submit"]:hover {
        background-color: #0069d9;
      }

      .error-message {
        color: #dc3545;
        font-size: 14px;
        margin: 10px 0;
        text-align: center;
      }
    </style>
  </head>
  <body>
    <div id="login-box">
      <h1>容器云管理平台</h1>
      <form>
        <label for="username">账号:</label>
        <input type="text" id="username" name="username">

        <label for="password">密码:</label>
        <input type="password" id="password" name="password">

        <input type="submit" value="登录">
      </form>
      <div class="error-message"></div>
    </div>

    <script>
      const form = document.querySelector('form');
      const errorMessage = document.querySelector('.error-message');

      form.addEventListener('submit', function(event) {
        event.preventDefault();

        const username = document.getElementById('username').value;
        const password = document.getElementById('password').value;

        if (username === '' || password === '') {
          errorMessage.textContent = 'Please enter a username and password.';
        } else if (username !== 'admin' || password !== 'password') {
          errorMessage.textContent = 'Incorrect username or password.';
        } else {
          alert('Login successful!');
        }
      });
    </script>
  </body>
</html>

实战:以使用“容器的环境变量”的方式

  1. 制作镜像

编写Dockerfile:

FROM alpine:latest
WORKDIR /app
COPY static /app/static
COPY main /app
ENV PORT 80 # 设置默认端口号为80,这个值将在容器启动时被覆盖
CMD ["/bin/sh", "-c", "./main -p $PORT"]

构建镜像和推送到私有harbor:

docker build -t 192.168.11.254:8081/webdemo/goweb:20230515v2 .
docker push 192.168.11.254:8081/webdemo/goweb:20230515v2
  1. 测试
[root@workhost goweb]# docker run --rm -it -p 80:9090 -e PORT=9090 192.168.11.254:8081/webdemo/goweb:20230515v2
2023/05/15 02:08:43 ListenAndserve :9090

使用 -p 参数将本地主机的 80 端口映射到容器内部的 9090 端口,使用 -e 参数设置环境变量 PORT 的值为 9090,可以正常启动,说明在启动时已经覆盖掉了默认端口80,且能正常访问:

图片

  1. 创建configmap
kubectl create configmap goweb --from-literal=port=9091

执行命令后将会创建一个名为 goweb 的 ConfigMap,其中包含一个名为 port 的键,值为 9091。这样,在 Pod 中使用 $PORT 环境变量时,就可以将其设置为 9091。

说明:–from-literal=port=9091 表示要将 port 这个键的值设置为 9091,这里使用 --from-literal 标志表示将文本作为字面量值创建 ConfigMap。

  1. 创建pod
apiVersion: v1
kind: Pod
metadata:
  name: goweb
spec:
  containers:
  - name: goweb
    image: 192.168.11.254:8081/webdemo/goweb:20230515v2
    env:
    - name: PORT
      valueFrom:
        configMapKeyRef:
          name: goweb
          key: port

上面yaml中,通过设置 env 字段,将 ConfigMap 中的 port 键值对作为环境变量注入到容器中的应用程序中。使用了 valueFrom 字段指定了 ConfigMap 的名称和键,从而将 ConfigMap 中的 port 值注入到容器的 PORT 环境变量中。这样,在容器启动后,应用程序就可以通过读取 PORT 环境变量的值来获取应该监听的端口,实现了将 ConfigMap 的值注入到容器的环境变量中的功能。

  1. 进入pod验证
[root@k8s-b-master ~]# kubectl get pod
NAME    READY   STATUS    RESTARTS   AGE
goweb   1/1     Running   0          29s
[root@k8s-b-master ~]# kubectl exec -it goweb -- sh
/app # ps
PID   USER     TIME  COMMAND
    1 root      0:00 ./main -p 9091
   11 root      0:00 sh
   17 root      0:00 ps
/app # 
  1. 完整的yaml
apiVersion: v1
metadata:
  name: goweb
data:
  port: "9091"
kind: ConfigMap
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: goweb
  name: goweb
spec:
  replicas: 3
  selector:
    matchLabels:
      app: goweb
  template:
    metadata:
      labels:
        app: goweb
    spec:
      containers:
        - name: goweb
          image: 192.168.11.254:8081/webdemo/goweb:20230515v2
          env:
          - name: PORT
            valueFrom:
              configMapKeyRef:
                name: goweb
                key: port

本文转载于WX公众号:不背锅运维(喜欢的盆友关注我们):https://mp.weixin.qq.com/s/14zOTnmUSK39PHj8t9m3mQ

环境变量如何优化Kubernetes应用?ConfigMap结合Pod的强大用法 除了通过环境变量引用ConfigMap,还可以将ConfigMap以Volume的形式挂载到容器中,每个键将作为文件名,每个键对应的值将作为文件内容。通过环境变量,可以在不修改应用程序代码的前提下动态调整其行为,容器在运行时会读取这些环境变量的值。接下来,创建一个Pod,该Pod中的容器运行Web应用程序,并通过环境变量将ConfigMap中的数据库配置信息注入到容器中。Pod创建成功后,可以通过以下命令进入容器并查看环境变量的值,以确保ConfigMap中的配置信息已经正确注入到容器中。 阅读详情

相关推荐

ZBrush 2021来了

这次给大家带来的是:zbrush2021.1.1 win安装教程 1.下载压缩包之后解压到文件夹当中,然后打开ZBrush_2021_Installer.exe进行软件安装, 如下图 2.在这里我们保持默认的简体中文版即可,然后点击确认,如下图 3.第三步我们点击前进即可,如下图 4.第四步我们来到许可协议,在这里我们点击我接受此协议,然后点击前进,如下图 5.第五步我们来到安装目录,在这里我们可以设置安装路径,如下图 6.在这里我将安装目录修改安装到E盘为例,然后点击下一

3D游戏建模 1190

通过configmap创建环境变量

如下是deployment的containers字段下添加环境变量方式。LIVES是环境变量起的名字gameenvcm是configmap的名称key:lives是环境变量的key这样configmap中key的值付值给LIVES,进容器env命令可以看到环境变量。

h2728677716的博客 659

(NOI)打表骗分过样例,暴力枚举出奇迹1.8.22题解

                                                                                                                                                           48818 B题解 #include &lt;iostream&gt; u...

Owen20071026的博客 3130

Dockerfile构建镜像读取环境变量问题

在CNAP K8S Deployment运行此Java镜像时,发现类似spring.output.ansi.enabled环境变量无法注入,即启动Java镜像后在Java应用无法读取到对应的环境变量配置。并非所有的基础镜像均支持"bash"(Bourne-Again Shell),但几乎全部镜像均支持"sh"(Bourne Shell)。经测试发现shell环境(即sh -c环境)不支持小写点分环境变量名称的格式,即xxx.yyy的格式。因此,使用上述方法时,请确保基础镜像中的"bash"可用。

罗小爬的技术宝书 2230

头歌平台 操作系统课堂练习2.3:系统调用

使用 gdb 调试内核,跟踪到 main 函数入口的方法与之前实训一样。系统运行时,执行的前 3 个系统调用的编号和名字分别是什么?系统运行时,执行的前 3 个系统调用的编号和名字分别是什么?本关卡使用版本 1 内核进行分析,版本 1 内核文件存放在。为了完成本关任务,你需要:跟踪系统调用的发生。此时,系统调用号存放在寄存器 eax 中。

lazbuyaotoutu的博客 2万+

TPAMI 2024 | 基于外观的深度学习凝视估计:综述与基准测试

人类目光提供了关于人类焦点和意图的有价值信息,使其成为研究的关键领域。最近,深度学习彻底改变了基于外观的眼神估计。然而,由于眼神估计研究的独特特征,如2D眼神位置和3D眼神向量之间的不公平比较以及不同的预处理和后处理方法,缺乏开发基于深度学习的眼神估计算法的明确指导方针。在本文中,我们系统回顾了使用深度学习的眼神估计方法。首先,我们沿着典型的眼神估计流程调查现有的算法:深度特征提取、深度学习模型设计、个人校准和平台。

小白学视觉 345

kubernetes资源对象之configmap

kubernetes资源对象configmaq的使用

qq_44823950的博客 227

携程机票数据爬取实战:使用 Python 获取携程网机票信息

通过本篇博客,我们详细介绍了如何使用 Python 爬取携程网的机票信息,涉及了静态网页爬取(使用 Requests 和 BeautifulSoup)和动态网页爬取(使用 Selenium)两种方法。通过获取的数据,我们不仅能够进行票价分析,还可以构建更为复杂的预测模型或趋势分析工具。爬虫技术不仅能够帮助我们收集有价值的数据,还能够为商业决策提供数据支持。在实际应用中,我们可以结合更多的分析方法,如自然语言处理、图像处理等,进一步提升数据的价值。

2201_76125261的博客 1659

[kubernetes in Action实践]七、ConfigMap和Secret:配置应用程序

ConfigMap和Secret:配置应用程序配置容器化应用程序 配置容器化应用程序 通常的容器化应用配置: 配置嵌入应用本身(不推荐) 以命令行参数形式配置应用,配置选项多时,将配置文件化 读取环境变量 相比使用配置文件,优势是不用重新打包 相比挂载卷,挂载卷需要在容器启动前确保配置文件写入响应的卷中。 ...

Arrowarcher的博客 658

GB28181 —— 1、Ubuntu20.04下使用ZLMediaKit+WVP搭建GB28181流媒体监控平台(连接带云台摄像机)

GB28181 —— Ubuntu20.04下使用ZLMediaKit+WVP搭建GB28181流媒体监控平台

5464

YOLOv12改进策略【独家融合改进】| SPD-Conv+PPA 再次提升模型针对小目标的特征提取能力

SPD-Conv是一种新的 CNN 构建模块,用于替代传统 CNN 架构中使用的步长卷积(strided convolution)和池化(pooling)层,它由空间到深度(Space-to-depth,SPD)层和非步长卷积(non - strided convolution)层组成。

Limiiiing的博客 1030

k8s 向容器提供配置 变量信息总结configmap

以下将介绍向容器提供配置信息的几种方法 通过命令行参数进行配置 在制作Docker镜像时,Dockerfile中的ENTRYPOINT和CMD指令可用于指定容器启动时要运行的程序及相关参数。CMD指令以列表的形式指定要运行的程序和相关参数,但是如果同时存在ENTRYPOINT指令,则CMD指令中列表的所有元素都将被作为由ENTRYPOINT指定程序的命令行参数。另外在基于某镜像使用Docker命令创建容器时,可以在命令行向ENTRYPOINT中的程序传递额外的自定义参数,甚至还可以修改...

码农崛起 7983

28、时间敏感网络中可靠性感知的综合路由与调度

本文针对时间敏感网络(TSN)中现有路由与调度机制主要关注时间触发(TT)流量而忽略其他类型流量效用的问题,提出了一种可靠性感知的综合路由与调度机制。通过将具有不同可靠性和延迟要求的各类流量的联合路由与调度问题形式化为基于优化模理论(OMT)的混合整数规划问题,设计了完整的路由约束与调度约束,并分析了不同类型流量的传输效用,设定了优化目标以提升整体网络性能。实验结果表明,该机制在满足TT流量严格时延与可靠性要求的同时,显著提高了AVB和BE等非关键流量的传输效用,实现了多类型流量的高效协同传输。

hhh00的博客 96

【Kubernetes 系列】ConfigMap 进阶 环境变量的配置及使用

ConfigMap API 资源将配置数据存储为键值对。 数据可以在 Pod 中使用,也可以用来提供系统组件(如控制器)的配置。 ConfigMap 与 Secret 类似, 但是提供的是一种处理不含敏感信息的字符串的方法。 用户和系统组件都可以在 ConfigMap 中存储配置数据。...

半身风雪 5702

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

k8s之ConfigMap详细理解及使用

一、ConfigMap介绍 ConfigMap是一种API对象,用来将非加密数据保存到键值对中。可以用作环境变量、命令行参数或者存储卷中的配置文件。 ConfigMap可以将环境变量配置信息和容器镜像解耦,便于应用配置的修改。如果需要存储加密信息时可以使用Secret对象。 二、ConfigMap创建 1.通过命令行创建configmap 可以使用 kubectl create configmap 从文件、目录或者 key-value 字符串创建等创建 ConfigMap (1)通过文...

skh2015java的博客 5万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

总结:k8s之ConfigMap

一、介绍 ConfigMap是一种API对象,用来将非加密数据保存到键值对中。可以用作环境变量、命令行参数或者存储卷中的配置文件。 ConfigMap可以将环境变量配置信息和容器镜像解耦,便于应用配置的修改。如果需要存储加密信息时可以使用Secret对象。 创建ConfigMap的方式有4种: 通过直接在命令行中指定configmap参数创建,即--from-literal 通过指定文件创建,即将一个配置文件创建为一个ConfigMap--from-file=<文件> 通过指定目录创建,

w2009211777的专栏 5957

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

k8s中,configMap与环境变量的关系

在Kubernetes中,ConfigMap和环境变量都可以用于向容器传递配置信息。环境变量:这是一种将配置信息直接注入到容器中的方法。它们在容器启动时被设置,并且在容器的生命周期内保持不变。ConfigMap:这是一种在Kubernetes集群中存储和管理非机密配置信息的方法。ConfigMap可以被多个Pod共享,并且可以在运行时更新。可以将ConfigMap数据注入到容器中作为环境变量或挂载到文件系统中的文件。

Keep trying, keep going 1088

configmap详解

ConfigMap 官方文档: 配置 Pod 使用 ConfigMap | Kubernetes ConfigMap详解 - 简书 (jianshu.com) 一.configMap简介 ConfigMap是一种API对象,用来将非加密数据保存到键值对中,如etcd中。 可以用作环境变量、命令行参数或者存储卷中的配置文件。 ConfigMap可以将 环境变量 配置信息和容器镜像解耦,便于应用配置的修改。 如果需要存储加密信息时可以使用Secret对象。 二.创建ConfigMap 1.创建方式: 可

wq1205750492的博客 2993

通过 envFrom 字段将 ConfigMap 内容批量挂载为容器内的环境变量

使用envFrom字段将 ConfigMap 的内容批量挂载为容器内的环境变量,是一种高效且简洁的配置管理方式。它简化了环境变量的定义过程,提高了配置的灵活性和可维护性。在 Kubernetes 中,这一特性使得应用程序的配置管理变得更加轻松和直观。希望本文能够帮助你更好地理解和应用这一技术。

ThisIsClark 581

ConfigMap

ConfigMap 是一种 API 对象,用来将非机密性的数据保存到键值对中。使用时,可以将其用作环境变量、命令行参数或者存储卷中的配置文件。ConfigMap 将环境配置信息和解耦,便于应用配置的修改。NOTE] 说明:ConfigMap 在设计上不是用来保存大量数据的。在 ConfigMap 中保存的数据不可超过 1 MiB。如果你需要保存超出此尺寸限制的数据,你可能希望考虑挂载存储卷 或者使用独立的数据库或者文件服务。

分享运维&&开发学习成果 898

ConfigMap使用

其中configMap中分别定义了两个key,一个是key-serverxml,另一个是key-loggingproperties。这两个key的value都是一个文件。所以我们需要通过volumeMount,对这两个进行相应的挂载。

Aiky哇 1678

K8s之configMap

1.1 什么是configMapconfigMap是Kubernetes中的一种资源对象,用于存储配置数据。它可以包含键值对,也可以包含来自文件的配置数据。configMap的作用是将配置数据与应用程序的容器分离,使得配置可以在不重新构建镜像的情况下进行修改和管理。configMap可以用于存储各种类型的配置数据,例如环境变量、命令行参数、配置文件等。通过将配置数据存储在configMap中,可以实现应用程序的动态配置,而无需重新部署应用程序。

Winter的博客 2410

配置分离:ConfigMap

云原生要素-配置分离:ConfigMap&Secret 什么是ConfigMap ConfigMap 是一种 API 对象,用来将非机密性的数据保存到键值对中。 举一个例子更直观的看出ConfigMap是什么:比如我有一个nginx的Pod资源,那么ConfigMap就相当于nginx.conf这个配置文件。 需要注意的是:这个 Pod 和 ConfigMap 必须要在同一个 命名空间 中,不可跨命名空间。 ConfigMap供容器使用的典型用法如下: 生成容器内的环境变量。 设置容器启动命令的启

皮皮的博客 4268

Kubernetes 中的 ConfigMap:灵活的配置管理方式

摘要:ConfigMap是Kubernetes中用于管理非机密配置数据的资源对象,通过键值对存储配置信息(如数据库连接、API密钥等)。它支持通过文件挂载、环境变量或命令行参数方式传递给容器,实现配置与容器镜像的解耦。ConfigMap支持动态更新,便于多环境部署和集中化管理,避免硬编码配置,提高应用灵活性。主要优势包括动态配置管理、简化多环境部署和集中化配置审计。

深耕后端、偏爱架构,用代码与设计构建可靠系统 1011

Kubernetes配置管理/ConfigMap

在传统架构中,配置文件往往被保存在宿主机上,程序启动是可以指定某个配置文件,但是使用容器部署时,容器所在的节点并不固定,所以不能使用这种方式,此处在构建镜像时,如果把配置文件也放在容器里面,那么配置文件一旦有更改的话,也是一件非常麻烦的事情。所以k8s 抽象了一个 configMap的概念,将配置与 pod 和组件分开,这有助于保持工作负载的可移植性,使配置更易于更改和管理。比如在生产环境中,可以将 Nginx、Redis 等应用的配置文件存储在 ConfigMap 上,然后将其挂载即可使用。

2501_91344113的博客 1553

Kubernetes ConfigMap的创建与使用

Kubernetes ConfigMap的创建与使用。

大头皮鞋的博客 1826
上一篇: 关于Prometheus在K8S中的部署方案如何选择,以及分享手工部署的YAML
下一篇: 关于ServiceAccount以及在集群内访问K8S API
不背锅运维
博客等级 码龄4年 38粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值