创建pod的配置文件
1 |
|
使用kubectl create -f nginx-demo.yaml
命令创建pod
使用kubectl get po nginx-demo -o wide
可以查看该pod的详细信息
1 |
|
k8s资源清单
参数名 | 类型 | 字段说明 |
---|---|---|
apiVersion | String | K8S APl 的版本,可以用 kubectl api versions 命令查询 |
kind | String | yam 文件定义的资源类型和角色 |
metadata | Object | 元数据对象,下面是它的属性 |
metadata.name | String | 元数据对象的名字,比如 pod 的名字 |
metadata.namespace | String | 元数据对象的命名空间 |
Spec | Object | 详细定义对象 |
spec.containers[] | list | 定义 Spec 对象的容器列表 |
spec.containers[].name | String | 为列表中的某个容器定义名称 |
spec.containers[].image | String | 为列表中的某个容器定义需要的镜像名称 |
spec.containers[].imagePullPolicy | string | 定义镜像拉取策略,有 Always、Never、IfNotPresent 三个值可选 - Always(默认):意思是每次都尝试重新拉取镜像 - Never:表示仅适用本地镜像 - IfNotPresent:如果本地有镜像就使用本地镜像,没有就拉取在线镜像。 |
spec.containers[].command[] | list | 指定容器启动命令,因为是数组可以指定多个,不指定则使用镜像打包时使用的启动命令。 |
spec.containers[].args[] | list | 指定容器启动命令参数,因为是数组可以指定多个。 |
spec.containers[].workingDir | string | 指定容器的工作目录 |
spec.containers[].volumeMounts[] | list | 指定容器内部的存储卷配置 |
spec.containers[].volumeMounts[].name | string | 指定可以被容器挂载的存储卷的名称 |
spec.containers[].volumeMounts[].mountPath | string | 指定可以被容器挂载的存储卷的路径 |
spec.containers[].volumeMounts[].readOnly | string | 设置存储卷路径的读写模式,ture 或者 false,默认是读写模式 |
spec.containers[].ports[] | list | 指定容器需要用到的端口列表 |
spec.containers[].ports[].name | string | 指定端口的名称 |
spec.containers[].ports[].containerPort | string | 指定容器需要监听的端口号 |
spec.containers[].ports[].hostPort | string | 指定容器所在主机需要监听的端口号,默认跟上面 containerPort 相同,注意设置了 hostPort 同一台主机无法启动该容器的相同副本(因为主机的端口号不能相同,这样会冲突) |
spec.containers[].ports[].protocol | string | 指定端口协议,支持 TCP 和 UDP,默认值为 TCP |
spec.containers[].env[] | list | 指定容器运行前需设置的环境变量列表 |
spec.containers[].env[].name | string | 指定环境变量名称 |
spec.containers[].env[].value | string | 指定环境变量值 |
spec.containers[].resources | Object | 指定资源限制和资源请求的值(这里开始就是设置容器的资源上限) |
spec.containers[].resources.limits | Object | 指定设置容器运行时资源的运行上限 |
spec.containers[].resources.limits.cpu | string | 指定 CPU 的限制,单位为 Core 数,将用于 docker run –cpu-shares 参数 |
spec.containers[].resources.limits.memory | string | 指定 mem 内存的限制,单位为 MIB、GiB |
spec.containers[].resources.requests | Object | 指定容器启动和调度时的限制设置 |
spec.containers[].resources.requests.cpu | string | CPU请求,单位为core数,容器启动时初始化可用数量 |
spec.containers[].resources.requests.memory | string | 内存请求,单位为MIB、GiB,容器启动的初始化可用数量 |
spec.restartPolicy | string | 定义 pod 的重启策略,可选值为 Always、OnFailure、Never,默认值为 Always。 - Always:pod 一旦终止运行,则无论容器是如何终止的,kubelet 服务都将重启它。 - OnFailure:只有 pod 以非零退出码终止时,kubelet 才会重启该容器。如果容器正常结束(退出码为0),则 kubectl 将不会重启它。 - Never:Pod 终止后,kubelet 将退出码报告给 master,不会重启该 pod |
spec.nodeSelector | Object | 定义 Node 的 label 过滤标签,以 key:value 格式指定 |
spec.imagePullSecrets | Object | 定义 pull 镜像时使用 secret 名称,以 name:secretkey 格式指定 |
spec.hostNetwork | Boolean | 定义是否使用主机网络模式,默认值为 false。设置 true 表示使用宿主机网络,不使用 docker 网桥,同时设置了 true将无法在同一台宿主机上启动第二个副本 |
探针
探针类型
StartupProbe
用于判断应用程序是否已经启动了。
当配置了 startupProbe 后,会先禁用其他探针,直到 startupProbe 成功后,其他探针才会继续。
LivenessProbe
用于探测容器中的应用是否运行,如果探测失败,kubelet 会根据配置的重启策略进行重启,若没有配置,默认就认为容器启动成功,不会执行重启策略。
ReadinessProbe
用于探测容器内的程序是否健康,它的返回值如果返回 success,那么就认为该容器已经完全启动,并且该容器是可以接收外部流量的。
探测方式
ExecAction
在容器内部执行一个命令,如果返回值为 0,则任务容器时健康的。
TCPSocketAction
通过 tcp 连接监测容器内端口是否开放,如果开放则证明该容器健康
HTTPGetAction
生产环境用的较多的方式,发送 HTTP 请求到容器内的应用程序,如果接口返回的状态码在 200~400 之间,则认为容器健康。
一些参数
参数示例 | 作用 |
---|---|
initialDelaySeconds:10 | 初始化时间 |
timeoutSeconds: 2 | 超时时间 |
periodSeconds: 5 | 监测间隔时间 |
successThreshold: 1 | 检查 1 次成功就表示成功 |
failureThreshold: 2 | 监测失败 2 次就表示失败 |
实例
startupProbe
1 |
|
运行后使用kubectl describe po nginx-po
查看运行情况
刚刚设置的startupProbe:
因为没有/api/startup
接口所以探针探测失败
将探测接口改为index.html
1 |
|
启动成功
使用TCPSocketAction
探测方式
1 |
|
探测成功
使用EecAction
方式探测
1 |
|
探测成功
livenessProbe
1 |
|
hh.html并不存在,所以第一次探测一定会失败,此时使用kubectl cp hh.html nginx-po:/usr/share/nginx/html
为nginx传入hh.html。重启后,再次探测发现hh.html存在,最后启动成功
readinessProbe
1 |
|
和livenessProbe结果差不多,没有hh.html之前外部不能访问,复制之后可以访问。
pod生命周期
ps:
- postStartStart一般不用,因为他和command的执行顺序并不确定。可以使用初始化阶段的替代,这样一定在command之前执行。
- preStopStop是在容器退出之前执行的函数,可以做注册中心下线、数据清理、数据保存等。ex:关掉word时弹窗提示是否保存
example:
1 |
|
创建完成后查看test.html的内容
1 |
|
使用time命令测试删除该容器的用时
1 |
|
在配置文件中使用preStop让pod在停止前sleep 50秒,但是删除时只用了30秒,这是因为terminationGracePeriodSeconds
参数表示停止前的停留时间,默认为30秒。