Kubernetes进阶之secret及configmap配置管理
目录:
一 从外部访问应用最佳方式
二 配置管理
三 数据卷与数据持久卷
四 再谈有状态应用部署
五 K8S 安全机制
二、配置管理
Pod使用secret两种方式:
? 变量注入 (就是我们在写yaml的时候直接让它以变量的方式注入进去,注入pod中,去引用这个变量,去做相关的处理)
? 挂载(直接从volume的形式挂载到我们指定的目录下)
Configmap
与Secret类似,区别在于ConfigMap保存的是不需要加密配置信息。
应用场景:应用配置
官方文档使用secret:https://kubernetes.io/docs/concepts/configuration/secret/
可以创建secret主要放一些加密数据,不希望别人看到的,比如用户名密码,保存这样的数据
存储好怎么让用户去访问,可以通过ingress指定一下secret名字,一般情况下创建pod业务容器的话,就需要指定这个secret到哪个地方或者以volume的方式挂载的
加密数据并存放Etcd中,让Pod的容器以挂载Volume方式访问。
应用场景:凭据
创建资源的时候 , YAML 或 JSON 格式 , 然后创建该对象。在包含两个映射 : stringdata 和数据。该数据字段用于存储任意数据 , 用 Base64 编码。在 stringdata 提供 , 并允许您提供秘密数据为未编码的字符串。
例如 , 两个字符串存储到在yaml的使用 , 将他们转换成 BASE64:
这里的变量转换为编码,提示敏感字符,下面的yaml文件没写上去,抱歉
[[email protected] demo]# echo -n ‘root‘ | base64
[[email protected] demo]# echo -n ‘zhaocheng‘ | base64
[[email protected] cert]# vim secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username:
password:
[[email protected] cert]# kubectl create -f secret.yaml
[[email protected] demo]# vim secret-pod1.yaml
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: nginx
image: nginx
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: mysecret
key: username
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password
[[email protected] demo]# kubectl create -f secret-pod1.yaml
[[email protected] demo]# kubectl get pod
NAME READY STATUS RESTARTS AGE
busybox 1/1 Running 35 4d1h
mypod 1/1 Running 0 2m27s
nginx-5ddcc6cb74-m8dwr 1/1 Running 0 5h47m
nginx-5ddcc6cb74-rs8b6 1/1 Running 0 4h34m
nginx-5ddcc6cb74-zm7cz 1/1 Running 0 4h34m
[[email protected] demo]# kubectl exec -it mypod sh
ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
echo $SECRET_USERNAME
root
echo $SECRET_PASSWORD
zhaocheng
应用场景:
一般写Dockerfile的时候,或者docker-compose的时候,能自动的去处理这些变量,也就是这个值被k8s进来解码
通过volume的形式来挂载
一般使用volume来把一些证书比如https的证书通过变量的形式传入挂载到目录中
[[email protected] demo]# vim secret-pod2.yaml
apiVersion: v1
kind: Pod
metadata:
name: mypod2
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: foo
mountPath: "/etc/foo"
readOnly: true
volumes:
- name: foo
secret:
secretName: mysecret
[[email protected] demo]# kubectl create -f secret-pod2.yaml
[[email protected] demo]# kubectl get pod
NAME READY STATUS RESTARTS AGE
mypod 1/1 Running 0 6m1s
mypod2 1/1 Running 0 9s
nginx-5ddcc6cb74-lplxl 1/1 Running 0 43m
[[email protected] demo]# kubectl exec -it mypod2 bash
[email protected]:/# ls /etc/foo/
password username
[email protected]:/# cat /etc/foo/password
[email protected]:/# cat /etc/foo/username
[email protected]:/#
Configmap
与Secret类似,区别在于ConfigMap保存的是不需要加密配置信息。
应用场景:应用配置
使用configmap来传入变量
官方文档:https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/
[[email protected] demo]# vim configmap1.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: myconfig
namespace: default
data:
special.level: info
special.type: hello
---
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
[[email protected] demo]# kubectl get pod
NAME READY STATUS RESTARTS AGE
mypod 1/1 Running 0 26m
mypod2 1/1 Running 0 20m
mypod3 0/1 Completed 0 41s
nginx-5ddcc6cb74-lplxl 1/1 Running 0 63m
[[email protected] demo]# kubectl logs mypod3
info hello
使用redis的一个实例
[[email protected] demo]# vim configmap2.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: redis-config
data:
redis.properties: |
redis.host=127.0.0.1
redis.port=6379
redis.password=123456
---
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
[[email protected] demo]# kubectl create -f configmap2.yaml
[[email protected] demo]# kubectl get pod
NAME READY STATUS RESTARTS AGE
mypod 1/1 Running 0 30m
mypod2 1/1 Running 0 24m
mypod3 0/1 Completed 0 4m58s
mypod4 0/1 Completed 0 15s
nginx-5ddcc6cb74-lplxl 1/1 Running 0 68m
验证这里已经将内容发送到控制台
[[email protected] demo]# kubectl logs mypod4
redis.host=127.0.0.1
redis.port=6379
redis.password=123456
原文地址:https://blog.51cto.com/14143894/2436194