经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Linux/Shell » 查看文章
Kubernetes 实战——配置应用(ConfigMap、Secret)
来源:cnblogs  作者:LB477  时间:2021/6/21 10:00:44  对本文有异议

配置容器化应用的方式:①命令行参数;②环境变量;③文件化配置

一、向容器传递命令行参数或环境变量

这两种方式在 Pod 创建后不可被修改

1. 在Docker中定义命令与参数

  • ENTRYPOINT:容器启动时被调用的可执行程序
  • CMD:传递给 ENTRYPOINT 的默认参数。可被覆盖docker run <image> <arguments>

上面两条指令均支持以下两种形式

  • shellENTRYPOINT node app.js/bin/sh -c node app.js
  • execENTRYPOINT ["node", "app.js"]node app.js

e.g.

  1. FROM ubuntu:latest
  2. ADD test.sh /bin/test.sh # test.sh每“$1”秒输出一行文本
  3. ENTRYPOINT ["/bin/test.sh"]
  4. CMD ["10"]
  1. docker build -t lb/test:args .
  2. docker push lb/test:args
  3. docker run -it lb/test:args
  4. docker run -it lb/test:args 15 # 传递参数

2. 向容器传递命令行参数

镜像的 ENTRYPOINT 和 CMD 均可被覆盖

  1. kind: Pod
  2. spec:
  3. containers:
  4. - image: some/image
  5. command: ["/bin/command"] # 对应ENTRYPOINT,一般情况不覆盖
  6. args: ["arg1", "arg2"] # 对应CMD

另一种参数表示方式

  1. args:
  2. - foo # 字符串无需引号标记
  3. - "15" # 数值需要

3. 为容器设置环境变量

K8s 可为 Pod 中的每个容器指定环境变量

  1. kind: Pod
  2. spec:
  3. containers:
  4. - image: some/image
  5. env: # 指定环境变量
  6. - name: FOO
  7. value: "foo"
  8. - name: BAR
  9. value: "$(INTERVAL)bar" # 引入其他环境变量(command和args属性值也可以借此引用环境变量)

在每个容器中,K8s 会自动暴露相同命名空间下每个 service 对应的环境变量

二、ConfigMap

1. 介绍

  • 本质为键值对映射,值可以为字面量配置文件
  • 应用无需读取 ConfigMap,映射的内容通过环境变量卷文件的形式传递给容器
  • Pod 通过名称引用 ConfigMap

2. 创建 ConfigMap

  1. apiVersion: v1
  2. kind: ConfigMap
  3. data:
  4. sleep-interval: "25" # 配置条目
  5. metadata:
  6. name: my-config

直接创建

  1. # 可指定字面量或配置文件
  2. kubectl create configmap my-config --from-file=foo.json \ # 单独的文件
  3. --from-file=bar=foobar.conf \ # 自定义键名目录下的文件
  4. --from-file=config-opts/ \ # 完整文件夹
  5. --from-literal=some=thing # 字面量

ConfigMap 键名需仅包含数字、字母、破折号、下划线、圆点,可首位圆点。键名不合法则不会映射

3. 传递 ConfigMap 作为环境变量

  1. kind: Pod
  2. spec:
  3. containers:
  4. - image: some/image
  5. env:
  6. - name: INTERVAL
  7. valueFrom: # 使用ConfigMap中的key初始化
  8. configMapKeyRef:
  9. name: my-config
  10. key: sleep-interval

启动 Pod 时若无 ConfigMap:Pod 正常调度,容器启动失败。后续创建 ConfigMap,失败容器会重启。可设置configMapKeyRef.optional=true,这样即使 ConfigMap 不存在,容器也能启动

一次性传递所有

  1. spec:
  2. containers:
  3. - image: some/image
  4. envFrom: # 传递所有
  5. - prefix: CONFIG_ # 为所有环境变量设置前缀(可选)
  6. configMapKeyRef:
  7. name: my-config

若不是合法的环境变量名称,K8s 不会自动转换键名(如 CONFIG_FOO-BAR)

4. 传递 ConfigMap 作为命令行参数

使用 ConfigMap 初始化某个环境变量,然后在参数字段中引用该环境变量

  1. apiVersion: v1
  2. kind: Pod
  3. spec:
  4. containers:
  5. - image: some/image
  6. env:
  7. - name: INTERVAL
  8. valueFrom:
  9. configMapKeyRef:
  10. name: my-config
  11. key: sleep-interval
  12. args: ["$(INTERVAL)"] # 参数中引用环境变量

5. 传递 ConfigMap 作为配置文件

ConfigMap 卷会将每个条目暴露成一个文件,运行在容器中的进程可通过读取文件内容获取相应的值

将 ConfigMap 卷挂载到某个文件夹

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: test-configmap
  5. spec:
  6. containers:
  7. - image: nginx:alpine
  8. name: web-server
  9. volumeMounts:
  10. - name: config
  11. mountPath: /etc/nginx/conf.d/ # 挂载到文件夹会隐藏该文件夹中已存在的文件
  12. readOnly: true
  13. volumes:
  14. - name: config
  15. configMap:
  16. name: fortune-config

  1. $ kubectl exec test-configmap -c web-server ls /etc/nginx/conf.d
  2. my-nginx-config.conf
  3. sleep-interval

暴露指定的 ConfigMap 条目

  1. spec:
  2. volumes:
  3. - name: config
  4. configMap:
  5. name: fortune-config
  6. items: # 只暴露指定条目为文件
  7. - key: my-nginx-config.conf
  8. path: test.conf
  9. # 此时 /etc/nginx/conf.d/ 中只有 test.conf

不隐藏文件夹中的其他文件

subPath 可用作挂载卷中的某个独立文件或文件夹,无需挂载整个卷

  1. spec:
  2. containers:
  3. - image: some/image
  4. volumeMounts:
  5. - name: config
  6. mountPath: /etc/someconfig.conf # 挂载到某个文件
  7. subPath: myconfig.conf # 仅挂载条目myconfig.conf

这种文件挂载方式会有文件更新的缺陷

为 ConfigMap 卷中的文件设置权限

  1. volumes:
  2. - name: config
  3. configMap:
  4. name: fortune-config
  5. defaultMode: "6600" # 默认644

6. 更新配置且不重启应用程序

更新 ConfigMap 后,卷中引用它的文件也会相应更新,进程发现文件改变后进行重载。K8s 也支持文件更新后手动通知容器

  1. kubectl edit configmap fortune-config
  2. kubectl exec test-configmap -c web-server cat /etc/nginx/conf.d/my-nginx-config.conf
  3. kubectl exec test-configmap -c web-server -- nginx -s reload
  • 所有文件会被一次性更新:ConfigMap 更新后,K8s 会创建一个文件夹写入所有文件,最终将符号链接转为该文件夹
  • 如果挂载的是容器中的单个文件而不是完整的卷,ConfigMap 更新后对应的文件不会被更新

三、Secret

与 ConfigMap 类似。区别:①K8s 仅将 Secret 分发到需要访问 Secret 的 Pod 所在的机器节点;②只存在于节点的内存中;③etcd 以加密形式存储 Secret

1. 默认令牌 Secret

默认被挂载到所有容器(可通过设置 Pod 定义中或 Pod 使用的服务账户中的automountServiceAccountToken=false来关闭该默认行为)

  1. $ kubectl get secrets
  2. NAME TYPE DATA AGE
  3. default-token-zns7b kubernetes.io/service-account-token 3 2d
  4. $ kubectl describe secrets
  5. ...
  6. Data # 包含从 Pod 内部安全访问 K8s API 服务器所需的全部信息
  7. ====
  8. ca.crt: 570 bytes
  9. namespace: 7 bytes
  10. token: eyJhbGciO...
  11. $ kubectl describe pod
  12. ...
  13. Mounts:
  14. /var/run/secrets/kubernetes.io/serviceaccount from default-token-zns7b
  15. $ kubectl exec mypod ls /var/run/secrets/kubernetes.io/serviceaccount/
  16. ca.crt
  17. namespace
  18. token

2. 创建 Secret

  1. $ kubectl create secret generic fortune-https --from-file=https.key --from-file=https.cert --from-file=foo
  2. $ kubectl get secret fortune-https -o yaml
  3. apiVersion: v1
  4. kind: Secret
  5. data:
  6. foo: YmFyCg==
  7. https.cert: HtD4SF...
  8. https.key: PJgF0G...

Secret 条目的内容会被 Base64 编码:Secret 条目可涵盖二进制数据,Base64 编码可将二进制数据转为纯文本(但 Secret 大小限于 1MB)

向 Secret 添加纯文本条目

  1. stringData: # 该字段只写,查看时不会显示,而是被编码后展示在data字段下
  2. foo: bar

3. 使用 Secret

将 Secret 卷暴露给容器后,条目的值会被自动解码并以真实形式写入对应文件或环境变量

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: test-secret
  5. spec:
  6. containers:
  7. - image: luksa/fortune:env
  8. name: html-generator
  9. env:
  10. - name: INTERVAL
  11. valueFrom:
  12. configMapKeyRef:
  13. name: fortune-config
  14. key: sleep-interval
  15. volumeMounts:
  16. - name: html
  17. mountPath: /var/htdocs
  18. - image: nginx:alpine
  19. name: web-server
  20. volumeMounts:
  21. - name: html
  22. mountPath: /usr/share/nginx/html
  23. readOnly: true
  24. - name: config
  25. mountPath: /etc/nginx/conf.d
  26. readOnly: true
  27. - name: certs
  28. mountPath: /etc/nginx/certs/
  29. readOnly: true
  30. ports:
  31. - containerPort: 80
  32. - containerPort: 443
  33. volumes:
  34. - name: html
  35. emptyDir: {}
  36. - name: config
  37. configMap:
  38. name: fortune-config
  39. items:
  40. - key: my-nginx-config.conf
  41. path: https.conf
  42. - name: certs
  43. secret:
  44. secretName: fortune-https

Secret 也支持通过 defaultModes 指定卷中文件的默认权限

  1. # Secret 卷采用内存文件系统列出容器的挂载点,不会写入磁盘
  2. $ kubectl exec test-secret -c web-server -- mount | grep certs
  3. tmpfs on /etc/nginx/certs type tmpfs (ro,relatime)

暴露 Secret 为环境变量

不推荐,该方式可能无意中暴露 Secret 信息

  1. env:
  2. - name: FOO_SECRET
  3. valueFrom:
  4. secretKeyRef:
  5. name: fortune-https
  6. key: foo

4. 镜像拉取 Secret

从私有镜像仓库拉取镜像时,K8s 需拥有拉取镜像所需的证书

①创建包含 Docker 镜像仓库证书的 Secret

  1. kubectl create secret docker-registry mydockerhubsecret --docker-username=myusername --docker-password=mypassword --docker-email=myemail

②Pod 中字段imagePullSecrets引用该 Secret

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: private-pod
  5. spec:
  6. imagePullSecrets:
  7. - name: mydockerhubsecret
  8. containers:
  9. - image: username/private:tag
  10. name: test

后续可添加 Secret 到 ServiceAccount 使所有 Pod 都能自动添加上该 Secret

原文链接:http://www.cnblogs.com/lb477/p/14889395.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号