k8s学习之路【04.配置应用程序】

K8S(Kubernetes)简介和官方安装部署保姆级详细教程 Kubernetes简称为K8s,是用于自动部署、扩缩和管理容器化应用程序的开源系统,起源于Google 集群管理工具Borg。 阅读详情

这是一份个人学习k8s的学习笔记,打算是做成一个系列,分享是最好的学习方式。

k8s学习之路系列:


使用Docker部署应用程序时,一般常用的配置方式有:

  • 配置内嵌

  • 启动传参配置

  • 环境变量

经过前面容器持久化存储的介绍,我们很容易能想到是以挂载卷的形式,比如:

  • gitRepo

  • hostPath

  • NFS

再结合边车模式来进行配置文件的管控是可行的,然而有一种更加简便的方法能将配置数据置于Kubernetes的顶级资源对象中,那就是ConfigMap。

传递命令行参数

在上一节容器持久化存储的emptyDir概念介绍部分,我们引入了一个fortune-pod的例子,再回顾一下之前的配置文件吧,如下:

apiVersion: v1
kind: Pod
metadata:
  name: fortune
spec:
  containers:
  - image: luksa/fortune
    name: html-generator
    volumeMounts:
    - name: html
      mountPath: /var/htdocs
  - image: nginx:alpine
    name: web-server
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html
      readOnly: true
    ports:
    - containerPort: 80
      protocol: TCP
  volumes:
  - name: html
    emptyDir: {}

此应用程序设定了每隔10s就会自动生成输出到html,现在我们要做的是通过命令行参数,自行设定隔多少秒自动生成内容。

创建文件fortune-pod-args.yaml,输入以下内容:

apiVersion: v1
kind: Pod
metadata:
  name: fortune2s
spec:
  containers:
  - image: luksa/fortune:args
    args: ["2"]
    name: html-generator
    volumeMounts:
    - name: html
      mountPath: /var/htdocs
  - image: nginx:alpine
    name: web-server
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html
      readOnly: true
    ports:
    - containerPort: 80
      protocol: TCP
  volumes:
  - name: html
    emptyDir: {}

看到配置文件中的args字段了么?这个就是传给镜像luksa/fortune:args控制时间的参数,让我们启动看看吧。

kubectl create -f fortune-pod-args.yaml
# 输出
pod/fortune2s created

# 查看状态
kubectl get pods
# 输出
NAME      READY   STATUS    RESTARTS   AGE
fortune   2/2     Running   0          2m27s

# 暂时服务化
kubectl port-forward fortune2s 8080:80

访问127.0.0.1:8080就会发现输出的频率变成了2s:

> curl 127.0.0.1:8080
Stay away from flying saucers today.

设置环境变量

与容器的命令和参数设置相同,环境变量列表无法在 pod 创建后被修改

设置环境变量非常简单,我们只需要在pod中指定环境变量即可;当然,这里有个前提是你需要将修改镜像让其支持读取环境变量。

我们直接使用书中的例子:vim fortune-pod-env.yaml:

apiVersion: v1
kind: Pod
metadata:
  name: fortune-env
spec:
  containers:
  - image: luksa/fortune:env
    env:
    - name: INTERVAL
      value: "30"
    name: html-generator
    volumeMounts:
    - name: html
      mountPath: /var/htdocs
  - image: nginx:alpine
    name: web-server
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html
      readOnly: true
    ports:
    - containerPort: 80
      protocol: TCP
  volumes:
  - name: html
    emptyDir: {}

可以看到配置中声明了INTERVAL环境变量值为30,在终端中实践一下:

kubectl create -f fortune-pod-env.yaml
# 输出
pod/fortune-env created

# 查看状态
kubectl get pods
# 输出
NAME      READY   STATUS    RESTARTS   AGE
fortune-env   2/2     Running   0          10s

# 暂时服务化
kubectl port-forward fortune-env 8080:80

访问127.0.0.1:8080就会发现输出的频率变成了30s。

现在应用程序的所有配置基本上可以说是硬编码的形式进行配置,并且yaml配置文件总是有配置相关的字段,有没有办法让镜像和配置文件解耦呢?

k8s提供了名为ConfigMap的资源对象解决这个问题。

ConfigMap

资源对象ConfigMap提供了向容器中注入配置信息的机制,它本质上就是一个键/值对映射,可以用来保存单个值或者配置文件。

ConfigMap是不需要被读取的,它映射的内容通过环境变量或者卷文件的形式传给容器。一般直接在pod的定义里面就可以声明ConfigMap,这样就可以根据不同的环境创建不同的配置,流程交互如下图所示:

image-20210316203507993

创建

还是用之前应用程序为例,配置专注于环境变量INTERVAL,创建命令如下所示:

kubectl create configmap fortune-config --from-literal=sleep-interval=25
# 输出
configmap/fortune-config created

# 获取相关描述
kubectl get configmap fortune-config -o yaml

# 查看 configmap
kubectl get configmap

# 删除
kubectl delete configmap fortune-config

此外,k8s还可以直接填写配置文件来进行创建vim fortune-config.yaml,输入如下内容:

apiVersion: v1
kind: ConfigMap
metadata:
  name: fortune-config
data:
  sleep-interval: "25"

然后执行:

kubectl create -f fortune-config.yaml
# 输出
configmap/fortune-config created

其实还有更多的创建方式,大概提一下:

# 从文件内容创建ConfigMap条目
kubectl create configmap my-config --from-file=config-file.conf
# 从文件夹创建ConfigMap
kubectl create configmap my-config --from-file=/path/to/dir
# 合并不同选项
kubectl create configmap my-config
 --from-file=foo.json
 --from-file=bar=foobar.conf
 --from-file=config-opts/
 --from-literal=some=thing

作为环境变量传入容器

如何将映射中的值传递给pod的容器?最简单的方法是给容器设置环境变量,通过在配置中声明valueFrom,具体操作vim fortune-pod-env-configmap.yaml:

apiVersion: v1
kind: Pod
metadata:
  name: fortune-env-from-configmap
spec:
  containers:
  - image: luksa/fortune:env
    env:
    - name: INTERVAL
      valueFrom:
        configMapKeyRef:
          name: fortune-config
          key: sleep-interval
    name: html-generator
    volumeMounts:
    - name: html
      mountPath: /var/htdocs
  - image: nginx:alpine
    name: web-server
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html
      readOnly: true
    ports:
    - containerPort: 80
      protocol: TCP
  volumes:
  - name: html
    emptyDir: {}

让我们启动pod实践看看:

kubectl create -f fortune-pod-env-configmap.yaml
# 输出
pod/fortune-env-from-configmap created

# 查看状态
kubectl get pods
# 输出
NAME                         READY   STATUS    RESTARTS   AGE
fortune-env-from-configmap   2/2     Running   0          19s

# 暂时服务化
kubectl port-forward fortune-env-from-configmap 8080:80

# 删除pod
kubectl delete pods fortune-env-from-configmap

现在我们已经成功在pod中使用了ConfigMap资源,不过这种使用方式是比较低效的,考虑这样一个情况:如果环境变量比较多,这样单独一个个环境变量的设置方式是个程序员都没法忍受的。

一般在框架里面加载一些环境变量都会利用前缀机制来进行批量加载,比如Sanic框架会读取SANIC_开头的环境变量自动加载。

k8s也提供了这样类似的机制,配置声明如下图示:

image-20210317214756738

ConfigMap 卷

环境变量或者命令行参数值作为配置值通常适用于变量值较短的场景。由于 ConfigMap 中可以包含完整的配置文件内容,当你想要将其暴露给容器时,可以借助前面章节提到过的一种称为 configMap 卷的特殊卷格式。

首先删除前面声明建立的cf资源:kubectl delete configmap fortune-config。然后建立文件夹configmap-files,首先建立Nginx配置文件:vim my-nginx-config.conf:

server {
    listen              80;
    server_name         www.kubia-example.com;

    gzip on;
    gzip_types text/plain application/xml;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

}

另外在该文件夹中添加一个名为sleep-interval的文本文件,输入25,类似前面声明环境变量。

接下来从文件夹创建ConfigMap:

kubectl create configmap fortune-config --from-file=configmap-files
# 输出
configmap/fortune-config created

# 验证
kubectl get configmap fortune-config -o yaml
image-20210317215834820

创建包含ConfigMap条目内容的卷只需要创建一个引用ConfigMap名称的卷并挂载到容器中:

image-20210317215931773

创建配置文件:vim fortune-pod-configmap-volume.yaml,输入如下内容:

apiVersion: v1
kind: Pod
metadata:
  name: fortune-configmap-volume
spec:
  containers:
  - image: luksa/fortune:env
    env:
    - name: INTERVAL
      valueFrom:
        configMapKeyRef:
          name: fortune-config
          key: sleep-interval
    name: html-generator
    volumeMounts:
    - name: html
      mountPath: /var/htdocs
  - image: nginx:alpine
    name: web-server
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html
      readOnly: true
    - name: config
      mountPath: /etc/nginx/conf.d
      readOnly: true
    - name: config
      mountPath: /tmp/whole-fortune-config-volume
      readOnly: true
    ports:
      - containerPort: 80
        name: http
        protocol: TCP
  volumes:
  - name: html
    emptyDir: {}
  - name: config
    configMap:
      name: fortune-config

Secret

前面说的,都是针对非敏感信息的配置数据,对于一些敏感数据,例如:密码、OAuth token、ssh 密钥等,就可以使用Secret资源了。

Secret结构和使用方法都与ConfigMap类似,k8s通过仅仅将Secret分发到需要访问Secret的pod所在的机器节点来保障其安全性。另外,Secret只会存储在节点的内存中,永不写入物理存储。

创建

以创建一个包含用户名密码的secret资源为例:

# 创建文件
echo -n 'admin' > ./username.txt
echo -n '1f2d1e2e67df' > ./password.txt

# 创建资源
kubectl create secret generic db-user-pass --from-file=./username.txt --from-file=./password.txt

# 输出
secret/db-user-pass created

# 查看
kubectl get secrets

# 输出
NAME                  TYPE                                  DATA   AGE
db-user-pass          Opaque                                2      23s
default-token-nlxkq   kubernetes.io/service-account-token   3      54d

db-user-pass很好理解,就是刚才创建的sevret资源,default-token-nlxkq是什么呢?这是一种默认被挂载至所有容器的Secret。

参考

本章关于配置应用程序就介绍到这里了,谢谢!本部分内容有参考如下文章:

  • 配置 Pod 使用 ConfigMap[1]

  • Secret 概述[2]

  • Kubernetes in Action[3]中文版:可以算是第 7 章的读书笔记

参考资料

[1]

配置 Pod 使用 ConfigMap: https://kubernetes.io/zh/docs/tasks/configure-pod-container/configure-pod-configmap/

[2]

Secret概述: https://kuboard.cn/learning/k8s-intermediate/config/secrets/

[3]

Kubernetes in Action: https://github.com/luksa/kubernetes-in-action

如果对你有帮助,欢迎转发分享,点个好看呗哈哈 ????

Kubernetes环境搭建(手动K8s集群安装配置、服务部署和管理使用详细步骤,入门K8s容器云平台架构) Kubernetes集群搭建详细过程前言搭建步骤一、各节点基础配置二、制作CA证书三、配置etcd四、在master节点上配置Kubernetes API服务五、在master节点上部署Controller Manager服务、Kubernetes Scheduler六、在master节点上部署kubectl命令行工具七、在Node节点上部署kubelet八、在Node节点上部署kube-prox... 阅读详情

相关推荐

基于Ubuntu24.04部署Kubernetes1.31

Kubernetes 也称为 K8s,是一种用于自动部署、扩展和管理容器化应用程序的开源系统。生产级 Kubernetes 集群需要规划和准备。如果您的 Kubernetes 集群要运行关键工作负载,则必须将其配置为具有弹性。Master Node:负责处理 Kubernetes 集群的 pod、复制控制器、服务、节点和其他组件的控制 API 调用。Worker Node:为容器提供运行时环境。一组容器 pod 可以跨越多个节点。在您的主节点/工作节点中。

点九先生 2144

k8s环境变量的使用

k8s环境变量创建方式有两种:secret方式和configmap方式

monkey_90ge的专栏 4589

ubuntu24.04安装Kubernetes1.31.0(k8s1.30.0)高可用集群

首先,在负载均衡器节点上,停止haproxy和keepalived服务,负载均衡器节点(hep-kubernetes-apiserver-lb-prd-01 和 hep-kubernetes-apiserver-lb-prd-02)执行以下命令。Master节点将节点标记为不可调度,并且安全地驱逐该节点上的Pod。同样在master三个节点上,停止和等关键的Kubernetes组件服务。Worker节点使用命令将节点标记为不可调度并驱逐Pod。

JingLisen的博客 2659

kubernetes—ConfigMap 与 Secret

1. Secret 是一种包含少量敏感信息,例如密码、token 或 key 的对象这样的信息可能会被放在Pod spec 中或者镜像中;将其放在一个secret 对象中可以更好地控制它的用途,并降低意外暴露的风险2.ConfigMap 主要解决配置文件的存储问题,而Secret 主要用来解决密码、token、秘钥等敏感数据①在创建、查看和编辑Pod的流程中Secret 暴露风险较小②系统会对Secret 对象采取额外的预防措施,例如避免将其写入磁盘中可能的位置③。

qq_41619571的博客 2887

【Kubernetes】ubuntu20.04通过kubeadm + Docker安装k8s

【代码】【Kubernetes】ubuntu20.04通过kubeadm + Docker安装k8s。

m0_74282926的博客 1951

kubernetes(K8S)学习(一):K8S集群搭建(1 master 2 worker)

本文详细介绍了使用kubeadm搭建1个master节点和2个worker节点组成的Kubernetes集群。主要内容包括:环境准备(统一Docker 18.09.0和K8S v1.14.0版本,系统要求CentOS 7+)、3台虚拟机配置(2核2GB内存)、网络互通验证;集群搭建步骤:更新yum、安装依赖包、配置Docker仓库和镜像加速器。所有操作需在3台机器上执行,为后续K8S组件安装奠定基础。

꯭ 瞎꯭扯꯭蛋꯭的博客 3066

总结:K8S之环境变量

一、介绍 环境变量和普通的我们定义的变量其实含义类似的,想下我们Java类中普通的环境变量,一般作用是留给下面的方法去使用。 本文中单独说的环境变量差不多是系统的环境变量,比如linux中我们可以通过env命令查看所有的环境变量,如下图: 其中就有我们熟悉的:HOSTNAME。 那么我们大致能知道环境变量的用途:系统或程序中使用。 比如windows中的PATH,就是windows系统会使用,基于PATH去找执行文件。 比如linux中HOSTNAME,不仅linux系统会使用,用户可能也会

w2009211777的专栏 7598

Ubuntu22.04部署K8s集群

K8s集群 —— Win11 + VM Ware17.0 + Ubuntu 22.04 + K8s 1.27 + docker 24.0 + cri-docker 0.3.4.3 + flannel

夜半一碗凉泡面的博客 4207

【K8S】环境变量

为容器设置一个环境变量 创建 Pod 时,可以为其下的容器设置环境变量。通过配置文件的env或者envFrom字段来设置环境变量。 本示例中,将创建一个只包含单个容器的 Pod。Pod 的配置文件中设置环境变量的名称为DEMO_GREETING, 其值为"Hello from the environment"。下面是 Pod 的配置文件内容: apiVersion: v1 ki...

阳阳的博客 1万+

Ubuntu 22.04.5 + kubeadm:Kubernetes v1.28.2集群部署企业实战

本文详细介绍了使用Ubuntu 22.04和kubeadm部署Kubernetes v1.28.2集群的完整流程,包括环境准备、容器运行时安装、K8S集群部署、网络插件配置等关键步骤,是企业实战中的宝贵指南。

超哥的博客 1753

Kubernetes源码编译安装实战:Ubuntu 24.04下k8s编译安装最佳实践

Kubernetes源码编译是深入理解容器编排系统底层机制的核心路径,其本质是掌握Go语言构建体系、cgroup v2运行时约束与组件级定制能力的技术过程。原理上需打通从git checkout、CGO交叉编译、Bazel/Make构建到二进制签名验证的全链路;技术价值在于实现可控部署(如FIPS合规)、可溯调试(精准定位PR变更)与可嵌入扩展(自定义API端点);典型应用场景覆盖信创国产化适配(鲲鹏/飞腾平台)、金融级等保加固及CKS认证深度备考。本文聚焦Ubuntu 24.04这一关键发行版,直面cgr

weixin_34203832的博客 404

Kubernetes(k8s)ConfigMap详解及应用

ConfigMap是k8s的一个配置管理组件,可以将配置以key-value的形式传递,通常用来保存不需要加密的配置信息,加密信息则需用到Secret,主要用来应对以下场景:使用k8s部署应用,当你将应用配置写进代码中,就会存在一个问题,更新配置时也需要打包镜像,ConfigMap可以将配置信息和docker镜像解耦。使用微服务架构的话,存在多个服务共用配置的情况,如果每个服务中单独一份配置的话,那么更新配置就很麻烦,使用ConfigMap可以友好的进行配置共享。

mnasd的博客 5087

排除 AcroForm 中 JavaScript 脚本的 Bug

本文介绍了Acrobat JavaScript脚本故障排除的基本方法。首先应检查控制台窗口的错误报告,通过具体示例演示了5类常见错误:语法错误(如缺少大括号)、未终止字符串、未定义变量、运算符混淆及变量作用域问题,并逐步给出修复方案。文章还提供了调试流程UML图和实用经验总结,强调关注细节(如分隔符匹配)、正确使用运算符和变量作用域等要点。最后建议采用系统化调试方法,包括关闭/重新打开表单等完整性测试。

小猫三两只。 1506

容器学习04-kubernetes(k8s)

本文介绍了Kubernetes(K8s)集群的部署过程,包括控制节点和工作节点的配置。主要内容包含:1.K8s概述及集群架构;2.控制节点部署步骤,包括环境准备、containerd安装、kubeadm配置及Calico网络插件安装;3.工作节点加入集群的方法;4.部署完成后的验证方式。通过详细的配置说明和操作命令,帮助学习者完成K8s集群的搭建,为后续学习打下基础。文中特别强调了生产环境与测试环境的配置差异,并提供了国内镜像源的优化方案。

qq_57867224的博客 1002

用VSCode搭建Vue.js开发环境及Vue.js第一个应用

用VSCode搭建Vue.js开发环境及Vue.js第一个应用

m0_61961937的博客 1万+

TI毫米波雷达人体生命体征(呼吸、心跳)信号提取算法(IWR6843ISK+DCA1000EVM)

本篇内容介绍的算法主要为传统的提取算法,但可实现在1m内呈现良好的检测效果,能够提取出非常可观的呼吸和心跳波形,但在超出1m的距离后便不适用这个算法了。远距离检测呼吸和心跳始终是这个领域一个很大的挑战。要实现远距离检测可在提取相位信号、分离呼吸和心跳信号上进行改进处理,例如线性解调提取相位、改进的VMD分离呼吸和心跳算法。

m0_61934621的博客 3万+

在Ubuntu 22.04上搭建Kubernetes集群

Kubernetes(常简称为 K8s)是一个强大的开源平台,用于管理容器化应用程序的部署、扩展和运行。它最初由 Google 设计并捐赠给 Cloud Native Computing Foundation(CNCF)来维护,现在已经成为容器编排领域的事实标准。

weixin_53510183的博客 2051

AI工作流革命:从n8n到Sora2,揭秘自动化视频创作的底层逻辑

本文深入探讨了AI工作流在自动化视频创作中的应用,重点介绍了n8n、Coze和Sora2的组合如何实现从链接输入到视频输出的全流程自动化。通过三层架构解析、关键技术模块优化及成本控制策略,这套方案显著提升了视频生产效率,适用于电商、热点追踪等多种场景。

gg901的博客 1090

【Kubernetes】k8s 部署指南

介绍了 k8s 在 windows 环境的安装,以及如何使用 k8s 来部署一个 Go web 应用

weixin_62533201的博客 2517

AUTOSAR知识点 之 XCP (二):XCP基础概念

学习XCP的过程中,对XCP的基本概念要做一个全面的认知,因为里面有很多缩写以及难以理解的点,假设对此模模糊糊一知半解,那么对整个协议栈的认知会遇到极大的障碍。XCP的信号流传输图示如下XCP 标准主要分为 5 个部分:这部分提供了对于协议的一个概况介绍,包括 XCP 的功能和基础性内容。这部分内容对协议层进行了详细的规范和说明。

梦想技术家 2772

使用 MATLAB/Simulink + Communications Toolbox + 5G Toolbox,构建一个2×2 MIMO-OFDM通信系统

本文通过Simulink+CommunicationsToolbox构建2×2 MIMO-OFDM通信系统,重点实现信道均衡滤波器(ZF与MMSE)的设计与应用。详细介绍了系统架构、建模步骤(包括信道估计、均衡器实现)和仿真场景设计,通过BER、星座图和EVM对比分析验证了MMSE均衡器在抑制噪声和信号恢复方面的优势。文章总结了MIMO均衡的核心原理与实践经验,并提出了扩展至大规模MIMO、深度学习均衡器等优化方向,为无线通信系统设计提供实用指导。

amy_mhd的博客 127

kubernetes(k8s)初学习

k8s初学习-部署环境、了解docker

m0_52021466的博客 984

1、动作捕捉技术:概述与历史

本博文全面介绍了动作捕捉技术的概念、历史演变、类型分类以及完整的工作流程。从早期的连续摄影技术到现代数字动作捕捉系统,文章深入探讨了光学、磁性和机械动作捕捉系统的优缺点及适用场景,并详细解析了动作捕捉数据的生成原理与数学基础。此外,还涵盖了特殊部位如手部、面部和木偶的动作捕捉方法,并讨论了动作捕捉在动画制作、虚拟现实、医疗康复等领域的广泛应用与发展前景。

apple5的专栏 221

【K8s】K8s是什么,一文带你了解kubernetes

【K8s】K8s是什么,一文带你了解kubernetes

2201_75366661的博客 1万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

在Ubuntu22.04 LTS上搭建Kubernetes集群

在Ubuntu22.04.4上安装Kubernetes v1.28.7,步骤超详细

XiaoHH的博客 7789

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

上一篇: 设计模式——基于容器的分布式系统
下一篇: 三分钟将文集转成在线电子书
老胡的储物柜
博客等级 码龄12年 1145粉丝 284原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值