【K8S in Action】第七章 ConfigMap和Secret配置应用程序
Kubemetes 将配置选项分离到单独的资源对象 ConfigMap 中, 本质上就是键值对映射,值可以是短字面量,也可以是完整的配置文件。了解shell与exec形式的区别,上述两条指令均支持以下两种形式,两者的区别在于指定的命令是否是在shell中被调用。ConfigMap 创建自多种选项:完整文件夹、单独文件、自定义键名的条目下的文件(替代文件名作键名) 及字面量。Secret 结构与 C
1 配置容器化应用程序
容器化应用通常是如何被配置:
- 以命令行参数的形式配置应用。 随着配置选项数量的逐渐增多, 将配置文件化。
- 借助环境变量,常见方法。Docker 容器中采用配置文件的方式有困难,配置文件打入容器镜像, 抑或是挂载包含该文件的卷。
2 向容器传递命令行参数
容器中运行的完整指令由两部分组成:命令与参数。了解ENTRYPOINT与CMD。
- ENTRYPOINT定义容器启动时被调用的可执行程序
- CMD指定传递给ENTRYPOINT的参数。
这样, 镜像可以直接运行, 无须添加任何参数
docker run <image>
是添加一些参数, 覆盖Dockerile中任何由CMD指定的默认参数值
docker run <image> <arguments>
了解shell与exec形式的区别,上述两条指令均支持以下两种形式,两者的区别在于指定的命令是否是在shell中被调用。:
- shell形式 如ENTRYPOINT node app.js。
- exec形式 如ENTRYPOINT [“node”, “app. js”]
docker exec -it e4bad ps x
PID TTY STAT TIME COMMAND
1 ? Ss 0:00 /bin/sh -c node app. J s
7 ? Sl 0:00 node app.js
13 ? Rs+ 0:00 ps x
可以看出,主进程(Pid 1)是shell进程而非node进程,node进程(PID 7)在shell中启动。 shell进程往往是多余的,
在fortune脚本中添加VARIABLE变量并用第一个命令行参数对其初始化。
#!/bin/bash
trap "exit" SIGINT
INTERVAL=$1
echo Configured to generate new fortune every $INTERVAL seconds
mkdir -p /var/htdocs
while :
do
echo $(date) Writing fortune to /var/htdocs/index.html
/usr/games/fortune > /var/htdocs/index.html
sleep $INTERVAL
done
修改fortune镜像的Dockerfile
FROM ubuntu:latest
RUN apt-get update ; apt-get -yinstall fortune
ADD fortuneloop.sh /bin/fortuneloop.sh
ENTRYPOINT ["/bin/fortuneloop.sh"] exec 形式的ENTRYPOINT
CMD ["10"] 可执行程序的默认参数
在 Kubernetes 中覆盖命令和参数。
kind: Pod
spec:
containers:
- image: some/image
command: ["/bin/ command"] 命令一般很少被覆盖
args: ["argl", "arg2", "arg3"]
少量参数值的设置可以使用上述的数组表示。多参数值情况下可以采用如下标
记。字符串值无须用引号标记,数值需要。
args:
- foo
- bar
- "15"
3 为容器设置环境变量
为pod中的每一个容器都指定自定义的环境变量集合。
#!/bin/bash
trap "exit" SIGINT
移除脚本中工NTERVAL初始化所在的行即可
# INTERVAL=$1
echo Configured to generate new fortune every $INTERVAL seconds
mkdir -p /var/htdocs
while :
do
echo $(date) Writing fortune to /var/htdocs/index.html
/usr/games/fortune > /var/htdocs/index.html
sleep $INTERVAL
done
在pod中指定环境变量,环境变量被设置在pod的容器定义中,并非是pod级别。
kind: Pod
spec:
containers:
- image: luksa/fortune:env
env:
- name: INTERVAL
value: "30"
name: html-generator
在环境变量值中引用另二个变量,SECOND_VAR 的值是 foobar
env:
- name : FIRST_VAR
value: "foo"
- name : SECOND_VAR
value :”$(FIRST_VAR)bar”
4 利用 ConfigMap解耦相配置
Kubemetes 将配置选项分离到单独的资源对象 ConfigMap 中, 本质上就是键值对映射,值可以是短字面量,也可以是完整的配置文件。
创建了叫作 fortune-config的ConfigMap ,仅包含单映射条目 sleep interval=25
kubectl create configmap fortune-config --from-literal=sleep-interval=25
kubectl get configmap fortune-config -o yaml
apiVersion: vl
data :
sleeo-interval :”25 ” 描述符定义了一个ConfigMap
kind :ConfigMap
metadata
creationTimestamp: 2016 08-11T20 : 31:08Z
name: fortune-config 通过这个名称引用 ConfigMap
namespace: default
resourceVersion : ” 910025 ”
selfLink: /api/vl/namespaces/default/configmaps/fortune-config
uid: 88c4167e-6002-lle6-a50d-42010af00237
然后通k8s API 创建对应的ConfigMap
kubectl create - f fo tune config.yaml
ConfigMap 创建自多种选项:完整文件夹、单独文件、自定义键名的条目下的文件(替代文件名作键名) 及字面量。
给容器传递 ConfigMap 条目作为环境变量
apiVersion : vl
kind: Pod
metadata:
name: fortune-env-from-configrmap
spec:
containers:
- image : luksa/fortune:env
env:
- name : INTERVAL
valueFrom :
configMapKeyRef: ConfigMap初始化,不设定固定值
name:fortune-config 引用configMap 的名称
key: sleep-interval
一次性传递 ConfigMap 的所有条目作为环境变量
如果 ConfigMap 包含不少条日,为每个条目单独设置环境变 的过程是单调乏味且容易出错的。假设 名为 my-config-map包含 FOO、BAR、FOO-BAR 三个键。可以通过 envFrom属性字段将所有条目暴露作为环境变量。
spec:
containers:
- image : some-iamge
envFrom:
- prefix: CONFIG_ 所有环境变量包含前缀CONFIG_
configMapRef: 前缀设置是可选的,若不设直前缀佳,环境变量的名称与 ConfigMap 的键名相同
name:my-config-map 引用名为 my-config-map的ConfigMap
容器中有两个环境变的名称为: CONFIG_FOO CONFIG_BAR.原因在于 CONFIG_FOO-BAR 包含破折号,这并不是一个合法的环境变量名称。忽略时不会发出事件通知)
传递 ConfigMap 条目作为命令行参数
如何将 ConfigMap 中的值作为 数值传递给运行在容器中的主进程。在宇段 pod spec.containers.args 中无法直接引用ConfigMap。ConfigMap 条目初始化某个环境变 ,然后再在参数字段中引用该环境变量。
apiVersion : vl
kind: Pod
metadata:
name: fortune-args-from-configrmap
spec:
containers:
- image : luksa/fortune:args
env:
- name : INTERVAL
valueFrom :
configMapKeyRef: ConfigMap初始化,不设定固定值
name:fortune-config 引用configMap 的名称
key: sleep-interval
args: ["$ (INTERVAL ) "] 在参数设置中 引用环境变量
使用 configMap 卷将条目暴露为文件
ConfigMap 卷会将 ConfigMap 中的每个条目均暴露成 个文件 运行在容器中的进程可通过读取文件内容获得对应的条目值
5 使用 Secret给容器传递敏感数据
Secret 结构与 ConfigMap类似, 均是键/值对的映射。 Secret 的使用方法也与ConfigMap 相同, 可以
• 将 Secret 条目作为环境变量传递给容器
• 将 Secret 条目暴露为卷中的文件
首先来分析 一种默认被挂载至所有容器的 Secret, 对任意一 个 pod使用命令kubectl describe pod, 输出往往包含如下信息
Volumes:
defaul-token-cfee9:
Type: Secret(a volume populated by a Secret)
SecretName: default-token-cfee9
查看secrets
kubectl get secrets
kubectl describe secrets
可以看出这个Secret包含三个条目:ca.crt 、 namespace与token, 包含了从pod内部安全访问KubemetesAPI服务器所需的全部信息。
更多推荐
所有评论(0)