secret和configmap可以理解为特殊的存储卷,但是它们不是给Pod提供存储功能的,而是提供了从集群外部向集群内部的应用注入配置信息的功能。
Secret:Base64的编码机制保存敏感信息,比如数据库的用户名和密码或者认证秘钥等。 它保存的数据是以秘文的方式存放的
ConfigMap:和Secret类似,以明文保存不重要的信息。
当我们创建上述两种资源对象时,其实就是将这两种资源对象存储的信息写入了k8s群集中的etcd数据中心。
相同点: 都是用来保存轻量级信息的,可以供其他资源对象(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
先将要保存的值进行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
[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。
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 时通常采用 --from-file 或 YAML 方式,读取 ConfigMap 时通常采用 Volume 方式。
比如给 Pod 传递如何记录日志的配置信息:
编写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
创建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