K8S-配置管理(Secret与Configmap)
1.配置容器化应用的方式(1)自定义命令行参数;args: [](2)把配置文件直接焙进镜像;2018/8/23 kubernetes.txt(3)环境变量① Cloud Native的应用程序一般可直接通过环境变量加载配置;② 通过entrypoint脚本来预处理变量为配置文件中的配置信息;(4)存储卷2.Secret(加密)官网文档:https://kubernetes.io...
1.配置容器化应用的方式
(1)自定义命令行参数;
args: []
(2)把配置文件直接焙进镜像;2018/8/23 kubernetes.txt
(3)环境变量
① Cloud Native的应用程序一般可直接通过环境变量加载配置;
② 通过entrypoint脚本来预处理变量为配置文件中的配置信息;
(4)存储卷
2.Secret(加密)
官网文档:https://kubernetes.io/docs/concepts/configuration/secret/
加密数据并存放Etcd中,让Pod的容器以挂载Volume方式访问。
应用场景:凭据 、私钥、证书、某一些密码 base64编码
Pod使用secret两种方式:
• 变量注入
• 挂载
保存类型
docker-registry docker仓库的认证方式
generic 通用,文件或者一些变量
tls tls证书
(1)配置docker私有仓库(在pod的spec中配置使用的secret的名字)
在pod的配置段配置拉取使用的secret
spec:
imagePullSecrets:
- name: myregistrykey
containers:
配置secret
kubectl create secret docker-registry secret名字 --docker-server=docker私有仓库地址 --docker-username=用户名 --docker-password=密码 --docker-email=邮箱
示例kubectl create secret docker-registry regsecret --docker-server=registry.fjhb.cn --docker-username=ylw --docker-password=123 --docker-email=ylw@fjhb.cn
[root@k8s-master nfs]# echo 555 | base64
NTU1Cg==
[root@k8s-master nfs]# echo NTU1Cg== | base64 -d
555
(2)在pod指定serviceaccountName(pod连接api-server的用户)
然后serviceaccountName对应的serviceaccount具备docker私有仓库的认证信息
这样可以更加安全在pod种只能看到sa并不能看到我们sa的信息
(3)变量注入
Base 64加密
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque #通用类型
data:
username: YWRtaW4=
password: MWYyZDFlMmU2N2Rm
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: nginx
image: nginx
env:
- name: SECRET_USERNAME #传给容器内的变量
valueFrom:
secretKeyRef:
name: mysecret #用的哪一个secret
key: username #secret的key
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password
(4)数据卷挂载
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
3.Configmap(不加密)
官网文档:https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/
与Secret类似,区别在于ConfigMap保存的是不需要加密配置信息。
应用场景:应用配置
Configmap也是名称空间级别的类型简称(cm),一些列配置数据的集合,让镜像变得更加灵活,保存的所有都是键值对,value没有长度限制,在pod启动的时候,可以从configmap的key获取相关的配置项
命令行创建
[root@k8s-master nfs]# kubectl create configmap nginx
–from-file=www=1.conf www为key Value为1.conf的内容 如果没有www的话那么key就默认为文件名
(1)变量注入(这种方法只会在pod启动生效,无法实时更新)
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 #引用的configmap的名字
key: special.type #这个是从configmap中获取的key,通过key获取value
optional: true(flase) 布尔值 #如果有这个的话就是没有configmap也没事,以后添加也可以,如果没有这个那么如果你选择的configmap一旦没有那么直接报错
restartPolicy: Never
(2)数据卷挂载
相当于做了个软连接 把configmap的内容软连接pod中你挂在目录路下,实时更新,虽然实时更新,但是读取配置文件的话还需要web热加载一下,不支持热加载的需要重启一下,那么就需要灰度发布
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: mypod2
spec:
containers:
- name: busybox
image: busybox
command: [ "/bin/sh","-c","cat /etc/config/redis.properties" ]
volumeMounts: #使用存粗卷挂载
- name: config-volume #存储卷名字
mountPath: /etc/config #挂载到哪里(容器)
readOnly: true #不应该由容器来改变,只读挂载(这个可以没有,没有的话表示读写挂载)
volumes: #村粗卷
- name: config-volume #存粗卷名称
configMap: #类型为configmap
name: redis-config #configmap名字
restartPolicy: Never
一个configmap可能会有多个key,但是我们如果只需要其中的某一个或几个的话可以用
items(是个列表)来指定并且用key和path还有mode做一些管控,key是键,path是文件路径不能用…来写,mode是文件权限比如0700等等
查询姿势kubectl explain pod.spec.volumes.configMap.items
官方文档示例:https://kubernetes.io/docs/concepts/storage/volumes/#configmap
是写在volumes中 设置这个存储卷使用那些key,然后volumeMounts直接使用即可
更多推荐
所有评论(0)