在之前的资源清单中,其中需要遵循几个字段:apiversion(group/version),kind,metadata(name,namespace,labels,annotations,.....),spec,status。在上一篇的资源清单中有提到过在pod资源中,spec.containers中,必须要存在这几项
镜象和获取策略
- name: 容器名称
image: 镜像,镜像默认来自dockerhub,也可也是一个顶级仓库,也可也是私有仓库
imagePullPolicy 镜像获取的策略
Always 总是重试
Never 本地存在则用,没有也不会下载,需要手动下载镜像
IfNotPresent 如果本地存在就使用,如果不存在则下载
其中。如果镜像标签为latest则会默认使用Always。如果标签不是latest,则默认参数IfNotPresent。
注意:IfNotPresent一旦在清单中指定,则不能动态修改。
暴露端口
ports:
- name: http
containerPort: 80
- name: https
containerPort: 443
定义容器内要暴露的端口,可以定义暴露多个端口,而且每一个端口可以有多个属性来定义,端口号,协议,以及暴露的地址
但是,这里的暴露仅仅提供了额外的信息,并不是代表系统真正的会暴露出去。这与docker网络中的方式不一样
并且,无论是否手动指定了端口,只要pod中容器暴露的端口,就一定会暴露出来的,但是这种暴露与docke中的-p是不一样的,docker是绑定在节点的动态端口的方式,而pod仅限于跨节点之间的访问
name: 名称
containerPort: 暴露端口
加入有多个,可以多调用
并且,这里的配置在后续的调用中也可以使用
protocol 协议,如果没指定,默认tcp
args和command
args : 向entrypoint传递给程序的参数
如果指定了args子段,那么镜象中的cmd字段将不在传递,而是传递args定义的内容
如果引用了变量,$(VAR_NAME)这种方式进行变量引用
如果不想被替换,而是使用命令引用的方式,使用$$(VAR_NAME)来做逃逸
command : 要运行的程序
这里运行的command是不会运行在shlle中的,如果要运行在shell中,则需要指定,如下:
command:
- "/bin/sh"
- "-c"
- "tail -f /etc/passwd"
如果你什么都不提供,就直接运行镜象环境中的命令,也就是你不指定/bin/sh,直接使用tail,则使用镜象中的默认环境
* 这类似于Dockerfile中的CMD和ENTRYPOINT,如果只存在CMD,则运行CMD,如果既有ENTRYPOINT又有CMD,那么CMD中的代码作为参数传递给ENTRYPOINT
对应关系
在dockerfile中的 Entrypoint 对应 Kubernetes中的 command
在dockerfile中的 Cmd 对应 Kubernetes中的 args
* 如果没有定义command也没有定义rgs,则会运行Dockerfile中的ENTRYPOINT或者CMD命令,假如Dockerfile中有ENTRYPOINT或者CMD命令的话
* 如果定义了command没有定义args,那么只运行command。镜象中的ENTRYPOINT或者CMD命令都被忽略
* 如果定义了args没有定义command,那么只使用镜象中ENTRYPOINT当命令,将定义的参数传递给镜象中的ENTRYPOINT。随之,镜象中的CMD则失效
* 如果定义了command又定义args,那便使用定义的,镜象内的忽略
并且官网提供了一系列的图示参考官网,与和或关系图args和command都是列表格式,除了使用-定义,还可以使用{}括起来使用
command: {"/bin/sh","-c","tail -f /etc/passwd"}