【K8S in Action】第七章 ConfigMap和Secret配置应用程序

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 
whiledo 
	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 
whiledo 
	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

5 使用 Secret给容器传递敏感数据

Secret 结构与 ConfigMap类似, 均是键/值对的映射。 Secret 的使用方法也与
ConfigMap 相同, 可以
• 将 Secret 条目作为环境变量传递给容器
• 将 Secret 条目暴露为卷中的文件

你可能感兴趣的:(kubernetes,容器,云原生)