html
Pod
中封装着应用的容器(有的状况下是好几个容器),存储、独立的网络IP
,管理容器如何运行的策略选项。Pod
表明着部署的一个单位:kubernetes
中应用的一个实例,可能由一个或者多个容器组合在一块儿共享资源。node
Docker
是kubernetes
中最经常使用的容器运行时,可是Pod
也支持其余容器运行时。nginx在
Kubernetes
集群中Pod
有以下两种方式:web
一个Pod中运行一个容器。“每一个
Pod
中一个容器”的模式是最多见的用法;在这种使用方式中,你能够把Pod
想象成单个容器的封装,Kubernetes
管理的是Pod
而不是直接管理容器。vim在一个Pod中同时运行多个容器。一个
Pod
也能够同时封装几个须要紧密耦合互相协做的容器,它们之间共享资源。这些在同一个Pod
中的容器能够互相协做成为一个service
单位——一个容器共享文件,另外一个“sidecar”
容器来更新这些文件。Pod
将这些容器的存储资源做为一个实体来管理。api
Pod
中共享的环境包括Linux
的namespace
、cgroup
和其余可能的隔绝环境,这一点跟Docker
容器一致。在Pod
的环境中,每一个容器可能还有更小的子隔离环境。服务器
Pod
中的容器共享IP
地址和端口号,它们之间能够经过localhost
互相发现。它们之间能够经过进程间通讯,例如SystemV
信号或者POSIX
共享内存。不一样Pod
之间的容器具备不一样的IP
地址,不能直接经过IPC
通讯。网络
Pod
中的容器也有访问共享volume
的权限,这些volume
会被定义成pod
的一部分并挂载到应用容器的文件系统中。tcp就像每一个应用容器,
pod
被认为是临时(非持久的)实体。在Pod
的生命周期中讨论过,pod
被建立后,被分配一个惟一的ID(UID)
,调度到节点上,并一致维持指望的状态直到被终结(根据重启策略)或者被删除。若是node
死掉了,分配到了这个node
上的pod
,在通过一个超时时间后会被从新调度到其余node
节点上。一个给定的pod
(如UID
定义的)不会被“从新调度”到新的节点上,而是被一个一样的pod
取代,若是指望的话甚至能够是相同的名字,可是会有一个新的UID
。ide
注意在一个
Pod
中同时运行多个容器是一种比较高级的用法。只有当你的容器须要紧密配合协做的时候才考虑用这种模式。例如,你有一个容器做为web
服务器运行,须要用到共享的volume
,有另外一个“sidecar”
容器来从远端获取资源更新这些文件,以下图所示:
网络:每一个
pod
都会被分配一个惟一的IP
地址。Pod
中的全部容器共享网络空间,包括IP
地址和端口。Pod
内部的容器可使用localhost
互相通讯。Pod
中的容器与外界通讯时,必须分配共享网络资源(例如使用宿主机的端口映射)。存储:能够为一个
Pod
指定多个共享的Volume
。Pod
中的全部容器均可以访问共享的volume
。Volume
也能够用来持久化Pod
中的存储资源,以防容器重启后文件丢失。
注意:重启
Pod
中的容器跟重启Pod
不是一回事。Pod
只提供容器的运行环境并保持容器的运行状态,重启容器不会形成Pod
重启。
Pod
不会自愈。若是Pod
运行的Node
故障,或者是调度器自己故障,这个Pod
就会被删除。一样的,若是Pod
所在Node
缺乏资源或者Pod
处于维护状态,Pod
也会被驱逐。Kubernetes
使用更高级的称为Controller
的抽象层,来管理Pod
实例。虽然能够直接使用Pod
,可是在Kubernetes
中一般是使用Controller
来管理Pod
的。
Controller
能够建立和管理多个Pod
,提供副本管理、滚动升级和集群级别的自愈能力。例如,若是一个Node
故障,Controller
就能自动将该节点上的Pod
调度到其余健康的Node
上。
不管是手动建立仍是经过
Deployment
等控制器建立,Pod
对象老是应该处于其生命进程中如下几个相位(phase
)之一。
挂起(
Pending
):API Server
建立了pod
资源对象已存入etcd
中,但它还没有被调度完成,或者仍处于从仓库下载镜像的过程当中。运行中(
Running
):Pod
已经被调度至某节点,而且全部容器都已经被kubelet
建立完成。成功(
Succeeded
):Pod
中的全部容器都已经成功终止而且不会被重启失败(
Failed
):Pod
中的全部容器都已终止了,而且至少有一个容器是由于失败终止。即容器以非0
状态退出或者被系统禁止。未知(
Unknown
):Api Server
没法正常获取到Pod
对象的状态信息,一般是因为没法与所在工做节点的kubelet
通讯所致。
API Server
尝试着将Pod
对象的相关信息存入etcd
中,待写入操做执行完成,API Server
即会返回确认信息至客户端。
API Server
开始反映etcd
中的状态变化。全部的
kubernetes
组件均使用“watch”
机制来跟踪检查API Server
上的相关的变更。
kube-scheduler
(调度器)经过其“watcher”
觉察到API Server
建立了新的Pod
对象但还没有绑定至任何工做节点。
kube-scheduler
为Pod
对象挑选一个工做节点并将结果信息更新至API Server
。调度结果信息由
API Server
更新至etcd
存储系统,并且API Server
也开始反映此Pod
对象的调度结果。
Pod
被调度到的目标工做节点上的kubelet
尝试在当前节点上调用Docker
启动容器,并将容器的结果状态返回送至API Server
。
API Server
将Pod
状态信息存入etcd
系统中。在
etcd
确认写入操做成功完成后,API Server
将确认信息发送至相关的kubelet
,事件将经过它被接受。
1)初始化容器必须运行完成直至结束,若某初始化容器运行失败,那么
kubernetes
须要重启它直到成功完成。(注意:若是pod
的spec.restartPolicy
字段值为“Never
”,那么运行失败的初始化容器不会被重启。)2)每一个初始化容器都必须按定义的顺序串行运行。
容器探测(
container probe
)是Pod
对象生命周期中的一项重要的平常任务,它是kubelet
对容器周期性执行的健康状态诊断,诊断操做由容器的处理器(handler
)进行定义。Kubernetes
支持三种处理器用于Pod
探测:
ExecAction
:在容器内执行指定命令,并根据其返回的状态码进行诊断的操做称为Exec
探测,状态码为0
表示成功,不然即为不健康状态。
TCPSocketAction
:经过与容器的某TCP
端口尝试创建链接进行诊断,端口可以成功打开即为正常,不然为不健康状态。
HTTPGetAction
:经过向容器IP
地址的某指定端口的指定path
发起HTTP GET
请求进行诊断,响应码为2xx
或3xx
时即为成功,不然为失败。任何一种探测方式均可能存在三种结果:
“Success”(成功)
、“Failure”(失败)
、“Unknown”(未知)
,只有success
表示成功经过检测。
容器探测分为两种类型:
存活性探测(livenessProbe):用于断定容器是否处于“运行”(
Running
)状态;一旦此类检测未经过,kubelet
将杀死容器并根据重启策略(restartPolicy
)决定是否将其重启;未定义存活检测的容器的默认状态为“Success
”。就绪性探测(readinessProbe):用于判断容器是否准备就绪并可对外提供服务;未经过检测的容器意味着其还没有准备就绪,端点控制器(如
Service
对象)会将其IP
从全部匹配到此Pod
对象的Service
对象的端点列表中移除;检测经过以后,会再将其IP
添加至端点列表中。
若是但愿容器在探测失败时被杀死并从新启动,那么请指定一个存活探针,并指定
restartPolicy
为Always
或OnFailure
。若是要仅在探测成功时才开始向
Pod
发送流量,请指定就绪探针。在这种状况下,就绪探针可能与存活探针相同,可是spec
中的就绪探针的存在乎味着Pod
将在没有接收到任何流量的状况下启动,而且只有在探针探测成功才开始接收流量。若是但愿容器可以自行维护,能够指定一个就绪探针,该探针检查与存活探针不一样的端点。
注意:若是只想在
Pod
被删除时可以排除请求,则不必定须要使用就绪探针;在删除Pod
时,Pod
会自动将自身置于未完成状态,不管就绪探针是否存在。当等待Pod
中的容器中止时,Pod
仍处于未完成状态。
Always:但凡
Pod
对象终止就将其重启,默认值OnFailure:仅在
Pod
对象出现错误时方才将其重启Never:从不重启
[root@k8s-master ~]# vim manfests/liveness-exec.yaml apiVersion: v1 kind: Pod metadata: name: liveness-exec-pod namespace: default labels: test: liveness-exec spec: containers: - name: liveness-exec-container image: busybox:latest imagePullPolicy: IfNotPresent command: ["/bin/sh","-c","touch /tmp/healthy; sleep 30; rm -f /tmp/healthy; sleep 3600"] livenessProbe: exec: command: ["test","-e","/tmp/healthy"] initialDelaySeconds: 1 periodSeconds: 3 [root@k8s-master ~]# kubectl create -f manfests/liveness-exec.yaml #建立pod pod/liveness-exec-pod created [root@k8s-master ~]# kubectl get pods #查看pod NAME READY STATUS RESTARTS AGE liveness-exec-pod 1/1 Running 0 6s #等待一段时间后再次查看其状态 [root@k8s-master ~]# kubectl get pods NAME READY STATUS RESTARTS AGE liveness-exec-pod 1/1 Running 2 2m46s
host <string>:请求的主机地址,默认为Pod IP,也能够在httpHeaders中使用“Host:”来定义。 httpHeaders <[]Object>:自定义的请求报文首部。 port <string>:请求的端口,必选字段。 path <string>:请求的HTTP资源路径,即URL path。 scheme <string>:创建链接使用的协议,仅可为HTTP或HTTPS,默认为HTTP。
[root@k8s-master ~]# vim manfests/liveness-httpget.yaml apiVersion: v1 kind: Pod metadata: name: liveness-http namespace: default labels: test: liveness spec: containers: - name: liveness-http-demo image: nginx:1.12 imagePullPolicy: IfNotPresent ports: - name: http containerPort: 80 lifecycle: postStart: exec: command: ["/bin/sh", "-c", "echo Healthz > /usr/share/nginx/html/healthz"] livenessProbe: httpGet: path: /healthz port: http scheme: HTTP [root@k8s-master ~]# kubectl create -f manfests/liveness-httpget.yaml #建立pod pod/liveness-http created [root@k8s-master ~]# kubectl get pods #查看pod NAME READY STATUS RESTARTS AGE liveness-http 1/1 Running 0 7s [root@k8s-master ~]# kubectl describe pods/liveness-http #查看liveness-http详细信息 ...... Containers: liveness-http-demo: ...... Port: 80/TCP Host Port: 0/TCP State: Running Started: Mon, 09 Sep 2019 15:43:29 +0800 Ready: True Restart Count: 0 ......
[root@k8s-master ~]# kubectl exec pods/liveness-http -it -- /bin/sh #进入到上面建立的pod中 # rm -rf /usr/share/nginx/html/healthz #删除healthz测试页面 # [root@k8s-master ~]# kubectl get pods NAME READY STATUS RESTARTS AGE liveness-http 1/1 Running 1 10m [root@k8s-master ~]# kubectl describe pods/liveness-http ...... Containers: liveness-http-demo: ...... Port: 80/TCP Host Port: 0/TCP State: Running Started: Mon, 09 Sep 2019 15:53:04 +0800 Last State: Terminated Reason: Completed Exit Code: 0 Started: Mon, 09 Sep 2019 15:43:29 +0800 Finished: Mon, 09 Sep 2019 15:53:03 +0800 Ready: True Restart Count: 1 ......
host <string>:请求链接的目标IP地址,默认为Pod IP port <string>:请求链接的目标端口,必选字段
[root@k8s-master ~]# vim manfests/liveness-tcp.yaml apiVersion: v1 kind: Pod metadata: name: liveness-tcp-pod namespace: default labels: test: liveness-tcp spec: containers: - name: liveness-tcp-demo image: nginx:1.12 imagePullPolicy: IfNotPresent ports: - name: http containerPort: 80 livenessProbe: tcpSocket: port: http
[root@k8s-master ~]# kubectl explain pods.spec.containers.livenessProbe KIND: Pod VERSION: v1 RESOURCE: livenessProbe <Object> exec command 的方式探测,例如 ps 一个进程是否存在 failureThreshold 探测几回失败 才算失败, 默认是连续三次 initialDelaySeconds 初始化延迟探测,即容器启动多久以后再开始探测,默认为0秒 periodSeconds 每隔多久探测一次,默认是10秒 successThreshold 处于失败状态时,探测操做至少连续多少次的成功才算经过检测,默认为1秒 timeoutSeconds 存活性探测的超时时长,默认为1秒 httpGet http请求探测 tcpSocket 端口探测
与存活性探测机制相似,就绪性探测是用来判断容器就绪与否的周期性(默认周期为10秒钟)操做,它用于探测容器是否已经初始化完成并可服务于客户端请求,探测操做返回
”success“
状态时,即为传递容器已经”就绪“的信号。就绪性探测也支持
Exec
、HTTPGet
和TCPSocket
三种探测方式,且各自的定义机制也都相同。但与存活性探测触发的操做不一样的是,探测失败时,就绪探测不会杀死或重启容器以保证其健康性,而是通知其还没有就绪,并触发依赖于其就绪状态的操做(例如,从Service
对象中移除此Pod
对象)以确保不会有客户端请求接入此Pod
对象。
设置HTTP探针示例
#终端1: [root@k8s-master ~]# vim manfests/readiness-httpget.yaml #编辑readiness-httpget测试pod的yaml文件 apiVersion: v1 kind: Pod metadata: name: readiness-http namespace: default labels: test: readiness-http spec: containers: - name: readiness-http-demo image: nginx:1.12 imagePullPolicy: IfNotPresent ports: - name: http containerPort: 80 readinessProbe: httpGet: path: /index.html port: http scheme: HTTP [root@k8s-master ~]# kubectl create -f manfests/readiness-httpget.yaml #建立pod pod/readiness-http created [root@k8s-master ~]# kubectl get pods 查看pod状态 NAME READY STATUS RESTARTS AGE liveness-tcp-pod 1/1 Running 1 7d18h readiness-http 1/1 Running 0 7s #新打开一个终端2进入到容器里面 [root@k8s-master ~]# kubectl exec pods/readiness-http -it -- /bin/sh #进入上面建立的pod # rm -f /usr/share/nginx/html/index.html #删除nginx的主页面文件 # ls /usr/share/nginx/html 50x.html # #回到终端1上面查看pod状态 [root@k8s-master ~]# kubectl get pods #查看pod状态 NAME READY STATUS RESTARTS AGE liveness-tcp-pod 1/1 Running 1 7d18h readiness-http 0/1 Running 0 2m44s