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
iapiVersion: v1
kind: Pod
metadata:name: configmap-usage
spec:containers:- name: busyboximage: busyboxcommand: ['sh', '-c', 'watch -n 2 "cat /etc/config/redis.properties"']volumeMounts:- name: config-volumemountPath: /etc/configvolumes:- name: config-volumeconfigMap: name: demo-configmap2restartPolicy: Never

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

[root@master share]# kubectl get cm demo-configmap -o yaml > demo-configmap.yaml # 这里每次修改都要重新执行,基于版本修改
[root@master share]# vi demo-configmap.yamlapiVersion: v1
data:mysql.properties: |mysql.host=127.0.0.1mysql.port=3306mysql.password=123456redis.properties: |redis.host=localhost  # 这里修改了redis.port=6379redis.password=123456
kind: ConfigMap
metadata:creationTimestamp: "2023-04-18T01:55:07Z"name: demo-configmapnamespace: defaultresourceVersion: "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:27redis.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
 

 镜像拉取成功

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

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

相关文章

环境多介质逸度模型实践技术与典型案例【代码】

随着污染物在各种环境中的迁移和转化&#xff0c;多介质污染物模型日益受到关注。在各类多介质模型中&#xff0c;基于逸度概念的逸度模型由于运用范围广&#xff0c;建模数据要求较低而广受欢迎。 专题一&#xff1a;基本理论 1.逸度的定义 2.逸度模型的基本原理 3.各介质…

Golang | Leetcode Golang题解之第36题有效的数独

题目&#xff1a; 题解&#xff1a; func isValidSudoku(board [][]byte) bool {var rows, columns [9][9]intvar subboxes [3][3][9]intfor i, row : range board {for j, c : range row {if c . {continue}index : c - 1rows[i][index]columns[j][index]subboxes[i/3][j/3]…

爆炸之linux-nacos2.0系列集群安装部署

一、环境配置 1、新建磁盘分区 fdisk /dev/vdb 2、创建文件系统 mkfs.xfs /dev/vdb13、创建挂载点&#xff1a; 在 / 目录下创建一个新的目录作为挂载点。/afc 目录 mkdir /afc4、挂载磁盘&#xff1a; 使用 mount 命令将磁盘挂载到新创建的目录。 mount /dev/vdb /afc5、…

用html写一个搜索页面

<!DOCTYPE html> <html lang"en" > <head><meta charset"UTF-8"><title>搜索框设计</title><link rel"stylesheet" href"./style.css"> </head> <body> <div class"se…

pytorch-手写数字识别之全连接层实现

目录 1. 背景2. nn.Linear线性层2. 实现MLP网络3. train4. 完整代码 1. 背景 上一篇https://blog.csdn.net/wyw0000/article/details/137622977?spm1001.2014.3001.5502中实现手撸代码的方式实现了手写数字识别&#xff0c;本文将使用pytorch的API实现。 2. nn.Linear线性层…

开发一个农场小游戏需要多少钱

开发一个农场小游戏的费用因多个因素而异&#xff0c;包括但不限于游戏的规模、复杂性、功能需求、设计复杂度、开发团队的规模和经验&#xff0c;以及项目的时间周期等。因此&#xff0c;无法给出确切的费用数字。 具体来说&#xff0c;游戏的复杂程度和包含的功能特性数量会直…

企业文档知识库建设,数据安全如何保障?

随着现代市场经济的高速发展&#xff0c;企业的竞争优势越来越多体现在人才和科技的优势。而随着员工流动率的提升&#xff0c;随之流失的则是员工积累多年的宝贵工作经验&#xff0c;如果缺乏有效的内部知识库的建设和管理&#xff0c;企业的竞争优势将难以维系。「企业网盘」…

Claude和chatgpt的区别

ChatGPT是OpenAI开发的人工智能的聊天机器人&#xff0c;它可以生成文章、代码并执行各种任务。是Open AI发布的第一款大语言模型&#xff0c;GPT4效果相比chatgpt大幅提升。尤其是最新版的模型&#xff0c;OpenAI几天前刚刚发布的GPT-4-Turbo-2024-04-09版本&#xff0c;大幅超…

架构设计-流程引擎的架构设计

1、什么是流程引擎 流程引擎是一个底层支撑平台&#xff0c;是为提供流程处理而开发设计的。流程引擎和流程应用&#xff0c;以及应用程序的关系如下图所示。 常见的支撑场景有&#xff1a;Workflow、BPM、流程编排等。本次分享&#xff0c;主要从 BPM 流程引擎切入&#xff0…

【前端】3. CSS【万字长文】

CSS 是什么 层叠样式表 (Cascading Style Sheets). CSS 能够对网页中元素位置的排版进行像素级精确控制, 实现美化页面的效果. 能够做到页面的样式和结构分离. CSS 就是 “东方四大邪术” 之化妆术. 基本语法规范 选择器 {一条/N条声明} 选择器决定针对谁修改 (找谁)声明决…

钉钉直播回放怎么下载到本地

钉钉直播回放如何下载到本地,本文就给大家解密如何下载到本地 工具我已经给大家打包好了 钉钉直播回放下载软件链接&#xff1a;https://pan.baidu.com/s/1_4NZLfENDxswI2ANsQVvpw?pwd1234 提取码&#xff1a;1234 --来自百度网盘超级会员V10的分享 1.首先解压好我给大家…

【Qt】Qt Hello World 程序

文章目录 1、Qt Hello World 程序1.1 使用按钮实现1.1.1 使用可视化方式实现 1.1.2 纯代码方式实现 label创建堆&#xff08;内存泄漏&#xff09;或者栈问题Qt基础类&#xff08;Qstring、Qvector、Qlist&#xff09;乱码问题零散知识 1、Qt Hello World 程序 1.1 使用按钮实…

Swin Transformer 浅析

Swin Transformer 浅析 文章目录 Swin Transformer 浅析引言Swin Transformer 的网络结构W-MSA 窗口多头注意力机制SW-MSA 滑动窗口多头注意力机制Patch Merging 图块合并 引言 因为ViT无法实现CNN中的层次化构建以及局部信息&#xff0c;由此微软团队提出了Swin Transformer来…

C语言(二维数组)

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸各位能阅读我的文章&#xff0c;诚请评论指点&#xff0c;关注收藏&#xff0c;欢迎欢迎~~ &#x1f4a5;个人主页&#xff1a;小羊在奋斗 &#x1f4a5;所属专栏&#xff1a;C语言 本系列文章为个人学习笔记&#x…

15.7 2011年42题真题讲解

2&#xff0c;4&#xff0c;6&#xff0c;8&#xff0c;11&#xff0c;13&#xff0c;15&#xff0c;17&#xff0c;19&#xff0c;20 可以推出题目的一个隐含条件&#xff1a;偶数个元素的中位数是靠前的那一个 应试技巧&#xff1a;如果实在想不出高效的算法&#xff0c;那…

基于springboot+vue+Mysql的房产销售平台

开发语言&#xff1a;Java框架&#xff1a;springcloudJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a…

【详细讲解CentOS常用的命令】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

SQLite FTS5 扩展(三十)

返回&#xff1a;SQLite—系列文章目录 上一篇:SQLite的知名用户(二十九) 下一篇&#xff1a;SQLite—系列文章目录 1. FTS5概述 FTS5 是一个 SQLite 虚拟表模块&#xff0c;它为数据库应用程序提供全文搜索功能。在最基本的形式中&#xff0c; 全文搜索引擎允许用户有…

Dinov2 + Faiss 图片检索

MetaAI 通过开源 DINOv2&#xff0c;在计算机视觉领域取得了一个显着的里程碑&#xff0c;这是一个在包含1.42 亿张图像的令人印象深刻的数据集上训练的模型。产生适用于图像级视觉任务&#xff08;图像分类、实例检索、视频理解&#xff09;以及像素级视觉任务&#xff08;深度…

【leetcode面试经典150题】57. 环形链表(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…