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
一次性传递 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服务器所需的全部信息。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐