标签:amp res data file sleep 其他 文件中 space 存在
前言在K8s中有Secret和configMap这两种资源对象,这也是实现数据持久化的一种方式,与之前写过的PV或挂载目录等这些数据持久化的方式有些许不一样。
* Secret资源对象:可以保存轻量的敏感信息,比如数据库的用户名和密码或者认证秘钥等。
它保存的数据是以秘文的方式存放的
* configMap资源对象:和Secret一样,拥有大多数共同的特性,但是区别是,configMap保存的是
一些不太重要的信息,它保存的数据是以明文的方式存放的。
当我们创建上述两种资源对象时,其实就是将这两种资源对象存储的信息写入了k8s群集中的etcd数据中心。
**相同点:**
都是用来保存轻量级信息的,可以供其他资源对象(Deployment、RC、RS和POd)进行挂载使用。
这两种资源对象的创建方法(4种)及引用方法(2种)都是一样的,都是以键值对的方式进行存储的。
**不同点:**
Secret是用来保存敏感信息的,而configMap是用来保存一些不太重要的数据的,具体表现在当我
们执行“kubectl describe ....”命令时,Secret这种类型的资源对象时查看不到其具体的信息的,
而configMap是可以查看到其保存的具体内容的。
假设存储的数据是:
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的这种存储方式是无法通过命令行查看的,再一个就是,这种存储方式的意义是什么?通过下面的使用方式,应该就可以明白其使用场景了。
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。
注:与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>
注:应用方式和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.
标签:amp res data file sleep 其他 文件中 space 存在
原文地址:https://blog.51cto.com/14306186/2523968