参考文章
K8s创建pod yaml文件详解 - 大川哥 - 博客园 (cnblogs.com)
上一节中,介绍了 pod 的特性,以及创建一个简单的 pod 流程。这一节中,重点介绍一些 pod 中的各个属性的含义。
基础
进阶
从网上随便找了一个 pod 的 yaml 描述文件:
apiVersion: v1 #指定api版本,此值必须在kubectl apiversion中
kind: Pod #指定创建资源的角色/类型
metadata: #资源的元数据/属性
name: web04-pod #资源的名字,在同一个namespace中必须唯一
labels: #设定资源的标签,详情请见http://blog.csdn.net/liyingke112/article/details/77482384
k8s-app: apache
version: v1
kubernetes.io/cluster-service: "true"
annotations: #自定义注解列表
- name: String #自定义注解名字
spec:#specification of the resource content 指定该资源的内容
restartPolicy: Always #表明该容器一直运行,默认k8s的策略,在此容器退出后,会立即创建一个相同的容器
nodeSelector: #节点选择,先给主机打标签kubectl label nodes kube-node1 zone=node1
zone: node1
containers:
- name: web04-pod #容器的名字
image: web:apache #容器使用的镜像地址
imagePullPolicy: Never #三个选择Always、Never、IfNotPresent,每次启动时检查和更新(从registery)images的策略,
# Always,每次都检查
# Never,每次都不检查(不管本地是否有)
# IfNotPresent,如果本地有就不检查,如果没有就拉取
command: ['sh'] #启动容器的运行命令,将覆盖容器中的Entrypoint,对应Dockefile中的ENTRYPOINT
args: ["$(str)"] #启动容器的命令参数,对应Dockerfile中CMD参数
env: #指定容器中的环境变量
- name: str #变量的名字
value: "/etc/run.sh" #变量的值
resources: #资源管理,请求请见http://blog.csdn.net/liyingke112/article/details/77452630
requests: #容器运行时,最低资源需求,也就是说最少需要多少资源容器才能正常运行
cpu: 0.1 #CPU资源(核数),两种方式,浮点数或者是整数+m,0.1=100m,最少值为0.001核(1m)
memory: 32Mi #内存使用量
limits: #资源限制
cpu: 0.5
memory: 32Mi
ports:
- containerPort: 80 #容器开发对外的端口
name: httpd #名称
protocol: TCP
livenessProbe: #pod内容器健康检查的设置,详情请见http://blog.csdn.net/liyingke112/article/details/77531584
httpGet: #通过httpget检查健康,返回200-399之间,则认为容器正常
path: / #URI地址
port: 80
#host: 127.0.0.1 #主机地址
scheme: HTTP
initialDelaySeconds: 180 #表明第一次检测在容器启动后多长时间后开始
timeoutSeconds: 5 #检测的超时时间
periodSeconds: 15 #检查间隔时间
#也可以用这种方法
#exec: 执行命令的方法进行监测,如果其退出码不为0,则认为容器正常
# command:
# - cat
# - /tmp/health
#也可以用这种方法
#tcpSocket: //通过tcpSocket检查健康
# port: number
lifecycle: #生命周期管理
postStart: #容器运行之前运行的任务
exec:
command:
- 'sh'
- 'yum upgrade -y'
preStop:#容器关闭之前运行的任务
exec:
command: ['service httpd stop']
volumeMounts: #详情请见http://blog.csdn.net/liyingke112/article/details/76577520
- name: volume #挂载设备的名字,与volumes[*].name 需要对应
mountPath: /data #挂载到容器的某个路径下
readOnly: True
volumes: #定义一组挂载设备
- name: volume #定义一个挂载设备的名字
#meptyDir: {}
hostPath:
path: /opt #挂载设备类型为hostPath,路径为宿主机下的/opt,这里设备类型支持很多种
上面描述文件中对于各个属性的含义介绍也比较清楚了。不过,我也还要从我的角度再解释一些,以下均是我踩过的坑,以及对学习过程中不理解的地方的一些解释。
apiVersion、kind、metadata.name 这几个属性在上一节已经介绍过了,就不再过多阐述了。
Label
metadata,之前也说过,这个属性它只是用来标识 API 对象的,并不影响 pod 的正常运行。
但是也要简要了解一些它的含义和使用场景。
matedata.label 是一对 KV 键值对,对 k8s 本身而言没有直接意义的。但是用户可以通过 Label 来查询或者组织自己的服务。(之后 selector 标签选择器的时候,会用到用户自定义的 Label)
每个对象可以拥有多个 Label,但 key 值必须是唯一的。 且 key 最多63个字符,开始和结束的字符必须是字母或者数字,中间是字母数字和 _ 、- 、. 。
value 值长度不超过 63 个字符,可以为空,首位字符必须为字母数字字符,中间必须是横线、_、.、数字、字母。
标签除了在 yaml 描述文件中可以预定义以外,在 pod 运行过程中也可以为其添加 Label,具体的命令如下:
// 为 pod 添加 Label
kubectl label pod <pod-name> <label-key>=<label-value>
// 为 pod 删除 Label
kubectl label pod <pod-name> <label-key>-
// 修改 pod 的 Label,需要加上 --overwrite 参数
kubectl label pod <pod-name> <label-key>=<label-value> --overwrite
Annotation
metadata.annotation 注解的意思,和 Label 的性质有点类似,都是用来标识 API 对象的。Label 是可以通过 selector 这个标签选择器来查筛选的;Annotation 则是方便于外部工具进行查找。
例如就可以使用注解来控制是否自动向该 pod 中注入 sidecar (sidecar 辅助容器,之后也会介绍到)。
spec
再接下来就是 spec 中的内容了,很多很杂也很有意思,第一次的话,大概了解一下就可,之后有用到的时候在仔细研究用法。
spec 中重点有四块内容,restartPolicy、nodeselector、container、volume
restartPolicy 是当 pod 在遇到故障之后的重启策略,有如下策略:
- always:当容器退出时,总是重启容器,默认策略
- onfailure:当容器异常退出(退出 status 非0)时,重启容器
- nerver:当容器退出时,从不重启容器
restartPolicy 默认情况下是不填的,使用默认策略就行。只有某些特殊情况下才会去修改策略,例如测试的时候,需要知道 crash 的原因,等等。
nodeSelector 是节点选择器,在上面说过可以为 pod 添加 Label,其中不仅 pod 可以添加 Label,节点 node 也可以添加 Label,添加的命令非常类似。
nodeSelector 是通过节点(node)的 Label,来指定当前的 pod 在哪个 node 上运行。 如果不指定,k8s 调度器会随机的将该 pod 在任意的一个 node 上运行。例如,上面的那个 pod 的描述文件,指定了该 pod 只能运行在带了 "zone: node1" 标签的节点上;如果节点的 Label 上都没带这个 zone: node1" 标签,该 pod 将调度失败。
调度 pod:就是选择一个节点来运行这个 pod;
调度失败的意思就是,这个 pod 很“挑食”,看不上这些节点,不想在这些节点上运行,最终的结果:该 pod 运行不起来。
container 是必须要填写的,也是很重要的,且很杂的,下一篇重点介绍一下吧。
container 中的核心就两个,pod 中容器的名字(name),和容器的镜像地址(image)
有了这两个属性,pod 就可以启动了。
还有一个是 Volume 卷,卷的种类有很多,之后也会介绍到,现在介绍这个,就只是简单的提一些,pod 中就是 通过 Volume 来将本地磁盘或其他地方的磁盘挂载到 pod 中的。
spec 中还有一些其他有意思的属性,例如 HostAliases
HostAliases:定义了 Pod 中 hosts (/etc/hosts)文件内容,用法如下:
apiVersion: v1
kind: Pod
...
spec:
hostAliases:
- ip: "10.111.133.43"
hostnames:
- "asa.top"
- "asa.com"
...
在 k8s 项目中,如果要设置 hosts 文件里的内容,一定要通过这种方法。否则,如果直接修改了 hosts 文件的话,在 pod 被删除重建之后,kubelet 会自动覆盖掉被修改的内容。