首页 > 其他分享 >k8s 配置管理中心Configmap 和 Secret 实现微服务配置管理

k8s 配置管理中心Configmap 和 Secret 实现微服务配置管理

时间:2024-09-01 15:24:24浏览次数:13  
标签:Configmap kubectl 配置管理 secret Secret master pod k8s root

一、Configmap

1.1 关于Configmap

Configmap 是k8s中的资源对象,用于保存非机密性的配置的,数据可以用key/value键值对的形式保存,也可以使用文件的形式保存。

 

k8s中的pod(服务)都有自己的配置文件,如果需要扩容时,为保证服务的一致性,可以将Configmap做成volume,并挂载到新扩容的服务上。

1.2 Configmap 创建方法

1.2.1 命令行方式创建

命令行中指定configmap参数创建,通过使用--from-literal 指定参数

 

命令解释:

kubectl create configmap nginx --from-literal=nginx-port=80

create configmap  (创建), nginx (为创建的名称),--from-literal=(定义key)=(key的值)

#创建configmap 
[root@k8s-master ~]# kubectl create configmap nginx --from-literal=nginx-port=80 --from-literal=server-name=mynginx
configmap/nginx created

#查看 (可简写为cm)
[root@k8s-master ~]# kubectl get cm | grep nginx 
nginx              2      17s

#查看详细信息
[root@k8s-master ~]# kubectl describe cm nginx
Name:         nginx
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
nginx-port:         //可以看到创建时定义的值
----
80
server-name:
----
mynginx

BinaryData
====

Events:  <none>

1.2.2 通过文件方式创建

通过指定的文件创建一个Configmap,--from-file=(文件名称)

#创建一个nginx的conf文件 (简写)
[root@k8s-master ~]# cat nginx.conf 
server {
  server_name www.nginx.com
  listen 80;
  root /home/nginx/www/
}

#指定文件创建configmap    (--from-file=(key值)=(指定的文件))
[root@k8s-master ~]# kubectl create configmap nginx-01 --from-file=key01=./nginx.conf
configmap/nginx-01 created

[root@k8s-master ~]# kubectl get cm | grep nginx
nginx-01           1      7s

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

Data
====
key01:     //指定的key ,下面是对应key值的是指定的配置文件中的内容,如果创建时不指定key(--from-file=./nginx.conf),那么这里显示的就是文件的名称
----
server {
  server_name www.nginx.com
  listen 80;
  root /home/nginx/www/
}


BinaryData
====

Events:  <none>

1.2.3 指定目录创建

可以将目录下的文件都做成configmap

#创建目录及文件
[root@k8s-master ~]# mkdir test-01
[root@k8s-master ~]# cat test-01/001.cnf 
server-id=1
[root@k8s-master ~]# cat test-01/002.cnf 
server-id=2

#指定目录创建configmap
[root@k8s-master ~]# kubectl create configmap mysql --from-file=./test-01/
configmap/mysql created

[root@k8s-master ~]# kubectl get cm 
NAME               DATA   AGE
kube-root-ca.crt   1      110d
mysql              2      6s

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

Data          //如下显示目录中两个文件的配置信息。
====
001.cnf:
----
server-id=1

002.cnf:
----
server-id=2


BinaryData
====

Events:  <none>

1.2.4 通过yaml文件创建

如下(1.2.4.1~~1.2.4.2)两种方式使用环境变量的方式将configmap注入到pod容器中

2.4.3使用volume卷方式进行挂载到pod容器内。

使用环境变量方式进行
1.2.4.1 使用configMapKeyRef

通过环境变量引入:使用env字段下的configMapKeyRef编写configmap资源清单的yaml文件来创建

通过如下命令查看 configmap的字段信息: kubectl explain cm (configmap可缩写为cm) 如下图所示:

k8s 配置管理中心Configmap 和 Secret 实现微服务配置管理_k8s

#编写cm的yaml文件
[root@k8s-master ~]# vim cm01.yaml
 
apiVersion: v1
kind: ConfigMap
metadata:        #定义configmap的名称和标签
  name: cm01
  labels:
    app: app-1
data:            #定义key的数据
    a: a-01
    b: b-01

#创建
[root@k8s-master ~]# kubectl apply -f cm01.yaml 
configmap/cm01 created

[root@k8s-master ~]# kubectl get cm | grep cm01
cm01               2      33s

#创建pod 引用configmap中的内容
[root@k8s-master ~]# vim pod-cm01.yaml

apiVersion: v1
kind: Pod
metadata:
  name: pod-01
spec:
  containers:             #创建容器
  - name: my-busybox
    image: busybox
    imagePullPolicy: IfNotPresent
    command: [ "/bin/sh", "-c", "sleep 3600" ]
    env:                  #定义环境变量
    - name: aaa           #定义第一个环境变量aaa
      valueFrom: 
        configMapKeyRef:  #定义使用configmap类型
          name: cm01      #指定创建好的configmap的名字
          key: a          #指定configmap中的key(表示将cm01中的key ”a“ 的值赋给了上面定义的变量aaa)
    - name: bbb           #定义第二个环境变量bbb
      valueFrom:
        configMapKeyRef:
          name: cm01
          key: b
  restartPolicy: Never    #定义pod重启策略,never 从不重启


#创建pod
[root@k8s-master ~]# kubectl apply -f pod-cm01.yaml 
pod/pod-01 created

[root@k8s-master ~]# kubectl get pods | grep pod
pod-01                               1/1     Running   0          12s

#进入pod进行验证
[root@k8s-master ~]# kubectl exec -it pod-01 -- /bin/sh
/ # printenv | grep -Ei "aaa|bbb"     //查看容器中的环境变量,已经将创建的configmap中定义的key值引用到了容器中。
aaa=a-01
bbb=b-01
1.2.4.2 使用envfrom
#编写yaml文件
[root@k8s-master ~]# vim pod-env.yaml

apiVersion: v1
kind: Pod
metadata:
  name: pod-02
spec:
  containers:
  - name: mybusybox
    image: busybox
    imagePullPolicy: IfNotPresent
    command: [ "/bin/sh", "-c", "sleep 3600" ]
    envFrom:           #使用envfrom环境变量形式进行赋值注入到pod
    - configMapRef:    #定义使用configmap类型
       name: cm01      #指定创建好的configmap的名字
  restartPolicy: Never

#创建
[root@k8s-master ~]# kubectl apply -f pod-env.yaml 
pod/pod-02 created

[root@k8s-master ~]# kubectl get pods | grep pod-02
pod-02                               1/1     Running   0          9s

#进入pod容器中验证
[root@k8s-master ~]# kubectl exec -it pod-02 -- /bin/sh
/ # printenv | grep -Ei "a=|b="  //与使用env字段引用变量不同的是,使用envfrom即将configmap直接注入到pod容器中,看到的变量内容也是configmap定义好的。
a=a-01
b=b-01
使用volume方式进行
1.2.4.3 使用volume 方式创建

上方两种方式是使用环境变量的方式将configmap注入到容器中,如下将使用存储卷的方式将configmap做成volume,然后将其挂到pod容器中进行使用。

#编写configmap的yaml文件
[root@k8s-master ~]# vim cm01.yaml 

apiVersion: v1
kind: ConfigMap
metadata:        #定义configmap的名称和标签
  name: cm01
  labels:
    app: app-1
data:            #定义key的数据
    a: a-01
    b: b-01
    ccc.cnf: |   #"|" 表示该key下面可以定义多行的内容(可用于配置文件,该行定义问件名称,下面定义文件内容)
      Hi
      How are you! 

#创建更新
[root@k8s-master ~]# kubectl apply -f cm01.yaml 
configmap/cm01 configured

[root@k8s-master ~]# kubectl get cm | grep cm
cm01               3      57m

[root@k8s-master ~]# kubectl describe cm cm01
Name:         cm01
Namespace:    default
Labels:       app=app-1
Annotations:  <none>

Data
====
ccc.cnf:
----
Hi
How are you! 

a:
----
a-01
b:
----
b-01

BinaryData
====

Events:  <none>

#创建pod, 将configmap以volume的形式挂载进去
[root@k8s-master ~]# vim pod-volume.yaml

apiVersion: v1
kind: Pod
metadata:
  name: pod-03
spec:
  containers:             #定义创建的容器
  - name: my-busybox
    image: busybox
    imagePullPolicy: IfNotPresent
    command: [ "/bin/sh", "-c", "sleep 3600" ]
    volumeMounts:
    - name: vu-01         #写下面volume的名称
      mountPath: /config  #定义容器内的挂载路径
  volumes:
  - name: vu-01           #定义卷的名称    
    configMap:            #定义使用volume的类型是configma
      name: cm01          #写创建好的configmap的名称(表示将其做成volume卷)
  restartPolicy: Never    #定义pod重启策略,never 从不重启


#创建
[root@k8s-master ~]# kubectl apply -f pod-volume.yaml 
pod/pod-03 created

[root@k8s-master ~]# kubectl get pods | grep pod-03
pod-03                               1/1     Running   0          14s

#进入pod容器内验证
[root@k8s-master ~]# kubectl exec -it pod-03 -- /bin/sh
/ # ls /config/              //yaml文件中定义的路径已经在容器中自动创建并将宿主的configmap以volume的形式挂载到了pod容器中。
a        b        ccc.cnf
/ # cat /config/a 
a-01/ # 
/ # cat config/b 
b-01/ # 
/ # cat config/ccc.cnf 
Hi
How are you! 
/ #

1.3 Configmap 热更新

当configmap文件已经做成了volume并挂载到了pod容器中之后,该configmap文件发生了更新,pod中也需要一并实现更新

 

如上方2.4.3标题内容所示,该configmap文件已经挂载到了pod-03中,此时更新configmap,查看已挂载过的pod是否同步更新

#修改配置文件,在末尾添加一个新的key
[root@k8s-master ~]# tail -4 cm01.yaml 
    ccc.cnf: | 
      Hi
      How are you! 
    d: d-01         #添加该行

#更新文件
[root@k8s-master ~]# kubectl apply -f cm01.yaml 
configmap/cm01 configured

[root@k8s-master ~]# kubectl get cm | grep cm01
cm01               4      86m

#进入pod容器内验证  (已同步更新:pod中同步更新了d这个key,而查看该值为 d-01)
[root@k8s-master ~]# kubectl exec -it pod-03 -- /bin/sh
/ # ls config/
a        b        ccc.cnf  d
/ # cat config/d 
d-01/ #

PS:上方1.2.4.1~~1.2.4.2使用变量方式挂载configmap到pod中的方式,在更新了configmap之后,pod中是不会发生改变的。

二、Secret

2.1 关于Secret

与Configmap不同的是,Configmap是管理存放明文数据的,如配置文件,而对于一些敏感数据,如密码、私钥等数据保存时,需要使用到Secret

 

Secret解决了密码、token、秘钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者Pod Spec中。Secret可以以Volume或者环境变量的方式使用。

 

想要使用Secret,pod需要引用Secret,pod有两种方式使用Secret:

1、作为volume中的文件被挂载到pod中的一个或者多个容器里。

2、当kubelet为pod拉取镜像时使用。

2.2 Secret 可用参数及类型

secret可选参数有三种:

1、generic: 通用类型,通常用于存储密码数据。


2、tls:      此类型仅用于存储私钥和证书。


3、docker-registry: 若要保存docker仓库的认证信息的话,就必须使用此种类型来创建。


Secret类型也可分为三种:

1、Service Account:用于被 serviceaccount 引用。serviceaccout 创建时 Kubernetes 会默认创建对应的 secret。Pod 如果使用了 serviceaccount,对应的 secret 会自动挂载到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目录中。


2、Opaque:base64编码格式的Secret,用来存储密码、秘钥等。可以通过base64 --decode解码获得原始数据,因此安全性弱


3、kubernetes.io/dockerconfigjson:用来存储私有docker registry的认证信息。


 

可使用如下命令进行查看secret的字段信息:如下图所示

kubectl explain secret

k8s 配置管理中心Configmap 和 Secret 实现微服务配置管理_linux_02

2.3 使用Secret

2.3.1 环境变量方式

创建一个pod并通过使用环境变量的方式引用Secret至pod容器内

#创建一个secret 名字为my-passwd 定义其key为passwd且其值为123456(密码)
[root@k8s-master ~]# kubectl create secret generic my-passwd --from-literal=passwd=123456
secret/my-passwd created

#查看  (类型是Opaque)
[root@k8s-master ~]# kubectl get secret 
NAME        TYPE     DATA   AGE
my-passwd   Opaque   1      5s

[root@k8s-master ~]# kubectl describe secret my-passwd
Name:         my-passwd
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  Opaque

Data
====
passwd:  6 bytes           //这里显示key即加过密的值(6 bytes)


#创建pod  yaml文件
[root@k8s-master ~]# vim pod-secret01.yaml

apiVersion: v1
kind: Pod
metadata:
  name: pod-04
spec:
  containers:             #创建容器
  - name: my-httpd
    image: httpd
    imagePullPolicy: IfNotPresent
    ports:
    - name: http
      containerPort: 80
    env:                  #定义环境变量
    - name: aaa           #定义环境变量aaa(pod中容器的环境变量名)
      valueFrom:
        secretKeyRef:     #定义secret类型
          name: my-passwd #指定创建好的secret的名字
          key: passwd     #指定secret中的key(表示将secret中的key ”passwd“ 的值赋给了上面定义的变量aaa)


#创建
[root@k8s-master ~]# kubectl apply -f pod-secret01.yaml 
pod/pod-04 created

[root@k8s-master ~]# kubectl get pods 
NAME     READY   STATUS    RESTARTS   AGE
pod-04   1/1     Running   0          6s

#进入pid容器中验证
[root@k8s-master ~]# kubectl exec -it pod-04 -- /bin/bash
root@pod-04:/usr/local/apache2# printenv | grep aaa
aaa=123456                //可以看到 secret中key (passwd)的值已经引入进了pod容器中

#ps:创建的secret定义的key的值是加密的,引入到pod容器中之后,自动的显示了信息

2.3.2 使用volume方式进行

#手动生成一个以base64加密的账户和密码
[root@k8s-master ~]# echo -n name001 | base64
bmFtZTAwMQ==

[root@k8s-master ~]# echo -n passwd | base64
cGFzc3dk

#将生成的加密过的账户及密码定义到secret
[root@k8s-master ~]# vim secret-01.yaml

cat pod-secret02.yaml
apiVersion: v1
kind: Secret
metadata:
  name: secret-02
type: Opaque        #定义secret 的类型为Opaque
data:
  useranme: bmFtZTAwMQ==    #这里定义上方生成的加密账户和密码
  password: cGFzc3dk


#创建更新secret
[root@k8s-master ~]# kubectl apply -f secret-01.yaml 
secret/secret-02 created

[root@k8s-master ~]# kubectl get secret 
NAME        TYPE     DATA   AGE
secret-02   Opaque   2      7s

[root@k8s-master ~]# kubectl describe secret secret-02
Name:         secret-02
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  Opaque

Data
====
password:  6 bytes         //这里看到对应的值都是加密过的
useranme:  7 bytes

#创建pod将secret 以volume的形式挂到pod容器中
[root@k8s-master ~]# vim pod-secret02.yaml

apiVersion: v1
kind: Pod
metadata:
  name: pod-05
spec:
  containers:               #定义创建的容器
  - name: my-nginx
    image: nginx
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: vu-02           #写下面volume的名称
      mountPath: /test      #定义容器内的挂载路径
      readOnly: true        #定义只读权限
  volumes:
  - name: vu-02             #定义卷的名称    
    secret:                 #定义使用volume的类型是secret
      secretName: secret-02 #写创建好的configmap的名称(表示将其做成volume卷)
      
      
#创建
[root@k8s-master ~]# kubectl apply -f pod-secret02.yaml 
pod/pod-05 created

[root@k8s-master ~]# kubectl get pods 
NAME     READY   STATUS    RESTARTS   AGE
pod-05   1/1     Running   0          4s

#进入pod容器中验证
[root@k8s-master ~]# kubectl exec -it pod-05 -- /bin/bash
root@pod-05:/# ls /test/                //挂载的/test路径下已经创建了两个secret的key(以文件形式存在)
password  useranme
root@pod-05:/# cat /test/useranme       //查看其值得出的结果是最开始使用base64加密之前的真是数据“name001”
name001root@pod-05:/# 
root@pod-05:/# cat /test/password 
passwdroot@pod-05:/#

2.3.3 测试热更新

测试更新secret文本的值,已挂载进pod容器中的值是否会发生改变

#创建一个以base64加密的值并在secret的yaml文件中增加
[root@k8s-master ~]# echo -n test | base64
dGVzdA==

[root@k8s-master ~]# tail -4 secret-01.yaml 
  useranme: bmFtZTAwMQ==
  password: cGFzc3dk
  test: test001           //增加其内容

#更新secret的yaml文件
[root@k8s-master ~]# kubectl apply -f secret-01.yaml 
secret/secret-02 configured

[root@k8s-master ~]# kubectl get secret 
NAME        TYPE     DATA   AGE
secret-02   Opaque   3      21m

[root@k8s-master ~]# kubectl describe secret secret-02
Name:         secret-02
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  Opaque

Data
====
password:  6 bytes
test:      4 bytes
useranme:  7 bytes


#进入pod容器内验证
[root@k8s-master ~]# kubectl exec -it pod-05 -- /bin/bash 
root@pod-05:/# ls /test/
password  test	useranme
root@pod-05:/# cat /test/test 
testroot@pod-05:/#              //验证ok (见左侧值)

标签:Configmap,kubectl,配置管理,secret,Secret,master,pod,k8s,root
From: https://blog.51cto.com/cyfang/11889072

相关文章

  • 网络自动化:利用Python和Ansible实现网络配置管理
    利用Python和Ansible实现网络配置管理是现代网络自动化中的一个关键领域。这个组合使得可以更有效地管理网络设备、减少人为错误、提高网络的可扩展性和一致性。以下是如何利用Python和Ansible实现网络配置管理的详细指南:一、使用Python进行网络自动化Python提......
  • Spring Cloud Consul入门:服务发现与配置管理的最佳实践
    SpringCloudConsul入门:服务发现与配置管理的最佳实践在微服务架构中,服务发现和配置管理是两个核心的需求。SpringCloudConsul作为一个开源的工具,为开发者提供了简单、高效的服务发现和配置管理方案。本文将详细介绍SpringCloudConsul的基础知识,并提供在服务发现与......
  • 深入理解Kubernetes中的ConfigMap:配置管理的艺术
    在Kubernetes的世界中,配置管理是一个至关重要的部分,它允许开发者和运维人员将配置信息从容器镜像中分离出来,以便于更灵活地管理和更新应用。ConfigMap是Kubernetes提供的一种配置管理工具,它允许用户将配置数据存储在集群中,并且可以被Pods以多种方式使用。本文将详细介绍Conf......
  • VulNyx-Secrets
    扫端口扫描80端口发现有个secrets目录还有个注释继续扫发现http://192.168.200.11/secrets/login_form.php有这个登录框估计就是要爆破username就是brad了把密码爆破出来bradley登录完成后有跳转要我们写ip随便写个127.0.0.1发现他只接受纯数字那我们......
  • IOC/DI配置管理第三方bean
    文章目录一案例:数据源对象管理1环境准备2思路分析3实现Druid管理步骤1:导入`druid`的依赖步骤2:配置第三方bean步骤3:从IOC容器中获取对应的bean对象步骤4:运行程序4实现C3P0管理步骤1:导入`C3P0`的依赖步骤2:配置第三方bean步骤3:运行程序二加载properties文......
  • vSphere5.10.2.配置管理Fault Tolerance
    第二部分配置管理faulttolerancefaulttolerance的介绍vmwareftistheevolutionof"continuousavailability"thatworksbyutilizingvmwarevlocksteptechnologytokeepaprimarymachineandasecondarymachineinavirtuallockstep.vmwareftwillstream......
  • 题解:AT_jag2016secretspring_b 豪邸と宅配便
    思路设\(T\)为总时间。由于第一次太郎一定会花\(m\)时间到达门口,所以\(t\)要先减去\(m\)。之后太郎就有两种选择在门口等待下一个快递,时间花费为\(a_i-a_{i-1}\)。回书房,学习一会,再拿快递,时间花费为\(2\timesm\)。则最优时间花费为\(\min(2\timesm,a_i-a_{i-1}......
  • Spring Boot应用的多环境配置管理
    SpringBoot应用的多环境配置管理大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在开发SpringBoot应用时,经常需要在不同的环境(如开发、测试和生产环境)之间切换。每个环境可能需要不同的配置,如数据库连接、服务端点等。SpringBoot提供了多种机制来......
  • CF1530D Secret Santa 题解
    ProblemSolution每个人初始不会给自己送礼物。如果每人要送礼的人都不一样,答案即为\(n\)。如果有两个或以上的人要送给同一个人礼物,假设有\(x\)个人要给同一个人送礼物,那么必有\(x-1\)个人要更改送礼的人,并将礼物送个\(x-1\)个没有礼物收的人。然而这样送礼物可能会导......
  • 中文翻译《ASPICE in practice》之“SUP.8 配置管理”
    2.16SUP.8配置管理2.16.1目的配置管理流程的目的是建立和维护流程或项目的所有工作产品的完整性,并将其提供给相关各方。 在配置管理(CM)的背景下,配置管理系统至关重要。我们指的是一个或多个CM工具的组合,以支持物理存储和处理以及相关规则,例如指令、流程和约定;后者例......