码迷,mamicode.com
首页 > 其他好文 > 详细

k8s数据持久化之Secret和configMap

时间:2020-09-04 16:59:22      阅读:47      评论:0      收藏:0      [点我收藏+]

标签:amp   res   data   file   sleep   其他   文件中   space   存在   

前言

在K8s中有Secret和configMap这两种资源对象,这也是实现数据持久化的一种方式,与之前写过的PV或挂载目录等这些数据持久化的方式有些许不一样。

* Secret资源对象:可以保存轻量的敏感信息,比如数据库的用户名和密码或者认证秘钥等。
它保存的数据是以秘文的方式存放的

* configMap资源对象:和Secret一样,拥有大多数共同的特性,但是区别是,configMap保存的是
一些不太重要的信息,它保存的数据是以明文的方式存放的。

当我们创建上述两种资源对象时,其实就是将这两种资源对象存储的信息写入了k8s群集中的etcd数据中心。

一、secret和configMap的区别

**相同点:**
都是用来保存轻量级信息的,可以供其他资源对象(Deployment、RC、RS和POd)进行挂载使用。
这两种资源对象的创建方法(4种)及引用方法(2种)都是一样的,都是以键值对的方式进行存储的。

**不同点:**
Secret是用来保存敏感信息的,而configMap是用来保存一些不太重要的数据的,具体表现在当我
们执行“kubectl describe ....”命令时,Secret这种类型的资源对象时查看不到其具体的信息的,
而configMap是可以查看到其保存的具体内容的。

二、Secret资源对象的四种创建方式

假设存储的数据是:
username:root
password:123.com
以下的存储方式都是存储该信息!

1)、创建方法1(通过--from-literal的方式)

[root@master ~]# kubectl create secret generic mysecret01 --from-literal=username=root --from-literal=password=123.com
//创建一个secret资源对象,名称为mysecret01,采用的加密方式是generic(通用的、一般的加密方式)
// 注意,一个--from-literal语句 ,只能保存一条信息。
[root@master ~]# kubectl  get  secrets  mysecret01 
NAME         TYPE     DATA   AGE
mysecret01   Opaque   2      16s

[root@master ~]# kubectl  describe secrets  mysecret01   //查看该资源的详细信息
Name:         mysecret01
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  Opaque   //表示不透明的,看不见的

Data
====
password:  7 bytes   //只能查看键的名称,无法查看到键对应的值
username:  4 bytes

[root@master ~]# kubectl  get  secrets  mysecret01 -o yaml  //将该资源以yaml文件的方式进行显示
apiVersion: v1
data:
  password: MTIzLmNvbQ==   //键对应的值都是乱码,加密使用的是base64编码格式
  username: cm9vdA==           
kind: Secret
metadata:
  creationTimestamp: "2020-08-25T08:21:40Z"
  name: mysecret01
  namespace: default
  resourceVersion: "8677"
  selfLink: /api/v1/namespaces/default/secrets/mysecret01
  uid: 4f817035-0b9b-4ed3-a17b-24ee0bea733a
type: Opaque

[root@master ~]# echo -n cm9vdAo= | base64 --d              //将乱码解码后的结果
root                                                                
[root@master ~]# echo -n MTIzLmNvbQ== | base64 --d
123.com

2)、创建方法2(通过--from-file的方式)
这种方式比方法1还要麻烦一些,不建议使用。

[root@master ~]# echo root > username
[root@master ~]# echo 123.com > password
//需要先将要存储的键值对写入到文件中,并且每个文件只能写入一个值
[root@master ~]# kubectl create secret generic mysecret02 --from-file=username --from-file=password
[root@master ~]# rm -rf username password              
//即使文件删除之后,该资源键对应的值依然也是存在的
[root@master ~]# kubectl  get  secrets  mysecret02
NAME         TYPE     DATA   AGE
mysecret02   Opaque   2      31s
[root@master ~]# kubectl  describe  secrets  mysecret02
Name:         mysecret02
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  Opaque

Data
====
password:  8 bytes
username:  5 bytes

注: --from-file的方式,并没有想象中那么全面,厉害。因为每个文件中,只能够保存一条信息。

3)、创建方法3(通过--from-env-file的方式)
这种方式可以在同一个文件中写入多个键值对,推荐使用。

[root@master ~]#  tee  env.txt <<EOF    //多个需要存储的键值写入同一个文件中
>  username=root
> password=123.com
> EOF

[root@master ~]#  kubectl create secret generic mysecret03 --from-env-file=env.txt
[root@master ~]# kubectl   get secrets mysecret03
NAME         TYPE     DATA   AGE
mysecret03   Opaque   2      15s

[root@master ~]# kubectl  describe  secrets  mysecret03
Name:         mysecret03
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  Opaque

Data
====
password:  7 bytes
username:  4 bytes

4)、创建方法4(通过yaml配置文件的方式)

//将要存储的值进行加密
[root@master ~]# echo  root | base64
cm9vdAo=
[root@master ~]# echo  123.com | base64
MTIzLmNvbQo=

[root@master ~]# vim secret.yaml  
apiVersion: v1
kind: Secret
metadata:
  name: mysecret04                 //名称不可以有大写
data:
  username: cm9vdAo=                       //将加密后的形成的值写到配置文件中
  password: MTIzLmNvbQo=
[root@master ~]# kubectl apply -f secret.yaml            //执行yaml文件
[root@master ~]# kubectl get  secrets  mysecret04
NAME         TYPE     DATA   AGE
mysecret04   Opaque   2      69s

[root@master ~]# kubectl  describe  secrets  mysecret04
Name:         mysecret04
Namespace:    default
Labels:       <none>
Annotations:  
Type:         Opaque

Data
====
password:  8 bytes
username:  5 bytes

注:即使,在保存数据前,我们对要保存的数据做了加密处理,但,base64这种方法也不是绝对
的安全,比如上边我们用base64这种方法得到的乱码字符串,就可以使用--decode解码如下:

[root@master ~]#  echo -n cm9vdAo= | base64 --decode
root

三、Secret的两种使用方式

注:既然secret的这种存储方式是无法通过命令行查看的,再一个就是,这种存储方式的意义是什么?通过下面的使用方式,应该就可以明白其使用场景了。
1)、使用方法1(以volume挂载的方式使用secret)

[root@master ~]# vim secret-pod01.yaml
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: mypod
    image: busybox
    args:
      - /bin/sh
      - -c
      - sleep 3000000                  //以上字段仅仅是创建一个容器
    volumeMounts:
    - name: secret-test
      mountPath: "/etc/secret-test"                  //指定容器中的目录
      readOnly: true                                         //以只读的方式挂载
  volumes:
  - name: secret-test
    secret:
      secretName: mysecret04          //指定的是已有的secret资源的名称

[root@master ~]# kubectl apply -f secret-pod01.yaml    //执行yaml文件
[root@master ~]# kubectl exec -it mypod /bin/sh        //进入容器
/ # cat -n /etc/secret-test/username /etc/secret-test/password     //查看对应的目录是否存在数据
     1  root
     2  123.com
//而且是已经解密后的数据  

现在,我们可以验证一下,如果此时更改secret04的内容,那么容器内对应的挂载目录下的内容是否更改?

[root@master ~]# echo  bjq | base64
YmpxCg==
[root@master ~]# echo  123.com | base64 
MTIzLmNvbQo=

[root@master ~]# cat secret.yaml 
apiVersion: v1
kind: Secret
metadata:
  name: mysecret04              
data:
  username: YmpxCg==                          //将改为刚刚生成的乱码
  password: MTIzLmNvbQo=
//更改完成保存退出即可    

[root@master ~]# kubectl apply -f secret.yaml    //从新执行一下yaml文件
[root@master ~]# kubectl  exec  -it mypod  /bin/sh   //进入容器
/ # cat -n /etc/secret-test/username /etc/secret-test/password 
     1  bjq
     2  123.com
//再次查看容器中数据,发现已经发生了变化!           

注:如果采用volume挂载的方式调用secert存储的值,容器内的值会随着secert存储的值发生改变而变化!

2)、使用方法2(以环境变量的方式使用secret)

[root@master ~]# vim secret-pod02.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: mypod2
spec:
  containers:
  - name: mypod
    image: busybox
    args:
      - /bin/sh
      - -c
      - sleep 3000000
    env:                                   //设置环境变量
      - name: SECRET_USERNAME               //指容器中的变量名称
        valueFrom:
          secretKeyRef:
            name: mysecret02                 //调用的是mysecret02 
            key: username                       //对应的是mysecret02中username对应的值
      - name: SECRET_PASSWORD    
        valueFrom:
          secretKeyRef:
            name: mysecret02
            key: password

[root@master ~]# kubectl apply -f secret-pod02.yaml   //重新执行以下yaml文件
[root@master ~]# kubectl exec -it mypod2 /bin/sh    
/ # echo ${SECRET_USERNAME}
root
/ # echo ${SECRET_PASSWORD}
123.com
//进入容器之后,查看变量对应的值

注:通过发现,用环境变量的方式也可以正确引用secret资源,但是,它并不会像Volume的方式一样,它引用数据不会进行动态的更新,除非重新生成pod。

四、configMap资源对象的四种创建方式

注:与secret资源一样,configMap也可以保存一些数据信息,不同的是,secret资源保存的是相对敏感的信息或者是秘钥等,而configMap保存的是一些明文的数据,接下让我们来看看configMap四种创建方式吧如下:

1)、创建方法1(通过--from-literal的方式)

[root@master ~]# kubectl create configmap configmap01 --from-literal=username=root --from-literal=password=123.com
//创建一个configmap资源,名称为configmap01
[root@master ~]# kubectl describe configmaps configmap01 
Name:         configmap01
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data      //可以很明确的看出存储的键对应的值,所以一般用于存储配置文件信息
====
password:
----
123.com
username:
----
root
Events:  <none>

2)、创建方法2(通过--from-file的方式)

[root@master ~]# echo root > username
[root@master ~]# echo 123.com > password
[root@master ~]# kubectl create configmap configmap02 --from-file=username --from-file=password
configmap/configmap02 created
[root@master ~]# kubectl describe configmaps configmap02
Name:         configmap02
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
password:
----
123.com

username:
----
root

Events:  <none>

3)、创建方法3(通过--from-env-file的方式)

[root@master ~]# tee bjq.txt <<EOF
> username=root
> password=123.com
> EOF
[root@master ~]# kubectl create configmap configmap03 --from-env-file=bjq.txt
[root@master ~]# kubectl describe configmaps configmap03
Name:         configmap03
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
username:
----
root
password:
----
123.com
Events:  <none>

4)、创建方法4(通过yaml配置文件的方式)

[root@master ~]# vim configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: configmap04               //名称不可以大写
data: 
  username: root                       //configmap使用yaml文件进行创建时,键对应的值无需事先加密
  password: 123.com                     //对应的值如果是数字,则需要单引号引起

[root@master ~]# kubectl apply -f configmap.yaml    //执行yaml文件
[root@master ~]# kubectl describe configmaps configmap04
Name:         configmap04
Namespace:    default
Labels:       <none>
Annotations:  kubectl.kubernetes.io/last-applied-configuration:
                {"apiVersion":"v1","data":{"password":"123.com","username":"root"},"kind":"ConfigMap","metadata":{"annotations":{},"name":"configmap04","n...

Data
====
password:
----
123.com
username:
----
root
Events:  <none>

五、configMap数据的两种引用方式

注:应用方式和secert资源对象的方式类似,都是volume挂载或者以变量的方式引用,只是一些yaml文件中的一些关键字不一样。

1)以volume挂载的方式使用

[root@master ~]# vim configmap-pod01.yaml
apiVersion: v1
kind: Pod
metadata:
  name: configmap-pod01
spec:
  containers:
  - name: configmap-pod01
    image: busybox
    args:
      - /bin/sh
      - -c
      - sleep 3000000    //这上面没有改变
    volumeMounts:
    - name: configmap-test
      mountPath: "/etc/configmap-test"     //挂载到容器的这个目录
      readOnly: true
  volumes:
  - name: configmap-test
    configMap:
      name: configmap01   //挂载的是configmap01

[root@master ~]# kubectl apply -f configmap-pod01.yaml   //执行yaml文件
[root@master ~]# kubectl exec -it configmap-pod01 /bin/sh   //进入容器
/ # cat -n /etc/configmap-test/username /etc/configmap-test/password
     1  root
     2  123.com

注:ConfigMap资源采用volume挂载的方式,与Secret资源采用volume挂载的方式几乎是一样的,会随着源数据的变化而变化!

2)用环境变量的方式运行

[root@master ~]# vim configmap-pod02.yaml
apiVersion: v1
kind: Pod
metadata:
  name: configmap-pod02
spec:
  containers:
  - name: configmap-pod02
    image: busybox
    args:
      - /bin/sh
      - -c
      - sleep 3000000
    env:
      - name: CONFIGMAP_USERNAME
        valueFrom:
          configMapKeyRef:
            name: configmap04
            key: username                   //调用的是configmap04中username的值
      - name: CONFIGMAP_PASSWORD
        valueFrom:
          configMapKeyRef:
            name: configmap04
            key: password
[root@master ~]# kubectl apply -f configmap-pod02.yaml                      
[root@master ~]# kubectl exec -it configmap-pod02 /bin/sh
/ # echo ${CONFIGMAP_USERNAME}
root
/ # echo ${CONFIGMAP_PASSWORD}
123.com

注:ConfigMap资源采用环境变量的方式,与Secret资源采用变量变量的方式几乎是一样的,不会随着源数据的变化而变化,除非重新生成Pod.

k8s数据持久化之Secret和configMap

标签:amp   res   data   file   sleep   其他   文件中   space   存在   

原文地址:https://blog.51cto.com/14306186/2523968

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!