-
Notifications
You must be signed in to change notification settings - Fork 3
/
Pod的定义模板(详解)
211 lines (178 loc) · 11.9 KB
/
Pod的定义模板(详解)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
apiVersion: v1 #必选,版本号,例如v1,版本号必须可以用 kubectl api-versions 查询到 .
kind: Pod #必选,Pod
metadata: #必选,元数据
name: string #必选,Pod名称
namespace: string #必选,Pod所属的命名空间,默认为"default"
labels: #自定义标签
- name: string #自定义标签名字
annotations: #自定义注释列表
- name: string
spec: #必选,Pod中容器的详细定义
containers: #必选,Pod中容器列表
- name: string #必选,容器名称,需符合RFC 1035规范
image: string #必选,容器的镜像名称
imagePullPolicy: [ Always|Never|IfNotPresent ] #获取镜像的策略 Alawys表示下载镜像 IfnotPresent表示优先使用本地镜像,否则下载镜像,Nerver表示仅使用本地镜像
command: [string] #容器的启动命令列表,如不指定,使用打包时使用的启动命令
args: [string] #容器的启动命令参数列表
workingDir: string #容器的工作目录
volumeMounts: #挂载到容器内部的存储卷配置
- name: string #引用pod定义的共享存储卷的名称,需用volumes[]部分定义的的卷名
mountPath: string #存储卷在容器内mount的绝对路径,应少于512字符
readOnly: boolean #是否为只读模式
ports: #需要暴露的端口库号列表
- name: string #端口的名称
containerPort: int #容器需要监听的端口号
hostPort: int #容器所在主机需要监听的端口号,默认与Container相同
protocol: string #端口协议,支持TCP和UDP,默认TCP
env: #容器运行前需设置的环境变量列表
- name: string #环境变量名称
value: string #环境变量的值
resources: #资源限制和请求的设置
limits: #资源限制的设置
cpu: string #Cpu的限制,单位为core数,将用于docker run --cpu-shares参数
memory: string #内存限制,单位可以为Mib/Gib,将用于docker run --memory参数
requests: #资源请求的设置
cpu: string #Cpu请求,容器启动的初始可用数量
memory: string #内存请求,容器启动的初始可用数量
livenessProbe: #对Pod内各容器健康检查的设置,当探测无响应几次后将自动重启该容器,检查方法有exec、httpGet和tcpSocket,对一个容器只需设置其中一种方法即可
exec: #对Pod容器内检查方式设置为exec方式
command: [string] #exec方式需要制定的命令或脚本
httpGet: #对Pod内个容器健康检查方法设置为HttpGet,需要制定Path、port
path: string
port: number
host: string
scheme: string
HttpHeaders:
- name: string
value: string
tcpSocket: #对Pod内个容器健康检查方式设置为tcpSocket方式
port: number
initialDelaySeconds: 0 #容器启动完成后首次探测的时间,单位为秒
timeoutSeconds: 0 #对容器健康检查探测等待响应的超时时间,单位秒,默认1秒
periodSeconds: 0 #对容器监控检查的定期探测时间设置,单位秒,默认10秒一次
successThreshold: 0
failureThreshold: 0
securityContext:
privileged: false
restartPolicy: [Always | Never | OnFailure] #Pod的重启策略,Always表示一旦不管以何种方式终止运行,kubelet都将重启,OnFailure表示只有Pod以非0退出码退出才重启,Nerver表示不再重启该Pod
nodeSelector: obeject #设置NodeSelector表示将该Pod调度到包含这个label的node上,以key:value的格式指定
imagePullSecrets: #Pull镜像时使用的secret名称,以key:secretkey格式指定
- name: string
hostNetwork: false #是否使用主机网络模式,默认为false,如果设置为true,表示使用宿主机网络
volumes: #在该pod上定义共享存储卷列表
- name: string #共享存储卷名称 (volumes类型有很多种)
emptyDir: {} #类型为emtyDir的存储卷,与Pod同生命周期的一个临时目录。为空值
hostPath: string #类型为hostPath的存储卷,表示挂载Pod所在宿主机的目录
path: string #Pod所在宿主机的目录,将被用于同期中mount的目录
secret: #类型为secret的存储卷,挂载集群与定义的secre对象到容器内部
scretname: string
items:
- key: string
path: string
configMap: #类型为configMap的存储卷,挂载预定义的configMap对象到容器内部
name: string
items:
- key: string
path: string
在使用docker run命令运行容器时,如果未指定容器的启动命令,则使用Docker镜像内默认的启动命令启动(一般是通过Dockerfile中的ENTRYPOINT和CMD进行设置的)。
另外,CMD命令是可覆盖的,docker run指定的启动命令会把镜像内CMD设置的命令覆盖。而ENTRYPOINT设置的命令只是一个入口,docker run指定的启动命令作为参数传递给ENTRYPOINT设置的命令,而不是进行替换。
在Pod的定义中,command和args都是可选项,将与Docker镜像的ENTRYPOINT和CMD相互作用,生成容器的最终启动命令。
具体规则如下:
·如果容器没有指定command和args,则使用镜像的ENTRYPOINT和CMD作为启动命令运行。
·如果容器指定command,而未指定args,则忽略镜像中的ENTRYPOINY和CMD,使用指定的command作为启动命令运行。
·如果容器没有指定command,只是指定args,则使用镜像的ENTRYPOINT和CMD作为启动命令运行。
·如果容器指定了command和args,则使用指定的command和args作为启动命令运行。
2.环境变量:spec-->containers-->env-->name/value
一般情况下,可以在Pod定义中通过env的name/value来设置容器运行时的环境变量。
而在一些特殊场景下,Pod中的容器想知道自身的一些信息,如Pod名称、Pod本身的IP地址等,这些信息可以通过Downward API获得,也可以通过环境变量得知容器目前所支持的信息。
比如,Pod的名称可通过metadata.name获得;Pod的IP地址可通过status.podIP获得,详见下面示例:
apiVersion: v1
kind: Pod
metadata:
name: testpod
spec:
RestartPolicy: Never
containers:
- name: test
image: "ubuntu:14.04"
Command: ["/bin/echo","test","pod"]
env:
- name: ENV_NAME
Value: "test"
- name: MY_POD_NAME
ValueForm:
fieldRef:
fieldPath: metadata.name
- name: MY_POD_IP
ValueForm:
fieldRef:
fieldPath: status.popIP
3.端口映射:spec-->containers-->ports-->containerPort/protocol/hostIP/hostPort
在使用docker run运行容器时,往往通过--publish/p参数设置端口映射规则,也可以在Pod定义文件中设置容器的端口映射规则。
比如,下面示例中Pod设置容器nginx的端口映射规则为0.0.0.0:80->80/TCP:
apiVersion: v1
kind: Pod
metadata:
name: nginxtest
spec:
containers:
- name: nginx
Image: nginx
Ports:
-name: web
containerPort: 80
Protocol: TCP
hostIP: 0.0.0.0
hostPort: 80
使用hostPort时需要注意端口冲突的问题,不过Kubernetes在调度Pod的时候会检查宿主机端口是否冲突,比如当两个Pod均要求绑定宿主机的80端口,Kubernetes会将这两个Pod分别调度到不同的机器上。
在Host网络中的一些特殊场景下,容器必须要以host方式进行网络设置(如接收物理机网络才能够接收到的组播流),在Pod中也支持host网络的设置,如:spec-->hostNetwork=true。
4.数据持久化:spec-->containers-->volumeMounts-->mountPath
要注意的一点是,容器是临时存在的,如果容器被销毁,容器中的数据将会丢失。
为了能够持久化数据以及共享容器间的数据,Docker提出了数据卷(Volume)的概念。
简单地说,数据卷就是目录或者文件,它可以绕过默认的联合文件系统,而以正常的文件或者目录的形式存在于宿主机上。
在使用docker run运行容器的时候,经常使用参数--volume/-v创建数据卷,即将宿主机上的目录或者文件挂载到容器中,这样,即使容器被销毁,数据卷中的数据仍然保存在宿主机上。
Kubernetes对Docker数据卷进行了扩展,支持对接第三方存储系统。
另一方面,由于Kubernetes的数据卷是Pod级别的,所以Pod中的容器可以访问共同的数据卷,实现容器间的数据共享。下面通过实例来介绍Pod中数据卷的创建,代码如下:
apiVersion: v1
kind: Pod
metadata:
name: testpod
spec:
containers:
- name: test1
image: "ubuntu:14.04"
volumeMounts:
- name:data
mountPath:/data
- name: test2
image: "ubuntu:14.04"
volumeMounts:
- name:data
mountPath:/data
Volumes:
- name:data
hostPath:
Path:/tmp
由以下例子可以看到,在Pod定义文件中,.Pod.volumes配置了一个名称为data的数据卷,数据卷的类型是hostpath,使用宿主机的目录/tmp。
Pod中的两个容器都通过.spec.containers[].volumesMounts来设置挂载数据卷到容器中的路径/data。
5.重启策略重启策略即当Pod中的容器终止退出后,重启容器的策略。
这里所谓Pod的重启,实际上是容器的重建,因为Pod容器退出后,之前容器中的数据将会丢失,如果需要持久化数据,那么需要使用数据卷进行持久化设置。
Pod支持三种重启策略:Always(默认策略,当容器终止退出后总是重启容器)、OnFailure(当容器终止且异常退出时重启)、Never(从不重启)。
在一些场景下,希望Pod调度到指定的Node上,比如,调度到专门用于测试的Node,如何实现呢?
可以为Node定义特殊标签,并且在定义Pod时指明选择含有该标签的Node来创建。如:
# Kubectl label nodes node1 env=test
定义Pod的时,通过设置Node Selector来选择Node:
apiVersion: v1
kind: Pod
metadata:
name: testpod
labels:
-env: test
spec:
containers:
-name: nginx
image: nginx
imagepullpolicy: Ifnotpresent
nodeSelector:
Nodename: node1
Pod创建成功后将会被分配到带有test标签的Node1节点上。除了设置Node Selector之外,Pod还可以通过Node Name直接指定Node,但还是建议使用Node Selector。因为通过Label进行选择是一种弱绑定,而直接指定Node Name是强绑定,Node失效时会导致Pod无法调度。