目录
一. 配置基础
- 先说一下k8s中配置相关的一些推荐点
- 配置分离,也就是不跟服务放在一起
- 涉及到版本回滚等问题,配置也推荐使用版本控制
- 推荐使用yaml类型配置文件
- 同一应用的不同配置,推荐根据环境分组,并且多个配置放到一个文件中方便管理
- k8s中的配置比较重要的就是两种:
- Secret: 通常用来保存敏感信息
- ConfigMap: 应用级别相关配置,非加密
二. Secret 配置介绍与使用示例
- 官方文档
- Secret通常用来保存敏感信息,例如密码、OAuth 令牌和 SSH 密钥,用户可以创建 Secret,同时k8s系统也会创建Secret
可以理解为将敏感信息存储为Secret配置,需要该配置的应用通过挂载引用即可,不再对外暴露,更安全
- Secret配置也分为不同类型:(可以执行"kubectl create secret --help" 命令查看解释)
- Opaque: 用户自定义的任意kv数据(例如服务应用需要的数据)
- docker-register: 下载私有镜像,连接私库的秘钥
- generic:
- tls: 证书相关
- 其它:
Secret 的创建
- 通命令行创建 Secret 示例
//创建Secret ,名为 dev-db-secret, 内部存储了username值为devuser与password值为aaabbb
kubectl create secret generic dev-db-secret --from-literal=username=devuser --from-literal=password=aaabbb
- yaml创建示例,注意在自己编写Secret的yaml时,data内部的数据key值不变,对应的value要使用base64编码后的
apiVersion: v1
kind: Secret
metadata:
name: dev-db-secret
data:
password: aaabbb #base64
username: ZGV2dXNlcg==
sss: sss
- 也可以根据文件创建Secret
kubectl create secret generic db-user-pass \
--from-file=./username.txt \
--from-file=./password.txt
Secret 的使用
- Secret 创建完毕后会保存到etcd,有两种使用方式
- 作为pod.env环境变量获取,注意该方式不会热更新
- 以挂载的方式使用Secret
- 首先执行命令查看需要的secret配置文件是否存在
kubectl get secret 文件名 -oyaml
1. pod.env 中作为环境变量获取使用 Secret
- 注意该方式不支持热更新,示例解释:
- containers中通过env设置环境变量,
- 在设置环境变量时,通过name属性,指定环境变量的key值为"SECRET_USERNAME",通过valueFrom中的secretKeyRef设置"SECRET_USERNAME"这个key对应的value来自一个Secret
- secretKeyRef.name: 指定使用哪个Secret,
- secretKeyRef.key:指定使对应Secret中哪个key的value
apiVersion: v1
kind: Pod
metadata:
name: secret-env-pod
spec:
containers:
- name: mycontainer
image: redis
env: #设置环境变量
- name: SECRET_USERNAME #指定环境变量中的key
valueFrom: #设置对应key的value
secretKeyRef: #指定value来自secret
name: mysecret #指定使用的secret的名字
key: username #指定使用secret中哪个key的value
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password
restartPolicy: Never
2. 以卷挂载的方式使用 Secret
- 在使用挂载方式时,获取secret中的key会以文件的形式挂载到对应需要的容器中
- 卷挂载的方式使用Secret 时,支持热更新,示例解释:
- mypod容器设置对外挂载目录为"/etc/foo", 名为foo
- pod中使用volumes对foo挂载点设置挂载了一个名为mysecret 的secret
- secret中的key会以文件的形式挂载,如果mysecret 中存在password这个key,那么挂载时,会把password作为"password.txt"文件挂载到容器的"/etc/foo"目录下
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mypod
image: redis
volumeMounts: #设置挂载
- name: foo
mountPath: "/etc/foo" #设置挂载路径,也就是当前容器内部的路径
readOnly: true #设置当前通过此处挂载的外部文件的模式,true时不允许通过此处修改挂载的文件
volumes: #设置挂载
- name: foo #与指定容器设置的挂载名对应,也就指定设置哪个容器的挂载
secret: #指定挂载类型,当前挂载secret
secretName: mysecret #对应secret的名字,该方式是挂载该secret下的所有key
- name: foo2
secret:
secretName: mysecret2
items:
- key: password.txt #也就是获取mysecret2 这个secret中key为password数据
path: pwd.md #可以理解为获取password.txt数据文件,设置为pwd.md
三. ConfigMap 介绍与使用示例
- 通常情况下ConfigMap用来保存配置,将配置数据和应用程序代码分开,与Secret 不同的是,Secret 中保存的数据value是经过base64编码后的,读取Secret时会自动解码,而ConfigMap不会编码,读取时也不会解码官方文档
- ConfigMap 是一种 API 对象,用来将非机密性的数据保存到键值对中,可以将其用作环境变量、命令行参数或者存储卷中的配置文件, 例如使用配置中心时,不同环境通过配置中心引用不同的配置文件, 现在将配置文件改为ConfigMap,不同环境引用不同的ConfigMap 即可
ConfigMap 创建
- yaml方式创建ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
name: game-demo
data: # 存储的kv键值对
player_initial_lives: "3"
ui_properties_file_name: "user-interface.properties"
#类文件设置示例,可以简单理解为设置game.properties配置文件,添加key为enemy.types对应value为aliens,monsters...
game.properties: | #"|"表示有多个kv
enemy.types=aliens,monsters
player.maximum-lives=5
user-interface.properties: |
color.good=purple
color.bad=yellow
allow.textmode=true
ConfigMap 的使用
- 可以通过四种方式来使用 ConfigMap 配置 Pod 中的容器
- 在容器命令和参数内
- 容器的环境变量
- 在只读卷里面添加一个文件,让应用来读取
- 编写代码在 Pod 中运行,使用 Kubernetes API 来读取 ConfigMap
apiVersion: v1
kind: Pod
metadata:
name: configmap-demo-pod
spec:
containers:
- name: demo
image: alpine
command: ["sleep", "3600"]
env: #定义环境变量
- name: PLAYER_INITIAL_LIVES # 请注意这里和 ConfigMap 中的键名是不一样的
valueFrom:
configMapKeyRef: #通过该属性值指定使用configMap配置
name: game-demo #指定使用的ConfigMap名字
key: player_initial_lives #指定要取对应configMap中的哪个key
- name: UI_PROPERTIES_FILE_NAME
valueFrom:
configMapKeyRef:
name: game-demo
key: ui_properties_file_name
volumeMounts:
- name: config #挂载名
mountPath: "/config" #挂载路径
readOnly: true
volumes: #设置挂载
- name: config
configMap: #指定挂载configMap配置
name: game-demo #需要挂载的configMap名字
items:
- key: "game.properties" #在挂载时configMap中的每一个key都会挂载为一个properties配置文件,指定使用哪个
path: "game.properties" #将获取到key.properties设置为当前需要的key
- key: "user-interface.properties"
path: "user-interface.properties"