学习k8s之配置信息(configmap)和安全信息(secret)管理啦


前言

secret和configmap可以理解为特殊的存储卷,但是它们不是给Pod提供存储功能的,而是提供了从集群外部向集群内部的应用注入配置信息的功能。
Secret:Base64的编码机制保存敏感信息,比如数据库的用户名和密码或者认证秘钥等。 它保存的数据是以秘文的方式存放的
ConfigMap:和Secret类似,以明文保存不重要的信息。

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

一:secret和configMap的区别

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

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

加密数据并存放在Etcd中,让Pod的容器以挂载Volume方式访问

# 2.1:通过 --from-file:

- 使用`--from-file`的方式,文件中的数据不用使用base64加密。和ConfigMap类似,如果不指定key的名称,默认使用文件名。

```handlebars
#采用的加密方式是generic(通用的、一般的加密方式)
#注意,一个--from-literal语句 ,只能保存一条信息

#创建用户名/密码文件
echo -n 'admin' > ./username.txt
echo -n '123123' > ./password.txt

#写入Server对象中
kubectl create secret generic shuai-user-pass --from-file=./username.txt --from-file=./password.txt

查看secret资源

[root@master01 demo]# kubectl get secret
NAME                   TYPE                                  DATA   AGE
db-user-pass           Opaque                                2      8m59s

#查看刚写的详细信息
[root@master01 demo]# kubectl describe secret db-user-pass
Name:         db-user-pass
Namespace:    default
Labels:       <none>
Annotations:  <none>

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

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

查看刚才创建的secret使用yaml方式查看

[root@master01 demo]# kubectl get secret db-user-pass -o yaml
apiVersion: v1
data:
  password.txt: MTIzMTIz
  username.txt: YWRtaW4=
kind: Secret
metadata:
  creationTimestamp: 2021-01-29T02:03:24Z
  name: db-user-pass
  namespace: default
  resourceVersion: "399866"
  selfLink: /api/v1/namespaces/default/secrets/db-user-pass
  uid: 2bb7cb1c-61d6-11eb-a2c3-000c29da5aaf
type: Opaque

2.2:通过YAML创建Secret

先将要保存的值进行Base64编码

[root@master01 ~]# echo -n 'admin' | base64
YWRtaW4=
[root@master01 ~]# echo -n '123123' | base64
MTIzMTIz

编写yaml文件

[root@master01 ~]# cat secret.yaml 
apiVersion: v1
kind: Secret
metadata:
  name: mysecret     
type: Opaque
data: 
  username: YWRtaW4=
  password: MTIzMTIz

[root@master01 ~]# kubectl create -f secret.yaml
secret/mysecret created

[root@master01 ~]# kubectl get secret
NAME                   TYPE                                  DATA   AGE
mysecret               Opaque                                2      45s
[root@master01 ~]#  kubectl describe secret mysecret
Name:         mysecret
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  Opaque

Data
====
password:  6 bytes
username:  5 bytes
注:即使,在保存数据前,我们对要保存的数据做了加密处理,但,base64这种方法也不是绝对
的安全,比如上边我们用base64这种方法得到的乱码字符串,就可以使用--decode解码如下:
通过base64将value反解码
[root@master01 ~]# echo -n MTIzMTIz | base64 --decode
123123
[root@master01 ~]# echo -n YWRtaW4= | base64 --decode
admin

2.3:以环境变量的方式使用secret

2.31:方式一:使用secret中的变量导入到pod中

  • 查看刚才创建的secret使用yaml方式查看
[root@master01 ~]# echo -n YWRtaW4= | base64 --decode
admin[root@master01 ~]# kubectl get secret mysecret -o yaml
apiVersion: v1
data:
  password: MTIzMTIz
  username: YWRtaW4=
kind: Secret
metadata:
  creationTimestamp: 2021-01-29T02:22:55Z
  name: mysecret
  namespace: default
  resourceVersion: "401611"
  selfLink: /api/v1/namespaces/default/secrets/mysecret
  uid: e585289d-61d8-11eb-a2c3-000c29da5aaf
type: Opaque

编写yaml文件

key: username赋值给SECRET_USERNAME

key: password 赋值给SECRET_PASSWORD

[root@master01 ~]# vim secret.var.yaml
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: nginx
    image: nginx
    env:                           #设置环境变量
      - name: SECRET_USERNAME      #容器变量名称
        valueFrom:                
          secretKeyRef:
            name: mysecret         #调用的是mysecret   
            key: username          #对应的是mysecret中对应的值
      - name: SECRET_PASSWORD      #第二个环境变量名
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: password

[root@master shuai]# kubectl apply -f secret.var.yaml 

[root@master shuai]# kubectl get pods
NAME                     READY   STATUS      RESTARTS   AGE
mypod                    1/1     Running     0          40s

'进入容器之后,查看变量对应的值'
[root@master shuai]# kubectl exec -it mypod bash
root@mypod:/# echo $SECRET_USERNAME
shuaige
root@mypod:/# echo $SECRET_PASSWORD
123123

创建资源

[root@master01 ~]# kubectl apply -f secret.var.yaml 
pod/mypod created

[root@master01 demo]# kubectl get pods
NAME    READY   STATUS    RESTARTS   AGE
mypod   1/1     Running   0          51s

[root@master01 ~]#  kubectl exec -it mypod bash
root@mypod:/# echo $SECRET_USERNAME
admin
root@mypod:/# echo $SECRET_PASSWORD
123123

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

2.4:volume 方式使用 Secret

Pod 可以通过 Volume 或者环境变量的方式使用 Secret,先学习 Volume 方式。

Pod 的配置文件如下所示:

[root@master01 ~]# vim secret-vol.yaml
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: nginx
    image: nginx
    volumeMounts:
    - name: foo
      mountPath: "/etc/foo"     #指定容器的目录
      readOnly: true            #以只读的方式挂载
  volumes:              
  - name: foo                   #定义volume foo,来源为 secret mysecret
    secret:
      secretName: mysecret      #指定的是已有的secret资源的名称



[root@master01 ~]# kubectl apply -f secret-vol.yaml
pod/mypod created

[root@master01 ~]# kubectl get pods
NAME    READY   STATUS    RESTARTS   AGE
mypod   1/1     Running   0          2m24s

进入容器查看数据

[root@master01 ~]# kubectl exec -it mypod bash
root@mypod:/# ls /etc/foo
password  username
123123root@mypod:/# cat /etc/foo/username 
adminroot
root@mypod:/# cat /etc/foo/password 
123123

三:configMap数据的两种引用方式

大多数情况下,配置信息都以文件形式提供,所以在创建 ConfigMap 时通常采用 --from-file 或 YAML 方式,读取 ConfigMap 时通常采用 Volume 方式。

比如给 Pod 传递如何记录日志的配置信息:

3.1:创建kubectl

编写redis服务需要的配置并创建configmap资源

[root@master01 demo]# vim redis.properties
redis.host=127.0.0.1
redis.port=6379
redis.password=123456

[root@master01 demo]# kubectl create configmap redis-config --from-file=redis.properties
configmap/redis-config created

#查看资源
[root@master01 demo]# kubectl get configmap
NAME           DATA   AGE
redis-config   1      4s

#简写查看
[root@master01 demo]# kubectl get cm
NAME           DATA   AGE
redis-config   1      9s

#查看详细信息
[root@master01 demo]# kubectl describe cm redis-config
Name:         redis-config
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
redis.properties:
----
redis.host=127.0.0.1
redis.port=6379
redis.password=123456

Events:  <none>

如果想看到键值的化,可以用kubectl get

[root@master01 demo]# kubectl get configmaps redis-config -o yaml
apiVersion: v1
data:
  redis.properties: |
    redis.host=127.0.0.1
    redis.port=6379
    redis.password=123456
kind: ConfigMap
metadata:
  creationTimestamp: 2021-01-29T03:23:25Z
  name: redis-config
  namespace: default
  resourceVersion: "407113"
  selfLink: /api/v1/namespaces/default/configmaps/redis-config
  uid: 595ff06c-61e1-11eb-a2c3-000c29da5aaf

创建mypod资源查看文件导入

[root@master01 demo]# vim cm.yaml

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
    - name: busybox
      image: busybox
      command: [ "/bin/sh","-c","cat /etc/config/redis.properties" ]
      volumeMounts:
      - name: config-volume
        mountPath: /etc/config
  volumes:
    - name: config-volume
      configMap:
        name: redis-config
  restartPolicy: Never

创建资源

#删掉之前创建重名的mypod
[root@master01 demo]# kubectl delete pod mypod

#创建资源
[root@master01 demo]# kubectl apply -f cm.yaml 

[root@master01 demo]# kubectl get pods
NAME    READY   STATUS      RESTARTS   AGE
mypod   0/1     Completed   0          4s

查看里面配置信息

[root@master01 demo]# kubectl logs mypod
redis.host=127.0.0.1
redis.port=6379
redis.password=123456

3.2:第二种变量参数形式

创建configmap资源

[root@master01 demo]# vim myconfig.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfig
  namespace: default
data:
  special.level: info
  special.type: hello

#创建资源
[root@master01 demo]# kubectl apply -f myconfig.yaml 
configmap/myconfig created

#查看资源
[root@master01 demo]# kubectl get cm
NAME           DATA   AGE
myconfig       2      5s

创建mymod使用configmap资源输出变量参数

[root@master01 demo]# kubectl delete pod mypod
pod "mypod" deleted

[root@master01 demo]# kubectl apply -f config-var.yaml 
pod/mypod created

[root@master01 demo]# kubectl get pods
NAME    READY   STATUS      RESTARTS   AGE
mypod   0/1     Completed   0          6m58s

[root@master01 demo]# kubectl logs mypod
info hello

猜你喜欢

转载自blog.csdn.net/qyf158236/article/details/113368155