配置容器化应用程序
1 | # 应用程序 会将配置嵌入到程序本身 方式: |
1 | # 为何使用 环境变量 |
容器传递命令行参数
在 Docker 中定义命令与参数
1 | 1. 容器中运行完整的指令两部分组成: 命令与参数 |
了解 shell 和 exec 的区别
1 | shell: ENTRYPOINT node app.js |
1 | # 主进程(pid=1) 是 shell进程 而非 node 进程,node(pid=7)进程于shell中启动 |
可配置化镜像中的间隔参数
1 | # 修改循环延迟间隔,使其可配置 |
1 | # 传递一个间隔参数覆盖默认值 |
在 K8S 中覆盖命令和参数
1 | 1. 在k8s定义容器时,镜像的ENTRYPOINT 和 CMD 是可以被覆盖的 |
1 | Docker K8S 描述 |
1 | [root@k8s-master1 forloop]# vim fortune-pod.yaml |
容器设置环境变量
1 | # 脚本中删除 命令行传参 NUM=$1 |
环境变量引用其他环境变量
1 | env: |
硬编码环境变量
1 | 1. pod中定义硬编码环境变量 无法有效区分 生产环境与开发环境的pod定义 |
使用 ConfigMap 解耦配置
1 | 1. K8S 可以将配置选项分离到 单独的资源对象 ConfigMap中 |
创建 ConfigMap
通过 kubectl 创建 ConfigMap
1 | # 1. ConfigMap的键名 必须是一个合法的DNS子域 数字字母、破折号、下划线和圆点 |
通过 yaml 文件创建 ConfigMap
1 | [root@k8s-master1 configmap]# kubectl get cm fortune-config -o yaml > fortune-config.yaml |
从文件内容创建 ConfigMap
1 | [root@k8s-master1 configmap]# cat my.conf |
1 | # 指定键名 |
1 | [root@k8s-master1 configmap]# cat redis.conf |
使用 变量方式 传给容器
1 | [root@k8s-master1 configmap]# vim fortune-pod.yaml |
在 Pod 中引用不存在的 ConfigMap
1 | 1. k8s 正常调度尝试所有容器 |
使用 envFrom 一次性传入所有ConfigMap下的键值对
1 | [root@k8s-master1 configmap]# vim my.conf |
1 | [root@k8s-master1 configmap]# vim my-pod.yaml |
使用 命令行参数 传给容器
1 | [root@k8s-master1 forloop]# vim fortune-pod.yaml |
使用 卷形式暴露 ConfigMap
1 | 1. 环境变量和命令行传参 作为配置值通常适用于变量值较短的场景 |
1 | [root@k8s-master1 configmap-file]# vim my-nginx-config.conf |
1 | [root@k8s-master1 configmap-file]# cat sleep-interval |
1 | [root@k8s-master1 configmap-file]# cat redis.cfg |
1 | # 现在我有三段不同的配置文件 nginx 延迟值 和 redis配置 |
将整个文件夹下的所有配置文件 创建 ConfigMap
1 | [root@k8s-master1 configmap-file]# kubectl create configmap fortune-config --from-file=/opt/demo/configmap-file/ |
Volume 卷形式挂载到 pod 中
1 | [root@k8s-master1 configmap-file]# vim fortune-pod-cm-volume.yaml |
1 | # 测试 |
1 | # 查看挂载的文件 |
卷内暴露指定的 ConfigMap 数据
1 | # 想让my-nginx-config.conf作为文件暴露在 /etc/nginx/conf.d下 |
1 | volumes: |
1 | [root@k8s-master1 configmap-file]# kubectl exec fortune-kbddc -c web-server ls /etc/nginx/conf.d |
注意点
1 | 1. 挂载某一个文件会隐藏该文件夹中已存在的文件 |
更新应用配置且不重启应用程序
1 | 1. 环境变量和命令行传参作为配置源的弊端在于无法修改pod中的配置 |
1 | [root@k8s-master1 configmap-file]# kubectl edit cm fortune-config |
1 | [root@k8s-master1 configmap-file]# kubectl exec fortune-kbddc -c web-server cat /etc/nginx/conf.d/gzip.conf |
1 | # 手动通知 nginx 重启程序 |
Secret 给容器传递敏感数据
1 | 1. Secret 可作为环境变量传值给容器 |
默认令牌 Secret
1 | 1. 默认被挂载只所有容器的 Secret |
创建 Secret
1 | # 测试将https 的证书秘钥传送给Nginx容器 |
在 Pod 中读取 Secret
1 | 1. 通过secret卷 将Secret暴露给容器 |
在 Pod 中使用 Secret
1 | # 开启之前nginx配置的 https选项 |
1 | # 挂载 secret 到 pod里 |
1 | [root@k8s-master1 secret]# vim fortune-svc.yaml |
1 | # 测试 |
Secret 卷 存储于内存
1 | [root@k8s-master1 secret]# kubectl exec fortune-95lsq -c web-server -- mount | grep certs |
在私有镜像仓库中 使用 Secret
1 | 0. 镜像仓库 设置为 私有仓库,并且上传一个镜像 |
1 | [root@k8s-master1 secret]# vim base.yaml |
不需要为每个 Pod 指定镜像拉取 Secret
1 | 1. 如果系统中运行大量Pod,是否每个Pod都要配置镜像拉取Secret |