K8s学习八(配置与存储_配置)

配置与存储

配置管理

ConfigMap
ConfigMap的创建
  • 一般用于去存储 Pod 中应用所需的一些配置信息,或者环境变量,将配置于 Pod 分开,避免应为修改配置导致还需要重新构建 镜像与容器。
  • configmap缩写为cm
  • kubectl create cm -h来查看创建命令
  1. 指定目录去创建
  • 比如我在config目录中创建test目录,在里面简单配置两个配置文件,db.properties , redis.properties
  • 在config目录执行命令kubectl create configmap test-dir-config --from-file=test/
  1. 基于指定的文件去创建(用的最多)
  • 在test目录下面创建application.yaml,然后下面进行操作
  • 执行kubectl create cm spring-test-yaml --from-file=/root/k8s/config/test/application.yaml
  • 这样描述cm之后里面信息的文件名就是application.yaml,要是想改变文件名可以执行kubectl create cm spring-test-yaml --from-file=app.yaml=/root/k8s/config/test/application.yaml,就变成了app.yaml
  • 参数比较少时,可以自己指定参数,执行kubectl create cm spring-test-yaml --from-literal=username=root --from-literal=password=admin
cm环境变量加载与配置文件加载
cm环境变量加载
  • 配置文件如下所示:
apiVersion: v1
kind: Pod
metadata:name: test-env-cm
spec:containers:- name: env-testimage: alpinecommand: ["/bin/bash", "-c", "env;sleep 3600"]imagePullPolicy: IfNotPresentenv:- name: JAVA_VM_OPTSvalueFrom:configMapKeyRef:name: test-env-config # config的名字key: JAVA_OPTS_TEST # 表示从上面name的cm中获取名字为key的value,将其赋值给本地环境变
量 JAVA_VM_OPTS,也就是name为JAVA_VM_OPTS的值是从test-env-config这个cm的JAVA_OPTS_TEST这个key取
到的值给他- name: APPvalueFrom:configMapKeyRef:name: test-env-config # config的名字key: APP_NAMErestartPolicy: Never# 下面是用到的config:
root@master:~/k8s/config# kubectl describe cm test-env-config
Name:         test-env-config
Namespace:    default
Labels:       <none>
Annotations:  <none>Data
====
APP_NAME:
----
springboot_env-test
JAVA_OPTS_TEST:
----
-Xms512m -Xmx512mBinaryData
====Events:  <none>
cm配置文件加载
  • 配置文件如下所示:
apiVersion: v1
kind: Pod
metadata:name: test-configfile-pod
spec:containers:- name: config-testimage: alpinecommand: ["/bin/sh", "-c", "env;sleep 3600"]imagePullPolicy: IfNotPresentenv:- name: JAVA_VM_OPTSvalueFrom:configMapKeyRef:name: test-env-config # config的名字key: JAVA_OPTS_TEST # 表示从上面name的cm中获取名字为key的value,将其赋值给本地环境变
量 JAVA_VM_OPTS,也就是name为JAVA_VM_OPTS的值是从test-env-config这个cm的JAVA_OPTS_TEST这个key取
到的值给他- name: APPvalueFrom:configMapKeyRef:name: test-env-config # config的名字key: APP_NAMEvolumeMounts: # 加载数据卷- name: db-config # 表示加载volume属性中的哪个数据卷mountPath: "/usr/local/mysql/conf" # 将想要的数据卷中的文件加载到哪个目录下readOnly: true # 是否只读volumes: # 数据卷挂载,可以是configmap和secret- name: db-config # 数据卷的名字,随意设置configMap: # 数据卷的类型为configmapname: test-dir-config  # configmap的名字,必须跟想要加载的cm名字相同items: # 对configmap中的key进行映射,如果不指定的话,会默认将configmap中所有的key全部>转换为一个个同名的文件,这里指定的话可以将path的命名和key不一样- key: "db.properties" # configmap中的keypath: "db.properties" # 将该key的值转换为文件restartPolicy: Never#  对configmap中的key进行映射,如果不指定的话,会默认将configmap中所有的key全部>转换为一个个同名的文件,这里指定的话可以将path的命名和key不一样
# 也就是原来的key为db.xxx,可以将path写为db.properties# 上面就实现了cm的配置文件加载
  • 进入容器之后查看
    在这里插入图片描述

  • 发现只有db.properties,也就是定义了items之后只会加载path上的那个文件,如果不定义则会有所有文件。

加密数据配置Secret
  • Secret 的应用,kubectl create secret -h查看命令,有三种形式如下。用第一种比较多
    在这里插入图片描述

  • 有一个问题是,如果有特殊字符的话,创建后的可能和创建时输入的不一样:

  • 比如kubectl create secret generic orig-secret --from-literal=username=admin --from-literal=password=ds@!30,这里password有特殊字符,所以创建后的可能不一样
    在这里插入图片描述

  • 当创建好之后,可以直接输入名称来查看,发现显示的是字节数
    在这里插入图片描述

Docker仓库Secret配置
  • 这里听了个大概,没有实操

  • 可以看帮助,了解一下大概使用方法kubectl create secret docker-registry -h
    在这里插入图片描述

  • 常用场景就是配置一个secret,里面有用户名和密码,然后配置文件,里面用到刚才这个secret,如果拉取镜像没有登陆的话,会使用配置文件给出的这个secret里的信息去登陆然后拉取镜像

  • 这里直接上配置文件

apiVersion: v1
kind: Pod
metadata:name: private-image-pull-pod
spec:imagePullSecrets:- name: harbor-secret # 意思就是当拉取镜像的时候,如果没有登陆,则会去找到harbor-secret这个Secret配置文件的用户名和密码去登陆。containers:- name: nginximage: 192.168.113.122:8858/opensource/nginx:1.9.1command: ["/bin/sh", "-c", "env;sleep 3600"]imagePullPolicy: IfNotPresentenv:- name: JAVA_VM_OPTSvalueFrom:configMapKeyRef:name: test-env-config # config的名字key: JAVA_OPTS_TEST # 表示从上面name的cm中获取名字为key的value,将其赋值给本地环境变
量 JAVA_VM_OPTS,也就是name为JAVA_VM_OPTS的值是从test-env-config这个cm的JAVA_OPTS_TEST这个key取
到的值给他- name: APPvalueFrom:configMapKeyRef:name: test-env-config # config的名字key: APP_NAMEvolumeMounts: # 加载数据卷- name: db-config # 表示加载volume属性中的哪个数据卷mountPath: "/usr/local/mysql/conf" # 将想要的数据卷中的文件加载到哪个目录下readOnly: true # 是否只读volumes: # 数据卷挂载,可以是configmap和secret- name: db-config # 数据卷的名字,随意设置configMap: # 数据卷的类型为configmapname: test-dir-config  # configmap的名字,必须跟想要加载的cm名字相同items: # 对configmap中的key进行映射,如果不指定的话,会默认将configmap中所有的key全部>转换为一个个同名的文件,这里指定的话可以将path的命名和key不一样- key: "db.properties" # configmap中的keypath: "db.properties" # 将该key的值转换为文件restartPolicy: Never
SubPath的使用

使用 ConfigMap 或 Secret 挂载到目录的时候,会将容器中源目录给覆盖掉,此时我们可能只想覆盖目录中的某一个文件,但是这样的操作会覆盖整个文件,因此需要使用到 SubPath配置方式:
定义 volumes 时需要增加 items 属性,配置 key 和 path,且 path 的值不能从 / 开始
在容器内的 volumeMounts 中增加 subPath 属性,该值与 volumes 中 items.path 的值相同
containers:......volumeMounts:- mountPath: /etc/nginx/nginx.conf # 挂载到容器哪里name: config-volume # 使用哪个 configmap 或 secretsubPath: etc/nginx/nginx.conf # 与 volumes.[0].items.path 相同
volumes:
- configMap:name: nginx-conf # configMap 名字items: # subPath 配置key: nginx.conf # configMap 中的文件名path: etc/nginx/nginx.conf # subPath 路径subpath后面跟的是volume的路径,这个路径是相对于 Volume 的根路径的,而不是绝对路径。
这样也就是将volume中的etc/nginx/nginx.conf文件挂载到容器里的/etc/nginx/nginx.conf下
ComfigMap的热更新
  • 我们通常会将项目的配置文件作为 configmap 然后挂载到 pod,那么如果更新 configmap 中的配置,会不会更新到 pod 中呢?

  • 这得分成几种情况:

    • 默认方式:会更新,更新周期是更新时间 + 缓存时间
    • subPath:不会更新
    • 变量形式:如果 pod 中的一个变量是从 configmap 或 secret 中得到,同样也是不会更新的(这里说的是pod将cm里的值当作变量,而不是当作volume挂载到pod中,后者容器中的应用程序可以直接读取这些文件来获取配置信息。)
  • 对于 subPath 的方式,我们可以取消 subPath 的使用,将配置文件挂载到一个不存在的目录,避免目录的覆盖,然后再利用软连接的形式,将该文件链接到目标位置,

  • 如下图,新创建一个文件夹目录之后,将subpath指到新目录,然后新目录创建一个软连接指到开始的那个目录,也能实现更改。

在这里插入图片描述

  • 但是如果目标位置原本就有文件,可能无法创建软链接,此时可以基于前面讲过的 postStart 操作执行删除命令,将默认的文件删除即可

第一种可以直接通过edit命令直接修改configmap

第二种通过replace替换

  • 由于 configmap 我们创建通常都是基于文件创建,并不会编写 yaml 配置文件,因此修改时我们也是直接修改配置文件,而 replace 是没有 --from-file参数的,因此无法实现基于源配置文件的替换,此时我们可以利用下方的命令实现

  • 该命令的重点在于 --dry-run参数,该参数的意思打印 yaml 文件,但不会将该文件发送给 apiserver,再结合 -o yaml输出 yaml 文件就可以得到一个配置好但是没有发给 apiserver 的文件,然后再结合 replace 监听控制台输出得到 yaml 数据即可实现替换.kubectl create cm test-dir-config --from-file=./test/ --dry-run -o yaml | kubectl replace -f-,输出的yaml文件作为输出当作后面管道符后面命令-f的输入。 也就是更改test文件夹里面的东西之后,然后管道符之前的是将修改后的保存成一个yaml文件,传到后面去进行修改

  • 这里不传给apiserver也就是不会生效,由于 --dry-run 参数,这个更新操作也是模拟的,不会真正应用到集群中的资源。

配置文件不可变
  • 跟上面的有出入,上面是更新,这里是不能改变。
  • 对于一些敏感服务的配置文件,在线上有时是不允许修改的,此时在pod中配置 configmap 时可以设置 immutable: true 来禁止修改,这个命令是与最外层的命令是同级的。

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

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

相关文章

三星:HBM4的16层堆叠技术验证成功

随着人工智能、大数据分析、云计算及高端图形处理等领域对高速、高带宽存储需求的激增&#xff0c;下一代高带宽内存&#xff08;High Bandwidth Memory, HBM&#xff09;——HBM4已成为全球存储芯片巨头三星、SK海力士和美光竞相追逐的技术高地。 随着AI、机器学习以及高性能…

【JavaWeb】Day38.MySQL概述——数据库设计-DQL

数据库设计——DQL 介绍 DQL英文全称是Data Query Language(数据查询语言)&#xff0c;用来查询数据库表中的记录。 查询关键字&#xff1a;SELECT 查询操作是所有SQL语句当中最为常见&#xff0c;也是最为重要的操作。在一个正常的业务系统中&#xff0c;查询操作的使用频次…

kafka(四)——生产者流程分析(c++)

前言 kafka生产者负责将数据发布到kafka集群的主题&#xff1b;kafka生产者消息发送方式有两种&#xff1a; 同步发送异步回调发送 流程 流程说明&#xff1a; Kafka Producer整体可看作是一个异步处理操作&#xff1b;消息发送过程中涉及两个线程&#xff1a;main线程和se…

Java变量详解

​ 这里写目录标题 第一章、Java中的变量分类1.1&#xff09;变量分类1.2&#xff09;成员变量分类1.3&#xff09;成员变量和局部变量的区别 第二章、成员变量详解2.1&#xff09;成员变量作用域/权限修饰符2.2&#xff09;成员变量和成员属性的区别2.3&#xff09;成员变量初…

为什么 GraphQL 是构建微服务的更好选择

关于使用REST还是GraphQL来构建微服务哪个更好&#xff0c;一直存在争论。这两种技术都有其支持者和批评者&#xff0c;但当涉及微服务架构的特定需求时&#xff0c;GraphQL 成为明显的领先者。原因如下。 了解 RESTful 的关注点 虽然 REST 多年来一直是首选 API 风格&#x…

蓝桥杯 历届真题 时间显示【第十二届】【省赛】【C组】

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s #include<bits/stdc.h> #define int long long using namespace std; const int N 1e510; int n,m,t,d; int a[2][N],b[N]; //…

数据库关系模式三元及以上分解无损连接判断(表格法)

例题 1.首先构造初始表&#xff0c;如下表所示。 A B C D E ABC a1 a2 a3 b14 b15 CD b21 b22 a3 a4 b15 DE b31 b32 b33 a4 a5 2.遍历函数依赖&#xff0c;对AB→C&#xff0c;因各元组的第一、二列没有相同的分量&#xff0c;所以表不改变。 3.由C→D…

chabot项目介绍

项目介绍 整体的目录如下所示&#xff1a; 上述的项目结构中出了model是必须的外&#xff0c;其他的都可以根据训练的代码参数传入进行调整&#xff0c;有些不需要一定存在data train.pkl:对原始训练语料进行tokenize之后的文件,存储一个list对象&#xff0c;list的每条数据表…

javaWeb物流信息网的设计与实现

摘要 本文讲述了基于JSP物流信息网的设计与实现。该系统使用java语言开发&#xff0c;使系统具有更好的平台性和可扩展性。 该系统实现了用户登录、注册、查询快递信息、快递公司注册成为合作伙伴以及系统管理员对信息进行管理等功能。系统的主要界面会将所有的服务排列好&…

【java基础-高级篇十】、注解

自定义目录 一、什么是注解二、常见的注解示例三、自定义 annotation四、JDK 中的元注解五、利用反射获取注解信息六、jdk8之后注解的新特性1、可重复注解2、类型注解 一、什么是注解 加在包,类, 构造器, 方法, 成员变量, 参数, 局部变量声明上面的特殊标记就称为注解未来的开…

力扣2- 两数相加

给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数都不会以 0 …

vmware和ubuntu的问题与解决

1.问题与对策 最近使用vmware安装ubuntu16和ubuntu20&#xff0c;遇到了挺多的问题&#xff0c;如下 ubuntu在用过多次后&#xff0c;重启后登录用户名后会出现花屏的现象。 解决方案如下 在键盘上同时按键&#xff1a;Ctrl Alt F4&#xff0c;进入命令行模式&#xff0c;…

基于深度学习的电动自行车头盔佩戴检测系统

文章目录 1. 文档说明2. 运行环境说明2.1 硬件配置2.2 软件配置2.3 程序依赖库 3. 基本环境配置3.1 软件安装3.1.1 集成开发环境安装与配置3.1.2 数据库安装与配置3.1.3 编程语言安装3.1.4 CUDA和cuDNN安装与配置3.1.5 机器学习库安装 3.2 依赖库安装 4. 运行程序资源下载地 1.…

Binder通信模型

Binder是Android最主要的进程间通信方式&#xff0c;下面简单认识一下它的通信模型&#xff0c;如下图所示 服务管理进程启动时会变成上下文管理者&#xff0c;在驱动层创建一个全局的binder_node对象binder_context_mgr_node记录进程信息&#xff0c;BpServiceManager中BpBind…

HarmonyOS实战开发-如何实现跨应用数据共享实例。

介绍 本示例实现了一个跨应用数据共享实例&#xff0c;分为联系人&#xff08;数据提供方&#xff09;和联系人助手&#xff08;数据使用方&#xff09;两部分&#xff1a;联系人支持联系人数据的增、删、改、查等功能&#xff1b;联系人助手支持同步联系人数据&#xff0c;当…

血细胞检测数据集 | 用于血细胞计数+检测的小规模数据集_已经整理成VOC格式_总共410张图

项目应用场景 面向血细胞检测计数数据集&#xff0c;已经整理成 VOC 格式&#xff0c;可以直接用于目标检测算法的训练&#xff0c;如 YOLO 等目标检测算法的训练。血细胞检测数据集图片质量好&#xff0c;可直接训练出一个血细胞检测模型&#xff0c;或者作为血细胞检测数据集…

AI智能分析盒子在工地的应用,提高工地管理效率和安全性

工地ai智能分析盒子是一种基于人工智能视觉分析技术的人工智能盒子&#xff0c;旨在提升工地作业区域的管理效率和保障作业人员的安全。通过最前沿的AI视觉算法、大数据&#xff0c;能够实时监控工地现场视频流画面&#xff0c;对施工工地人员的工作着装及日常作业行为进行规范…

1.C++编译过程

1.Linux 如何安装 C 编译环境 &#xff08;1&#xff09;安装 gcc 下载&#xff1a;sudo apt install gcc g 安装&#xff1a;gcc/g -v/--version其中 gcc 用于编译 C &#xff0c;g 用于编译 C 版本要 >4.8.5 这样才能使用 C11 的特性 &#xff08;2&#xff09; 使用…

【QT学习】4.对话框学习,浮动窗口,模态对话框,非模态对话框,消息框,文件对话框

1.浮动窗口 代码&#xff1a; //制作核心控件&#xff1a;文本编辑框QTextEdit* pTextEditnew QTextEdit;//制作浮动控件connect(pMenu1,&QMenu::triggered,[](QAction* pAction){qDebug()<<pAction->text()<<endl;if(pAction->text()"浮动控件&quo…

Vulnhub:DEVCONTAINER: 1

目录 信息收集 arp nmap nikto whatweb WEB 信息收集 dirmap 文件上传 提权 系统信息收集 横向提权 信息泄露 get root 信息收集 arp ┌──(root㉿ru)-[~/kali/vulnhub] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:50:56:2f:dd…