Kubernetes Pod的配置管理 ConfigMap和Secret

目录

前言

一、为什么需要配置管理

二、使用ConfigMap管理Pod的配置信息

2.1 创建ConfigMap(4种方式)

2.1.1 指定ConfigMap的参数创建

2.1.2 指定配置文件创建ConfigMap

2.1.3 通过一个文件内的多个键值对创建ConfigMap

2.1.4 yaml文件创建ConfigMap

2.2 使用ConfigMap(2种方式)

2.2.1 环境变量evn

2.2.2 数据卷volume

2.3 ConfigMap的动态更新(数据卷volume方式才支持动态更新)

三、使用Secret管理Pod的配置信息

3.1 创建Secret

3.1.1 账号密码文件创建

3.1.2 yaml文件创建

3.2 使用Secret

3.2.1 环境变量env使用

3.2.2 数据卷volume使用


前言

        当镜像制作完成后被用来创建Pod时,如果需要修改镜像中的一些参数值则比较麻烦——需要重新制作镜像。能否让镜像根据实际的需要,自动读取响应的配置信息呢?这时就需要使用Kubernetes的配置管理。

一、为什么需要配置管理

        在实际的应用开发过程中会遇到这样的情况:在开发Web应用时,在开发环境需要链接M有SQL数据库;而在生产环境中需要链接Redis数据库,这两套相互独立的环境。就需要为应用指定不同的参数来满足实际的要求。如果不能很好的管理这些配置信息,则运维工作将变得无比烦恼。

        为了解决这样的问题,Kubernetes提供了自己的解决方案,它将配置信息作为一种独立的资源存入配置中心,并将其以注入的方式提供给Pod使用。如果更新了配置中心的配置信息,则Pod会自动加载更新后的配置信息。Kubernetes主要通过ConfigMap和Secret两种方式来实现配置信息的管理。

二、使用ConfigMap管理Pod的配置信息

        ConfigMap是用来存储配置信息的Kubernetes资源对象。ConfigMap采用明文的方式将所有的配置信息都存储在ETCD中。在ConfigMap创建成功后,就可以在Pod中使用ConfigMap了。

2.1 创建ConfigMap(4种方式)

2.1.1 指定ConfigMap的参数创建

创建

 kubectl create cm demo-configmap1 \
> --from-literal=db.host=localhost \
> --from-literal=db.port=3306 \
> --from-literal=user=admin \
> --from-literal=password=123456

configmap/demo-configmap1 created

查看 

 [root@master activemq-cluster]# kubectl get cm
NAME               DATA   AGE
demo-configmap1    4      115s

[root@master activemq-cluster]# kubectl describe cm demo-configmap1
Name:         demo-configmap1
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
db.host:
----
localhost
db.port:
----
3306
password:
----
123456
user:
----
admin

BinaryData
====

Events:  <none>
 

2.1.2 指定配置文件创建ConfigMap

[root@master ~]# tree configmap-demo/
configmap-demo/
├── mysql.properties
└── redis.properties

[root@master ~]# cat configmap-demo/redis.properties 
redis.host=127.0.0.1
redis.port=6379
redis.password=123456

[root@master ~]# cat configmap-demo/mysql.properties 
mysql.host=127.0.0.1
mysql.port=3306
mysql.password=123456

创建configmap

[root@master ~]# kubectl create cm demo-configmap2 --from-file=./configmap-demo/
configmap/demo-configmap2 created

查看

[root@master ~]# kubectl describe cm demo-configmap2
Name:         demo-configmap2
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
mysql.properties:
----
mysql.host=127.0.0.1
mysql.port=3306
mysql.password=123456

redis.properties:
----
redis.host=127.0.0.1
redis.port=6379
redis.password=123456

BinaryData
====

Events:  <none>
 

2.1.3 通过一个文件内的多个键值对创建ConfigMap

[root@master configmap-demo3]# cat << EOF > env-config.txt
> db.host=localhost
> db.port=3306
> user=admin
> password=123456
> EOF
[root@master configmap-demo3]# kubectl create cm demo-configmap3 --from-env-file=env-config.txt
configmap/demo-configmap3 created
[root@master configmap-demo3]# kubectl describe cm demo-configmap3
Name:         demo-configmap3
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
user:
----
admin
db.host:
----
localhost
db.port:
----
3306
password:
----
123456

BinaryData
====

Events:  <none>
 

2.1.4 yaml文件创建ConfigMap

这里展示了2种写法

[root@master configmap-demo4]# cat config.yaml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: demo-configmap4
data:
  db.host: localhost
  db.port: "3306"
  user: |
    admin
  password: |
    "123456"
[root@master configmap-demo4]# kubectl apply -f config.yaml 
configmap/demo-configmap4 created
 

查看

[root@master configmap-demo4]# kubectl describe cm demo-configmap4
Name:         demo-configmap4
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
db.host:
----
localhost
db.port:
----
3306
password:
----
"123456"

user:
----
admin


BinaryData
====

Events:  <none>
 

2.2 使用ConfigMap(2种方式)

2.2.1 环境变量evn

[root@master configmap]# cat configmap-usage01.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: configmap-usage01
spec:
  containers:
  - name: busybox
    image: busybox
    imagePullPolicy: IfNotPresent
    command: [ "/bin/sh", "-c", "echo $(HOST) $(PORT)" ]
    env:
      - name: HOST
        valueFrom:
          configMapKeyRef:
            name: demo-configmap4   
# configmap的name
            key: db.host                        # configmap中的key值
      - name: PORT
        valueFrom:
          configMapKeyRef:
            name: demo-configmap4
            key: db.port

  restartPolicy: Never
[root@master configmap]# kubectl apply -f configmap-usage01.yaml 
pod/configmap-usage01 created

查看日志 (host 和ip均读入容器内)

[root@master configmap]# kubectl logs -f configmap-usage01
localhost 3306
 

2.2.2 数据卷volume

[root@master configmap]# cat configmap-usage02.yaml 
apiVersion: v1
kind: Pod
metadata: 
  name: configmap-usage02
spec:
  containers:
  - name: busybox
    image: busybox
    imagePullPolicy: IfNotPresent
    command: [ "/bin/sh", "-c", "cat /etc/config/redis.properties && sleep 200000" ] 
    volumeMounts:
    - name: config-volume
      mountPath:/etc/config

      #不写subPath 挂在的时候会把/etc/config文件清空,下边配置会只挂在redis.properties文件到该目录下

      #mountPath: /etc/config/redis.properties
      #subPath: redis.properties

  volumes:
  - name: config-volume
    configMap:
      name: demo-configmap2

      # items配置要挂在到卷的文件,不配置表示全部挂在

      #items:

      #  - key: redis.properties   # configMap对应的key

      #    path: redis.properties  # 重新映射的文件名

      
  restartPolicy: Never
 

Kubernetes中安装部署ActiveMQ集群(手把手式记录)-CSDN博客 可参照第三点的案例配置

2.3 ConfigMap的动态更新(数据卷volume方式才支持动态更新)

案例演示

[root@master share]# vim configmap-usage.yaml
i

apiVersion: v1
kind: Pod
metadata:
  name: configmap-usage
spec:
  containers:
  - name: busybox
    image: busybox
    command: ['sh', '-c', 'watch -n 2 "cat /etc/config/redis.properties"']
    volumeMounts:
    - name: config-volume
      mountPath: /etc/config
  volumes:
    - name: config-volume
      configMap: 
        name: demo-configmap2

         
  restartPolicy: Never

查看日志输出,标识成功使用configMap

[root@master share]# kubectl get cm demo-configmap -o yaml > demo-configmap.yaml # 这里每次修改都要重新执行,基于版本修改
[root@master share]# vi demo-configmap.yaml

apiVersion: v1
data:
  mysql.properties: |
    mysql.host=127.0.0.1
    mysql.port=3306
    mysql.password=123456
  redis.properties: |
    redis.host=localhost  # 这里修改了
    redis.port=6379
    redis.password=123456
kind: ConfigMap
metadata:
  creationTimestamp: "2023-04-18T01:55:07Z"
  name: demo-configmap
  namespace: default
  resourceVersion: "2544156"
  uid: adfd480b-d926-4c77-bba2-73b291c6e0b3
~       

   #执行命令修改   
[root@master share]# kubectl apply -f demo-configmap.yaml 
# 查看修改成功
[root@master share]# kubectl describe cm demo-configmap
                                                                 

查看pod打印日志

[root@master share]# kubectl logs configmap-usage
# 前面文件设置每2秒钟查看一次,这里过几秒中后会查看到配置信息已经被修改,这也实现了动态配置功能
Every 2.0s: cat /etc/config/redis.properties                2023-04-18 04:02:27

redis.host=127.0.0.11
redis.port=6379
redis.password=123456

三、使用Secret管理Pod的配置信息

        Secret也是Kubernetes配置管理管理的一种方式,它采用Base64编码机制保存配置信息。与ConfigMap不同的是,Secret中包含敏感的信息,例如用户的登录密码、Token等。这些敏感信息使用Secret来保存,可以更好的控制他们的用途,并降低意外暴露的风险。在成功创建Secret后,可以通过环境变量或数据卷的方式在Pod中使用它。

3.1 创建Secret

3.1.1 账号密码文件创建

[root@master secret]# echo dolphinchen > username.txt
[root@master secret]# echo password123 > password.txt
[root@master secret]# ls
password.txt  username.txt
[root@master secret]# kubectl create secret generic demo-secret1 --from-file=username.txt --from-file=password.txt
secret/demo-secret1 created
[root@master secret]# kubectl get secret
NAME                  TYPE                                  DATA   AGE
default-token-bdv4x   kubernetes.io/service-account-token   3      19d
demo-secret1          Opaque                                2      6s
[root@master secret]# kubectl describe secret demo-secret1
Name:         demo-secret1
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  Opaque

Data
====
password.txt:  12 bytes
username.txt:  12 bytes
 

3.1.2 yaml文件创建

由于Secret是采用Base64编码机制来保存配置信息的,因此在创建yaml文件前,需要先得到配置信息的Base 64编码。

  • 得到账号“admin”和密码“hello123”的Base64编码。

[root@master secret]# echo 'admin' | base64
YWRtaW4K
[root@master secret]# echo 'hello123' | base64
aGVsbG8xMjMK
 

  • 创建demo-secret2.yaml文件

[root@master secret]# cat demo-secret2.yaml 
apiVersion: v1
kind: Secret
metadata:
  name: demo-secret2
type: Opaque
data:
  username: YWRtaW4K
  password: aGVsbG8xMjMK
 

  • 执行命令创建Secret

[root@master secret]# kubectl apply -f demo-secret2.yaml 
secret/demo-secret2 created
[root@master secret]# kubectl get secret
NAME                  TYPE                                  DATA   AGE
default-token-bdv4x   kubernetes.io/service-account-token   3      19d
demo-secret1          Opaque                                2      7m56s
demo-secret2          Opaque    

3.2 使用Secret

3.2.1 环境变量env使用

  • secret-usage01.yaml创建

[root@master secret]# cat secret-usage01.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: secret-usage01
spec:
  containers:
  - name: secret-usage01
    image: nginx
    imagePullPolicy: IfNotPresent
    env:
      - name: USERNAME
        valueFrom:
          secretKeyRef:
            name: demo-secret2
            key: username

      - name: PASSWORD
        valueFrom:
          secretKeyRef:
            name: demo-secret2
            key: password
  restartPolicy: Never

  • 创建Pod

[root@master secret]# kubectl apply -f secret-usage01.yaml 
pod/secret-usage01 created

  • 进入容器查看变量信息

[root@master secret]# kubectl exec -it secret-usage01 /bin/bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@secret-usage01:/# echo $USERNAME
admin
root@secret-usage01:/# echo $PASSWORD
hello123

3.2.2 数据卷volume使用

  • 创建secret-usage02.yaml

[root@master secret]# cat secret-usage02.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: secret-usage02
spec:
  containers:
  - name: secret-usage02
    image: redis
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: foo
      mountPath: /etc/foo
      readOnly: true
  volumes:
  - name: foo
    secret:
      secretName: demo-secret2

 

  • 执行命令创建pod

[root@master secret]# kubectl apply -f secret-usage02.yaml 
pod/secret-usage02 created

  • kubectl exec 命令进入容器查看

[root@master secret]# kubectl exec -it secret-usage02 bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@secret-usage02:/data# cd /etc/foo/
root@secret-usage02:/etc/foo# ls
password  username
root@secret-usage02:/etc/foo# cat username 
admin
root@secret-usage02:/etc/foo# cat password 
hello123
 

四、secret类型之私有镜像仓库使用

        创建Docker harbor的secret信息:

         因为,k8s拉取镜像与Docker拉取镜像是不同方式,所以k8s需要创建一个属于自己的拉取镜像的方式。

         k8s拉取公开项目可以直接拉取,拉取私有项目需要配置secret密码

docker-registry: 创建一个给Docker registry容器镜像仓库使用的secret

generic: 从本地file,directory或者literal value创建一个secret(这是大多数情况使用的),也就是资源清单中的type:Opaque是一个意思

tls: 创建一个TLS secret

4.1  响应式创建secret资源 

[K8S@k8s-master ~]$ kubectl create secret docker-registry dolphin-harbor --docker-username=admin --docker-password=Harbor12345 --docker-email=123@admin.com --docker-server=core.harbor.eastcom.com:30710

secret/dolphin-harbor created
[K8S@k8s-master ~]$ kubectl get secret
NAME                  TYPE                                  DATA   AGE
default-token-l2nz8   kubernetes.io/service-account-token   3      422d
dolphin-harbor        kubernetes.io/dockerconfigjson        1      13s
 

 4.2  拉取harbor私有仓库测试

  4.2.1 私有仓库镜像

  4.2.2 创建pod测试文件(不配置secret docker-registry)

镜像拉取失败

[K8S@k8s-master ~]$ cat pod.yaml 
apiVersion: v1
kind: Pod
metadata: 
  name: pod-secret-02
spec:
  containers:
  - name: c1
    image: core.harbor.eastcom.com:30710/nginx:latest
 

[K8S@k8s-master ~]$ kubectl apply -f pod.yaml 
pod/pod-secret-02 created
[K8S@k8s-master ~]$ kubectl get pod
NAME                                      READY   STATUS         RESTARTS      AGE
mysql-0                                   1/1     Running        0             10d
nfs-client-provisioner-76b5dc7886-scf79   1/1     Running        7 (10d ago)   36d
nfs-devops-provisioner-866787c4d7-k52rq   1/1     Running        7 (10d ago)   35d
pod-secret-02                             0/1     ErrImagePull   0             4s
ubuntu                                    1/1     Running        0             27h

4.2.3 imagePullSecret 指定secret docker-registry拉取镜像 

[K8S@k8s-master ~]$ cat pod.yaml 
apiVersion: v1
kind: Pod
metadata: 
  name: pod-secret-02
spec:
  imagePullSecrets:
  - name: dolphin-harbor

  containers:
  - name: c1
    image: core.harbor.eastcom.com:30710/dolphintest/nginx:latest
 

 镜像拉取成功

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android 性能优化(七):APK安装包体积优化

包体积优化重要性 移动 App 特别关注投放转化率指标&#xff0c;而 App 包体积是影响用户新增的重要因素&#xff0c;而 App 的包体积又是影响投放转化率的重要因素。 Google 2016 年公布的研究报告显示&#xff0c;包体积每上升 6MB 就会带来下载转化率降低 1%&#xff0c; …

114 接口中幂等性的保证

前言 同样是 面试问题 如何确保接口的 幂等性 幂等是一个 较为抽象的概念, 多次重复访问, 不会导致业务逻辑的异常 这里从增删改查, 几个方面列一下 一般来说, 我们核心需要关注的就是 新增 和 更新 对于 增加元素, 首先针对唯一约束进行校验, 然后再处理新增的相关业…

二刷大数据(三)- Flink1.17

目录 Flink概念与SparkStreaming区别分层API 工作流程部署模式**Local Mode****Standalone Mode****YARN Mode****Kubernetes Mode****Application Mode** 运行架构stand alone 核心概念算子链任务槽 窗口窗口**窗口的目的与作用****时间窗口&#xff08;Time Windows&#xff…

vue3中web前端JS动画案例(一)

上述案例主要使用定时器&#xff0c;和绝对定位产生动画 <script setup> import { ref, onMounted, watch } from vue // ----------------------- 01 js 动画介绍--------------------- // 1、匀速运动 // 2、缓动运动&#xff08;常见&#xff09; // 3、透明度运动 //…

抖店底层逻辑,关于5个“为什么”的答案~

我是王路飞。 很多人对抖店的底层逻辑有一种抗拒心态&#xff0c;不想学习和了解。 认为做抖店不就是开店卖货嘛&#xff0c;什么火、什么有热度卖什么就好了&#xff0c;了解那么多“理论知识”有什么用呢&#xff1f; 但往往正是这些基础理论&#xff0c;底层逻辑&#xf…

Linux系统一键安装DataEase结合内网穿透实现公网访问本地WebUI界面

文章目录 前言1. 安装DataEase2. 本地访问测试3. 安装 cpolar内网穿透软件4. 配置DataEase公网访问地址5. 公网远程访问Data Ease6. 固定Data Ease公网地址 前言 DataEase 是开源的数据可视化分析工具&#xff0c;帮助用户快速分析数据并洞察业务趋势&#xff0c;从而实现业务…

PMM2 MySQL监控管理工具

目录 1. PMM介绍 2. 安装PMM服务端 2.1 安装docker 2.1.1 下载docker 2.1.2 上传docker包 2.1.3 启动守护进程 2.1.4 查看docker状态 2.2 安装PMM 2.2.1 下载镜像 2.2.2 load镜像 2.2.3 查看镜像 2.2.4 创建容器 2.2.5 运行镜像 2.2.6 验证PMM服务器 2.2.7 删除…

MySQL行格式(row format)

MySQL行格式&#xff08;row format&#xff09; 表的行格式决定了其行的物理存储方式&#xff0c;这反过来又会影响查询和 DML 操作的性能。随着单个磁盘页面容纳更多行&#xff0c;查询和索引查找可以更快地工作&#xff0c;缓冲池中需要的高速缓存内存更少&#xff0c;写出…

【进阶六】Python实现SDVRPTW常见求解算法——离散粒子群算法(DPSO)

基于python语言&#xff0c;采用经典离散粒子群算法&#xff08;DPSO&#xff09;对 带硬时间窗的需求拆分车辆路径规划问题&#xff08;SDVRPTW&#xff09; 进行求解。 目录 往期优质资源1. 适用场景2. 代码调整2.1 需求拆分2.2 需求拆分后的服务时长取值问题 3. 求解结果4. …

.netcore+vue新生分班系统的设计与实现

.netcore vue新生分班系统的设计与实现说明文档 运行前附加数据库.mdf&#xff08;或sql生成数据库&#xff09; 主要技术&#xff1a; 基于.net core架构和mysql数据库vue 东北石油大学新生分班系统的设计与实现 功能模块&#xff1a; 登录 注册学生 忘记密码 系统首顶 个…

fatal error C1001: An internal error has occurred in the compiler

VS2008驱动项目A&#xff0c;集成一个Wzarid生成的驱动LIB项目B&#xff0c;在编译64位驱动时,出现以下错误&#xff1a; 1>------ Build started: Project: xxxx, Configuration: Release x64 ------ 1>Linking... 1>fatal error C1001: An internal error has occu…

AI时代下,普通人能怎么做?

AI玩法千千万&#xff0c;你已经知道了多少呢&#xff1f;是否已经实践起来&#xff1f; 大家好&#xff0c;我是程序员影子 | 全网同名 一名致力于帮助更多朋友快速入门编程的程序猿 今天&#xff0c;我将以小白入门的视角带着大家了解一下目前火热的AI实践玩法&#xff1b…

SQL --索引

索引 INDEX 伪列 伪装起来的列&#xff0c;不容易被看见&#xff0c;要特意查询才能看见 ROWNUM&#xff1a; 是对查询结果自动生成的一组连续的自然数序号。 SELECT emp.*,ROWNUM FROM emp例题&#xff1a;查询emp表中&#xff0c;前三个员工 SELECT * FROM * from emp w…

工业控制(ICS)---MMS

MMS 工控领域的TCP协议&#xff0c;有时wireshark会将response包解析为tcp协议&#xff0c;影响做题&#xff0c;如果筛选mms时出现连续request包&#xff0c;考虑wireshark解析错误&#xff0c;将筛选条件删除手动看一下 initiate&#xff08;可以理解为握手&#xff09; i…

QQ浏览器模仿Arc,推垂直工作栏引领新体验潮流|TodayAI

之前在硅谷大受欢迎的AI浏览器Arc一经推出就立即引起了广泛关注&#xff0c;Arc自称不仅仅是一款浏览器&#xff0c;而且还是一个“与互联网同规模的平台”。如今&#xff0c;中国的QQ浏览器也想借Arc的热潮之势&#xff0c;同样采用了类似Arc的垂直工作栏&#xff0c;声称能够…

【总结】jdk安装配置后,执行报错java: error while loading shared libraries: libjli.so

目录 问题现象排查分析解决方法 问题现象 安装jdk后&#xff0c;配置好了环境变量&#xff0c;但执行java -vesion命令时&#xff0c;报错。 java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory 看起来这个…

就业分析丨云计算数通双认证学员,入职海外年薪50W

扫码联系誉天猎头部&#xff0c;可享高薪岗位内推、职业规划岗前测评等服务 誉天&#xff0c;我的职业启航之地 大家好&#xff0c;我是誉天学员万*,回想起那段为梦想而奋斗的日子&#xff0c;我的心中充满了感慨。誉天在行业内一直深受好评&#xff0c;在我心中播下了技能的种…

14.多态(多态的构成条件、虚函数的重写、抽象类也就是纯虚函数的类、虚函数表、单继承和多继承的虚函数表)

1.多态的概念 ​ 多态的概念&#xff1a;通俗来说&#xff0c;就是多种形态&#xff0c;具体点就是去完成某个行为&#xff0c;当不同的对象去完成时会产生出不同的状态。 举个例子&#xff1a;比如买票这个行为&#xff0c;当普通人买票时&#xff0c;是全价买票&#xff1b;…

java动态代理--JDK代理

1.概述 JDK动态代理&#xff1a;只能代理实现了接口的类&#xff0c;代理对象是实现了目标对象所有接口的代理类 使用java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口来创建代理对象&#xff0c;工作通过反射机制完成。 2.实现接口InvocationHandler …

目标检测——防护装备数据集

一、重要性及意义 防护装备中的头盔和背心检测具有至关重要的重要性和深远的意义&#xff0c;主要体现在以下几个方面&#xff1a; 首先&#xff0c;它们对于保护工作人员的人身安全起着至关重要的作用。在各类工作环境中&#xff0c;尤其是那些涉及高空作业、机械操作或交通…