一.Secret(加密处理)
- Secret字段的意义是加密数据并且存入etcd中,让Pod的容器以挂载volume方式访问。
- 使用Secret字段可以存储和管理敏感信息。例如,密码、令牌和ssh密钥等。相比于将这些信息存储在普通文件中,在机密信息中存储更加安全,灵活。
- 设置Secret加密处理时,可以通过kubectl命令创建,也可以通过yaml文件创建
- 以下时Secret应用解析图
- 方式一:使用文件传入参数,并且通过kubectl创建资源
[root@master ~]# echo 'admin' > ./username.txt
[root@master ~]# echo '123abc' > ./password.txt
//secret表示控制器类型,generic为从本地文件或者目录创建一个机密
[root@master ~]# kubectl create secret generic db-user-pass --from-file=./username.txt --from-file=./password.txt
secret/db-user-pass created
//查看secret类型下的资源
[root@master ~]# kubectl get secret
NAME TYPE DATA AGE
db-user-pass Opaque 2 13s
default-token-h4tl7 kubernetes.io/service-account-token 3 26d
//查看db-user-pass的详细信息
[root@master ~]# kubectl describe secret db-user-pass
Name: db-user-pass
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
password.txt: 7 bytes ##可见在secret模式下,不能明文显示导入的参数
username.txt: 6 bytes
[root@master ~]#
- 方式二:使用加密数据导入资源,并且通过编辑yaml文件创建资源
##将数据加密,并且存储到加密资源中去
[root@master ~]# echo -n 'admin' | base64
YWRtaW4=
[root@master ~]# echo -n '123abc' | base64
MTIzYWJj
[root@master ~]# cat secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: YWRtaW4=
password: MTIzYWJj
[root@master ~]# kubectl create -f secret.yaml
secret/mysecret created
[root@master ~]# kubectl get secret
NAME TYPE DATA AGE
db-user-pass Opaque 2 68m
default-token-h4tl7 kubernetes.io/service-account-token 3 26d
mysecret Opaque 2 9s
[root@master ~]# kubectl get secret mysecret -o yaml
apiVersion: v1
data:
password: MTIzYWJj
username: YWRtaW4=
kind: Secret
metadata:
creationTimestamp: 2020-05-24T07:45:35Z
name: mysecret
namespace: default
resourceVersion: "439706"
selfLink: /api/v1/namespaces/default/secrets/mysecret
uid: 8d7e5069-9d92-11ea-bb1a-000c29ce5f24
type: Opaque
[root@master ~]#
-
创建pod资源使用加密变量
//创建pod资源,调用mysecret里面的参数
[root@master demo]# cat secret-var.yaml
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: nginx
image: nginx
env:
- name: SECRET_USERNAME #定义变量
valueFrom:
secretKeyRef: #secret资源
name: mysecret #secret资源的名字,名字要正确
key: username #指定username赋值给变量SECRET_USERNAME
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password
[root@master demo]# kubectl create -f secret-var.yaml
pod/mypod created
[root@master demo]# kubectl get pods
NAME READY STATUS RESTARTS AGE
mypod 1/1 Running 0 12s
##进入mypod资源,查看具体变量
[root@master demo]# kubectl exec -it mypod bash
root@mypod:/# echo $SECRET_USERNAME
admin
root@mypod:/# echo $SECRET_PASSWORD
123abc
root@mypod:/#
-
使用volume数据卷的形式,将secret存储的参数挂载到pod资源目录下,具体操作如下所示:
##为避免重名pod资源,删除之前pod的资源
[root@master demo]# kubectl delete -f secret-var.yaml
pod "mypod" deleted
[root@master demo]# cat secret-val.yaml
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: nginx
image: nginx
volumeMounts: ##使用容器卷字段,挂载
- name: foo ##定义pod中的容器的挂载名
mountPath: "/etc/foo" ##定义挂载目录
readOnly: true ##定义权限
volumes:
- name: foo
secret: ##定义secret资源
secretName: mysecret ##挂载mysecret资源
##创建新的资源
[root@master demo]# kubectl create -f secret-val.yaml
pod/mypod created
[root@master demo]# kubectl get pods
NAME READY STATUS RESTARTS AGE
mypod 1/1 Running 0 11s
[root@master demo]# kubectl exec -it mypod bash
root@mypod:/# ls /etc/foo
password username
root@mypod:/# cat /etc/foo/password
123abc
root@mypod:/#
二.ConfigMap(应用配置)
- ConfigMap控制器和Secret类似,区别在于ConfigMap保存的式不需要加密配置的信息
- ConfigMap主要用于应用配置。实例解析图如下:
使用ConfigMap字段存储一些比如IP地址,端口号等,应用于微服务的松耦合之间
- 使用参数文件创建configmap资源传入参数,并且在yaml中使用挂载的方式创建mypod资源使用configmap参数
##删除mypod资源避免后面重名
[root@master demo]# kubectl delete -f secret-val.yaml
pod "mypod" deleted
##创建参数文件
[root@master demo]# cat redis.properties
redis.host=127.0.0.1
redis.port=6379
redis.password=123456
##创建configmap资源,名字为redis-config,参数来自文件redis.properties
[root@master demo]# kubectl create configmap redis-config --from-file=redis.properties
configmap/redis-config created
##查看configmap资源
[root@master demo]# kubectl get configmap
NAME DATA AGE
redis-config 1 11s
##查看详细信息
[root@master demo]# kubectl describe configmap redis-config
Name: redis-config
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
redis.properties: ##可以看到configmap资源参数时是明文显示的
----
redis.host=127.0.0.1
redis.port=6379
redis.password=123456
Events: <none>
##创建pod的yaml文件
[root@master demo]# cat 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 ##重启策略,完成操作之后不重启
[root@master demo]# kubectl create -f cm.yaml
pod/mypod created
[root@master demo]# kubectl get pods
NAME READY STATUS RESTARTS AGE
mypod 0/1 ContainerCreating 0 14s
[root@master demo]# kubectl get pods -w ##实时查看pod的状态
NAME READY STATUS RESTARTS AGE
mypod 0/1 ContainerCreating 0 19s
mypod 0/1 Completed 0 22s
^C[root@master demo]# kubectl logs mypod ##查看pod操作的日志
redis.host=127.0.0.1
redis.port=6379
redis.password=123456
[root@master demo]#
-
使用参数变量创建configmap资源,在利用变量创建pod资源使用configmap中的变量
##前面清楚相应资源,避免重名
#创建myconfig类的资源
[root@master demo]# cat myconfig.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: myconfig
namespace: default
data:
special.level: info ##定义变量
special.type: hello
[root@master demo]# kubectl create -f myconfig.yaml
configmap/myconfig created
[root@master demo]# kubectl get configmap
NAME DATA AGE
myconfig 2 21s
#创建pod资源使用configmap资源的变量
[root@master demo]# cat config-var.yaml
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: busybox
image: busybox
command: [ "/bin/sh", "-c", "echo $(LEVEL) $(TYPE)" ]
env:
- name: LEVEL
valueFrom: ##指定变量来自于
configMapKeyRef: ##指定变量源
name: myconfig ##指定变量名
key: special.level #指定变量
- name: TYPE
valueFrom:
configMapKeyRef:
name: myconfig
key: special.type
restartPolicy: Never
[root@master demo]# kubectl apply -f config-var.yaml
pod/mypod created
[root@master demo]# kubectl get pods -w
NAME READY STATUS RESTARTS AGE
mypod 0/1 ContainerCreating 0 11s
mypod 0/1 Completed 0 17s
#查看mypod资源的日志输出
[root@master demo]# kubectl logs mypod
info hello
[root@master demo]#