Kubernetes Pod的配置管理 ConfigMap和Secret

news2024/11/24 22:39:17

目录

前言

一、为什么需要配置管理

二、使用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
 

 镜像拉取成功

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

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

相关文章

gpt能生成ppt吗

gpt能生成ppt吗 GPT是一个高度通用的工具&#xff0c;适用于多种场景和领域&#xff0c;制作ppt只是它强大功能的冰山一角&#xff0c;具体包括&#xff1a; 信息查询与解释&#xff1a; 提供科学、技术、历史、文化等领域的详细解释和背景信息。 解答疑问&#xff0c;帮助…

达梦数据库一体机树立金融解决方案标杆

达梦数据库一体机自问世以来&#xff0c;获得众多行业用户的高度关注&#xff0c;并率先在金融行业吹响冲锋号角&#xff0c;实现多个重大项目的落地应用。近日&#xff0c;珠海华润银行股份有限公司基于达梦数据库一体机 I 系列的《数据库一体机银行多业务系统集中部署解决方案…

【Java 多线程】Synchronized

Synchronized Synchronized 是Java的一个关键字&#xff0c;它能够将代码块或方法锁起来&#xff0c;是一种互斥锁&#xff0c;一次只能允许一个线程进入被锁住的代码块 如果 Synchronized 修饰的是实例方法&#xff0c;则对应的锁是对象实例如果 Synchronized 修饰的是静态方…

SSL证书在HTTP与HTTPS中的角色差异是什么?

在互联网的广泛应用背景下&#xff0c;随着网络攻击和数据泄露事件频发&#xff0c;保障用户的数据安全已成为至关重要的议题。传统的HTTP协议在传输数据时不进行加密处理&#xff0c;导致数据在传输过程中暴露于潜在的窃听和篡改风险中&#xff0c;安全性薄弱。而通过引入SSL/…

Springboot+Vue项目-基于Java+MySQL的免税商品优选购物商城系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

Linux的图形资源及指令

一、火车 1.切换到超级用户 su 2.下载资源 yum install -y sl 3.输入指令 sl&#xff0c;得到火车图形 如果没有得到该图形&#xff0c;就将2处改为yum install -y epel-release。 二、Linux的logo 1.在超级用户模式下下载资源 yum install -y linux_logo 2.输…

英语日常用语柯桥职场英语学习去哪里?专业语言培训推荐泓畅学校

“摸鱼”的英语表达 职场&#xff0c;总有些看似努力工作的同事&#xff0c;很可能是深藏不漏的“摸鱼圣手”。 但“摸鱼”的英文表达绝对不是“touch fish”这么简单&#xff01;上班摸鱼&#xff0c;就是不好好干活、浪费时间&#xff0c;所以“loaf”这个单词有必要了解一下…

腾讯EdgeOne产品测评体验—更快更强更安全,安全我选EdgeOne

腾讯EdgeOne产品测评体验—更快更强更安全&#xff0c;安全我选EdgeOne 王婆的瓜可甜&#xff1f; 自 23 年 8 月份 EdgeOne 开放订阅套餐后&#xff0c;腾讯云用户使用 EdgeOne 来为自己网站进行加速和防护的站点数量&#xff0c;呈现爆发式增长趋势。 金融服务业受到的 Web…

AI智能边缘分析一体机,32T算力,可同时处理32路1080p高清视频

产品概述 XM-AIBOX-32智能边缘分析一体机是一款高性能、低功耗边缘计算产品。搭载BM1684X主芯片&#xff0c;INT8算力高达32TOPS&#xff0c;FP16/BF16算力高达16TFLOPS&#xff0c;FP32算力高达2TFLOPS&#xff0c;可同时处理32路高清视频&#xff0c;支持32路1080P高清视频硬…

LeetCode in Python 1338. Reduce Array Size to The Half (数组大小减半)

数组大小减半思路简单&#xff0c;主要是熟悉python中collections.Counter的用法&#xff0c;采用贪心策略即可。 示例&#xff1a; 图1 数组大小减半输入输出示例 代码&#xff1a; class Solution:def minSetSize(self, arr):count Counter(arr)n, ans 0, 0for i, valu…

LTD270次升级 | 订单支持部分退款 • 主动退款 • 商城可限制收货地区 • 官微中心App权限获取更透明

1、 改进退款功能&#xff0c;支持部分商品退款或只退运费&#xff1b; 2、 新增收货地区设置功能&#xff0c;可限制收货地区&#xff1b; 3、 自定义内容类型可使用历史参数快捷输入&#xff1b; 4、 Android版官微中心App系统权限授权流程优化&#xff1b; 5、 已知问题…

7-26 单词长度

题目链接&#xff1a;7-26 单词长度 一. 题目 1. 题目 2. 输入输出格式 3. 输入输出样例 4. 限制 二、代码 1. 代码实现 #include <stdio.h> #include <stdbool.h>void printLen(int len, bool printOnce) {if (len) {if (printOnce) {printf(" %d",…

Zabbix自定义模板、邮件报警、自动发现与注册、proxy代理、SNMP监控

目录 自定义监控内容 1.明确需要执行的 linux 命令 2.创建 zabbix 的监控项配置文件&#xff0c;用于自定义 key 3.在服务端验证新建的监控项 在 Web 页面创建自定义监控项模板 1.创建模板 2.创建应用集&#xff08;用于管理监控项的&#xff09; 3.创建监控项 4.创建…

SQL优化——访问路径(ACCESS PATH)

文章目录 1、常见访问路径1.1、TABLE ACCESS FULL1.2、TABLE ACCESS BY USER ROWID1.3、TABLE ACCESS BY ROWID RANGE1.4、TABLE ACCESS BY INDEX ROWID1.5、INDEX UNIQUE SCAN1.6、INDEX RANGE SCAN1.7、INDEX SKIP SCAN1.8、INDEX FULL SCAN1.9、INDEX FAST FULL SCAN1.10、I…

Sentinel + Nacos流控规则持久化配置

json参数对映sentinel 规则面板 [{"controlBehavior": 0,"count": 2,"grade": 1,"limitApp": "default","resource": "flow","strategy": 0} ] 第二步&#xff0c;告诉订单服务读取配置&…

RedHat9 KVM虚拟技术

以下有使用RedHat9单独的虚拟机也有使用RHEL9学员练习机和RHEL7学员练习机 KVM虚拟技术介绍 Linux的KVM(Kernel-based Virtual Machine)虚拟技术是一种基于Linux内核的虚拟化解决方案。它允许在单个物理服务器上创建和运行多个隔离的虚拟机,每个虚拟机都有自己的操作系统和…

算法题解记录17+++完全平方数

这是楼主第一次不靠题解&#xff0c;挑战动态规划的中等题目&#xff0c;虽然最终结果只超过了5%的人&#xff0c;不过我也很满意了。 本题楼主首先采用朴素的递归型动态规划&#xff0c;接着优化算法&#xff0c;使用借助HashMap存储临时数据的递归型动态规划&#xff0c;几次…

攻防世界15:xff-referer

首先需要了解什么是xff--代理服务器&#xff0c;通过代理访问服务器&#xff0c;referer:HTTP REFERER 是hesder的一部分&#xff0c;当浏览器向web服务器发送请求的时候&#xff0c;一般会带上Referer,告诉服务器该网页是从哪个页面链接过来的&#xff0c;服务器因此可以获得一…

数据结构--顺序表(C语言版)

&#xff08;一&#xff09;.顺序表的概念及结构 首先&#xff0c;我们来了解一下什么是数据结构呢&#xff1f; 数据结构是顾明思义就是由数据结构。 常⻅的数值1、2、3、4.....、教务系统⾥保存的⽤⼾信息&#xff08;姓名、性别、年龄、学历等 等&#xff09;、⽹⻚⾥⾁眼…

基于SSM的列车订票管理系统(含源码+sql+视频导入教程+文档+PPT)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于SSM的列车订票管理系统3拥有两种角色&#xff1b;管理员、用户 管理员&#xff1a;用户管理、车票管理、购票指南管理、系统管理等 用户&#xff1a;发布帖子、登录注册、购票等 1.…