Kubernetes存储(14)

ConfigMap与Secret

  • ConfigMap用于将一些配置文件传递给Pod
  • Secret用于将一些敏感信息通过一些安全手段传递给Pod
    要求掌握
     描述ConfigMap的功能
     使用ConfigMap
     区分Secret和ConfigMap的区别
     使用Secret

目录

  1. ConfigMap介绍
  2. Secret介绍

1. ConfigMap介绍

  • 痛点


    image.png

1.1 ConfigMap的功能

  • ConfigMap用于容器的配置文件管理。它作为多个properties文件的应用,类似一个专门存储配置文件的目录,里面存放着各种配置文件
  • ConfigMap实现了image和应用程序的配置文件、命令行参数和环境变量等信息解耦
  • ConfigMap和Secrets类似,但ConfigMap用于处理不含敏感信息的配置文件


    image.png

1.2 创建config-map

1.2.1 从目录创建

1.创建存放configmap的目录和文件
[root@k8s-master ~]# mkdir ~/configmap
[root@k8s-master ~]# cd ~/configmap
[root@k8s-master configmap]# ls
[root@k8s-master configmap]# vi userinfo
[root@k8s-master configmap]# vi dbinfo
[root@k8s-master configmap]# cat ~/configmap/userinfo 
username=aaa
password=bbb
[root@k8s-master configmap]# cat ~/configmap/dbinfo 
servername=db1
ip=1.1.1.1
2.通过目录创建configmap,目录中所有的文件都作为配置文件进行创建
[root@k8s-master configmap]# k create configmap info --from-file=/root/configmap
configmap/info created
3.查看configmap的创建结果
[root@k8s-master configmap]# k get configmaps 
NAME   DATA   AGE
info   2      8s
[root@k8s-master configmap]# k describe configmaps info 
Name:         info
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
userinfo:
----
username=aaa
password=bbb

dbinfo:
----
servername=db1
ip=1.1.1.1


BinaryData
====

Events:  <none>
[root@k8s-master configmap]# cat ~/configmap/userinfo 
username=aaa
password=bbb
[root@k8s-master configmap]# cat ~/configmap/dbinfo 
servername=db1
ip=1.1.1.1

1.2.2 通过指定的文件进行创建

[root@k8s-master configmap]# k create configmap info2 --from-file=/root/configmap/userinfo --from-file=/root/configmap/dbinfo
configmap/info2 created
[root@k8s-master configmap]# k get configmaps 
NAME    DATA   AGE
info    2      6m5s
info2   2      9s
[root@k8s-master configmap]# k describe configmaps info2
Name:         info2
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
dbinfo:
----
servername=db1
ip=1.1.1.1

userinfo:
----
username=aaa
password=bbb


BinaryData
====

Events:  <none>
[root@k8s-master configmap]#  

1.2.3 通过命令直接创建

[root@k8s-master configmap]# k create configmap info3 --from-literal=username=zhangsan --from-literal=password=zhangsan1
configmap/info3 created
[root@k8s-master configmap]# k get con
configmaps                controllerrevisions.apps  
[root@k8s-master configmap]# k get configmaps 
NAME    DATA   AGE
info    2      9m37s
info2   2      3m41s
info3   2      8s
[root@k8s-master configmap]# k describe cm info3
Name:         info3
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
password:
----
zhangsan1
username:
----
zhangsan

BinaryData
====

Events:  <none>
[root@k8s-master configmap]#

1.2.4 通过yaml文件创建configmap

[root@k8s-master ~]# vi cm.yaml
[root@k8s-master ~]# ll -tr
[root@k8s-master ~]# cat > cm.yaml << EOF
> apiVersion: v1
> kind: ConfigMap
> metadata:
>   name: game-demo
> data:
>   # 类属性键;每一个键都映射到一个简单的值
>   player_initial_lives: "3"
>   ui_properties_file_name: "user-interface.properties"
> 
>   # 类文件键
>   game.properties: |
>     enemy.types=aliens,monsters
>     player.maximum-lives=5    
>   user-interface.properties: |
>     color.good=purple
>     color.bad=yellow
>     allow.textmode=true
> EOF
[root@k8s-master ~]# vi cm.yaml 
[root@k8s-master ~]# cat cm.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: info4 
data:
  # 类属性键;每一个键都映射到一个简单的值
  username: "user1"

  # 类文件键
  dbinfo: |
    servername: "server2"
    dbname: "db2"    
[root@k8s-master ~]# k apply -f ~/cm.yaml
configmap/info4 created
[root@k8s-master ~]# k get configmaps 
NAME    DATA   AGE
info    2      21m
info2   2      15m
info3   2      12m
info4   2      5s
[root@k8s-master ~]# k describe configmaps info4
Name:         info4
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
dbinfo:
----
servername: "server2"
dbname: "db2"    

username:
----
user1

BinaryData
====

Events:  <none>
[root@k8s-master ~]#

1.3 使用configmap

1.3.1 通过环境变量使用

[root@k8s-master ~]# cat /root/cmpod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: cm-test-pod
spec:
  containers:
    - name: cm-container
      image: busybox
      command: ["/bin/sh","-c","sleep 3000"]
      env:
        # 定义环境变量
        - name: accountname # 请注意这里和 ConfigMap 中的键名是不一样的 想要的新的变量的名字
          valueFrom:
            configMapKeyRef:
              name: info4           # 这个值来自 ConfigMap
              key: username # 需要取值的键值进行重命名 将info4中username的值给accountname
      envFrom:               
         #将info2的值全部导进来
        - configMapRef:
            name: info2
  restartPolicy: Always
[root@k8s-master ~]# k apply -f ~/cmpod.yaml 
pod/cm-test-pod created
[root@k8s-master ~]# k get pod
NAME                                READY   STATUS    RESTARTS   AGE
cm-test-pod                         1/1     Running   0          21s
[root@k8s-master ~]# k exec -it cm-test-pod -- /bin/sh
/ # env
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT=tcp://10.96.0.1:443
dbinfo=servername=db1
ip=1.1.1.1

HOSTNAME=cm-test-pod
SHLVL=1
HOME=/root
userinfo=username=aaa
password=bbb

TERM=xterm
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KUBERNETES_PORT_443_TCP_PORT=443
HTTPD_SVC_SERVICE_HOST=10.98.110.166
HTTPD_SVC_PORT_8080_TCP_ADDR=10.98.110.166
KUBERNETES_PORT_443_TCP_PROTO=tcp
HTTPD_SVC_PORT_8080_TCP_PORT=8080
HTTPD_SVC_PORT_8080_TCP_PROTO=tcp
accountname=user1
HTTPD_SVC_SERVICE_PORT=8080
HTTPD_SVC_PORT=tcp://10.98.110.166:8080
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_SERVICE_HOST=10.96.0.1
PWD=/
HTTPD_SVC_PORT_8080_TCP=tcp://10.98.110.166:8080
/ # exit
[root@k8s-master ~]# cat /root/cm
cmpod.yaml  cm.yaml     
[root@k8s-master ~]# cat /root/cmpod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: cm-test-pod
spec:
  containers:
    - name: cm-container
      image: busybox
      command: ["/bin/sh","-c","sleep 3000"]
      env:
        # 定义环境变量
        - name: accountname # 请注意这里和 ConfigMap 中的键名是不一样的 想要的新的变量的名字
          valueFrom:
            configMapKeyRef:
              name: info4           # 这个值来自 ConfigMap
              key: username # 需要取值的键值进行重命名 将info4中username的值给accountname
      envFrom:               
         #将info2的值全部导进来
        - configMapRef:
            name: info2
  restartPolicy: Always
##看到accountname 和 password username都进来了

1.3.2 通过卷使用

起到传参的作用
[root@k8s-master ~]# cat /root/cmpod2.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: cmpod2
spec:
  containers:
  - name: cmpod2
    image: busybox
    args: [ "/bin/sh","-c","sleep 3000" ]
    volumeMounts:
    - name: db
      mountPath: "/etc/db"
      readOnly: true
  volumes:
  - name: db
    configMap:
      name: info4
[root@k8s-master ~]# k apply -f ~/cmpod2.yaml
pod/cmpod2 created
[root@k8s-master ~]# k get pod
NAME                                READY   STATUS    RESTARTS   AGE
cmpod2                              1/1     Running   0          23s
[root@k8s-master ~]# k exec -it cmpod2 -- /bin/sh
/ # cd /etc/db
/etc/db # ls
dbinfo    username

1.4 ConfigMap使用注意事项

  • ConfigMap必须在创建Pod前创建完成。如果Pod调用ConfigMap失败,则无法创建。
  • Pod只能使用在同一Namespace中的ConfigMap
  • ConfigMap创建方式通常使用文件方式。
  • ConfigMap使用方式通常使用volume方式。
  • 以volume方式挂载ConfigMap,如果更新ConfigMap或删除重建ConfigMap,Pod内挂载的配置信息会热更新。

2 Secret介绍

2.1Secret概述

  • Secret 是一种包含少量敏感信息例如密码、token 或 key 的对象。这样的信息可能会被放在 Pod spec 中或者镜像中;将其放在一个 secret 对象中可以更好地控制它的用途,并降低意外暴露的风险。
  • ConfigMap主要解决配置文件的存储问题,而Secret主要用来解决密码、token、密钥等敏感数据。
     在创建、查看和编辑Pod的流程中Secret暴露风险较小。 系统会对Secret对象采取额外的预防措施,例如避免将其写入磁盘中可能的位置。
     只有Pod请求的Secret在其容器中才是可见的,一个Pod不能访问另一个Pod的Secret。
    注:secret主要解决的是安全问题,采用secret创建的参数仅在pod内部可见,在pod外不可见。

2.2 创建secret示例,体验安全性管理

结果:describe出来的结果无法看到secret的内容。

[root@k8s-master ~]# cat /root/cmpod2.yaml 
[root@k8s-master configmap]# echo -n "abc" > username
[root@k8s-master configmap]# echo -n "111" > password
[root@k8s-master configmap]# k create secret generic db-user-name --from-file=username --from-file=password
secret/db-user-name created
[root@k8s-master configmap]# k get secrets 
NAME                  TYPE                                  DATA   AGE
db-user-name          Opaque                                2      6s
[root@k8s-master configmap]# k describe secrets db-user-name
Name:         db-user-name
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  Opaque

Data
====
password:  3 bytes
username:  3 bytes
[root@k8s-master configmap]#

2.3 使用yaml创建(参数内容使用base64编码进行书写)

技巧 :vi在编辑模式中使用命令:r! ,作用:执行一段命令,并将结果写到光标所在位置

[root@k8s-master ~]# cat /root/secret.yaml 
apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaqur
data:
  username: YWRtaW4=            # 清单中的字段值是 Base64 字符串
  password: MTIzMTIz   # 清单中的字段值是 Base64 字符串
# :r!+空格+命令 在vi编辑界面执行命令并将命令结果输出到vi光标位置
# eg :r! echo -n "abc" | base64
[root@k8s-master ~]# k apply -f /root/secret.yaml 
secret/mysecret created
[root@k8s-master ~]# k get secrets 
NAME                  TYPE                                  DATA   AGE
db-user-name          Opaque                                2      176m
default-token-75t79   kubernetes.io/service-account-token   3      83d
mysecret              Opaqur                                2      8s
[root@k8s-master ~]# k describe secrets mysecret 
Name:         mysecret
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  Opaqur

Data
====
username:  5 bytes
password:  6 bytes

2.4 使用volume创建pod

[root@k8s-master ~]# cat /root/spod.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: spod
spec:
  containers:
  - name: spod
    image: busybox
    args: [ "/bin/sh","-c","sleep 3000" ]
    volumeMounts:
    - name: secrets
      mountPath: "/etc/secret"
      readOnly: true
  volumes:
  - name: secrets
    secret:
     secretName: mysecret
[root@k8s-master ~]# k apply -f /root/spod.yaml 
pod/spod created
[root@k8s-master ~]# k get pod
NAME                                READY   STATUS    RESTARTS   AGE
spod                                1/1     Running   0          21s
[root@k8s-master ~]# k exec -it spod -- /bin/sh
/ # cd /etc/secret/
/etc/secret # ls
password  username
/etc/secret # cat username 
admin/etc/secret # exit
[root@k8s-master ~]#

2.5 使用item参数创建pod,传指定的键值

apiVersion: v1
kind: Pod
metadata:
  name: spod2
spec:
  containers:
  - image: busybox
    name: spod2
    args: ["/bin/sh","-c","sleep 3000"]
    volumeMounts:
    - name: secrets
      mountPath: "/etc/secret"
      readOnly: true
  volumes:
  - name: secrets
    secret:
      secretName: mysecret
      items:
      - key: password
        path: my-group/my-passwd
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容