配置管理
- 研究的是配置和应用如何分离
- 如何把跟应用无关的配置给它抽离出来,让它在不同的环境中运行
ConfigMap 配置
-
ConfigMap
- API对象,它用于把环境变量和容器镜像进行解耦
- 它不提供加密的功能,如果要存机密数据请用secret
- 场景
- 比如在连接数据库时,database, host, port 等
- 修改源码的方式是非常不可取的,需要将这类文件写入ConfigMap中
- 并将配置项作为环境变量,注入到容器里面,来覆盖代码中的变量
- 示例
apiVersion: v1 kind: ConfigMap metadata: name: appvar data: # 类属性键;每一个键都映射到一个简单的值 player_initial_lives: "3" ui_properties_file_name: "user-interface.properties" # # 类文件键 game.properties: | enemy.types=aliens,monsters player.maximum-lives=5 user-interface.properties: | color.good=purple color.bad=yellow allow.textmode=true- 这是一个game游戏的一个demo,定义了一系列的这个数据
- 一些和环境相关的配置,可以放到 ConfigMap 里面
-
可以使用四种方式来使用 ConfigMap 配置 Pod 中的容器:
- 1 )容器 entrypoint 的命令行参数
- 2 )容器的环境变量去覆盖
- 3 )在只读卷里面添加一个文件,让 ConfigMap Read from File
- 4 )编写代码在 Pod 中运行,使用 Kubernetes API 来读取 ConfigMap
-
注意
- 这些不同的方法适用于不同的数据使用方式
- 对前三个方法,kubelet 使用 ConfigMap 中的数据在Pod 中启动容器
- 第四种方法意味着你必须编写代码才能读取 ConfigMap 和它的数据
- 然而,由于是直接使用Kubernetes API,因此只要 ConfigMap 发生更改
- 你的应用就能够通过订阅来获取更新,并且在这样的情况发生的时候做出反应
- 通过直接进入 Kubernetes API
- 这个技术也可以让你能够获取到不同的命名空间里的 ConfigMap
-
基于环境变量方式使用ConfigMap示例
- envFrom字段,可以实现在Pod环境中
- 将ConfigMap中所有定义的key=value自动生成为环境变量
- $
vi cm-demo1.yamlapiVersion: v1 kind: ConfigMap metadata: name: appvar data: apploglevel: info appdatadir: /var/data --- apiVersion: v1 kind: Pod metadata: name: pod-test spec: containers: - name: test image: busybox command: ["sh", "-c", "env | grep app"] envFrom: - configMapRef: name: appvar restartPolicy: Never - $
kubectl apply -f cm-demo1.yamlconfigmap/appvar created pod/pod-test created - $
kubectl get pod pod-testNAME READY STATUS RESTARTS AGE pod-test 0/1 Completed 0 4m12s - $
kubectl logs pod-testapploglevel=info appdatadir=/var/data- 这里可以看到,在pod中输出了环境变量
- $
kubectl get configmap | grep appappvar 2 7m20s - $
kubectl describe configmap appvarName: appvar Namespace: default Labels: <none> Annotations: <none> Data ==== appdatadir: ---- /var/data apploglevel: ---- info BinaryData ==== Events: <none>
-
注意
- 环境变量的名称受POSIX命名规范约束,不能以数字开头
- 如果配置中包含非法字符,系统将会跳过该条环境变量的创建
- 并记录一个Event用来提醒用户环境变量无法生成
- 但并不阻止Pod的启动
Secret 配置
-
Secret 管理密钥
- 比如说数据库的 password,这属于密文
- 不应该写在代码里面,也不应该公开出来
-
要使用 Secret,Pod 需要引用 Secret,Pod 可以用三种方式之一来使用 Secret
- A )作为挂载到一个或多个容器上的 卷 中的文件
- B )作为容器的环境变量
- C )由 kubelet 在为 Pod 拉取镜像时使用
创建Secret的两种方式
1 )直接通过命令创建
- $
kubectl create secret generic dev-db-secret --from-literal=username=devuser --from-literal=password='S!B\*d$zDsb='secret/dev-db-secret created
2 )通过文件来创建秘钥
- 先创建两个文件
echo -n 'admin' > /tmp/username.txt echo -n 'xxds21f2dsw21e2e67df' > /tmp/password.txt - 再基于文件来创建 secret
- $
kubectl create secret generic db-user-pass --from-file=/tmp/username.txt --from-file=/tmp/password.txtsecret/db-user-pass created - 创建完成后,文件就可以删除了
- $
3 )查看秘钥
- 秘钥创建完了,不管哪种方式查看秘钥都一样,用第二种方式创建的秘钥来举例
- 获取 secret $
kubectl get secret | grep dbdb-user-pass Opaque 2 6m29s - 查看具体信息 $
kubectl describe secret db-user-passName: db-user-pass Namespace: default Labels: <none> Annotations: <none> Type: Opaque Data ==== password.txt: 20 bytes username.txt: 5 bytes - 默认情况下,kubectl get 和 kubectl describe 避免显示密码的内容
- 这是为了防止机密被意外地暴露给旁观者或存储在终端日志中
906



被折叠的 条评论
为什么被折叠?



