Pod是Kubernetes对象模型中能够创建或部署的最小并且是最简单的基本单元。一个Pod代表在集群中正在运行的一个进程。
Pod由一个或多个容器组成,它们共享容器存储、网络和容器运行配置项。Pod中的容器总是被同时调度,由共同的运行环境。
一、通过yaml文件定义Pod
Pod分类:
- 自主式Pod:需要自己手动管理的Pod
- 受控制器管理的Pod
Pod资源清单格式:
apiVersion:(group/version)
kind:(pod)
metadata:
name:
namespace:
labels:
annotations:
...
...
spec:
containers:
- name:
image:
command:
args:
imagePullPolicy:
lifecycle:
livenessProbe:
readinessProbe:
env:
- name:
value:
nodeSelector:
key1: value1
key2: value2
status:<只读,由kubernetes自己创建>
可以使用kubectl explain pod命令详细查看pod资源所支持的所有字段:
比如我想了解pod资源的spec字段下的nodeSelector字段的详细信息,可以使用以下命令查看:
[[email protected] manifests]# kubectl explain pod.spec.nodeSelector
KIND: Pod
VERSION: v1
FIELD: nodeSelector <map[string]string>
DESCRIPTION:
NodeSelector is a selector which must be true for the pod to fit on a node.
Selector which must match a node's labels for the pod to be scheduled on
that node. More info:
https://kubernetes.io/docs/concepts/configuration/assign-pod-node/
定义一个pod-demo.yaml创建一个pod:
apiVersion: v1
kind: Pod
metadata:
name: pod-demo
namespace: default
labels:
app: myapp
tier: frontend
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
ports:
- name: http
containerPort: 80
- name: https
containerPort: 443
- name: busybox
image: busybox:latest
imagePullPolicy: IfNotPresent
command:
- "/bin/sh"
- "-c"
- "sleep 3600"
使用kubectl create命令更具pod-demo.yaml创建pod:
[[email protected] manifests]# kubectl create -f pod-demo.yaml
pod/pod-demo created
这样就创建了一个名为pod-demo的pod
二、Pod调度
调度策略分为
- 全局调度:在调度器启动是配置
- 运行时调度:在yaml文件中指定,包括nodeSelector等
Scheduler是kubernetes的调度器,其作用是根据特定的调度算法和策略将Pod调度到指定的计算节点(Node)上,其作为单独的程序运行,启动之后会一直监听API Server,获取Pod.spec.nodeName为空的Pod,对每个Pod都会创建一个绑定(binding)。
全局调度
分以下几个部分:
1.首先是预选过程,过滤掉不满足条件的节点,这个过程称为predicates。
2.然后是优选过程,对通过的节点按照优先级排序,称之为priorities。
3.最后从中选择优先级最高的节点
大体如下图
运行时调度
kubernetes主要通过以下几种方式设置运行时调度:
1.节点设置相应label,然后使用nodeSelector选择对应节点的label
2.节点设置相应label,然后使用affinity(亲和性)和anti-affinity(非亲和性)选择对应节点的label
3.为节点设置污点taints,然后使用容忍tolerations
详细的使用方法可以参考Kubernetes之Pod调度
三、pod生命周期
说明:
- 初始化容器阶段初始化pod中每一个容器
- 启动主容器main container
- 在main container刚刚启动之后可以执行post start命令
- 在整个main container执行的过程中可以做两类探测:liveness probe(存活探测)和readiness probe(就绪探测)
- 在main container结束前可以执行pre stop命令
pod状态解析
- Pending:挂起,表示调度尚未完成
- Running:运行,调度已完成并且所有容器已经被创建
- Failed:失败,pod中的所有容器都被终止并且至少由一个容器终止异常
- Succeeded:完成,pod中的所有容器都已经被终止并且不会被重启
- Unknown:未知,pod状态获取不到
配置Pod的liveness和readiness探针
两种探针都支持三种类型:
- ExecAction:命令形式
- TCPSocketAction:建立TCP连接
- HTTPGetAction:发送http get请求
详细可参考配置Pod的liveness和readiness探针
配置启动后钩子(post start)和终止前钩子(pre stop)
- post start:容器创建之后立即执行,如果失败了就会按照重启策略重启容器
- pre stop:容器终止前立即执行,执行完成之后容器将成功终止
可以使用以下命令查看post start和pre stop的设置格式:
[[email protected] manifests]# kubectl explain pod.spec.containers.lifecycle.preStop
[[email protected] manifests]# kubectl explain pod.spec.containers.lifecycle.postStart
四、Pod控制器
pod控制器类型以及对应的核心资源:
- ReplicationController:副本控制器
- ReplicaSet:管理无状态应用,新一代的ReplicationController
用户期望的副本数
标签
扩缩容 - Deployment:管理无状态应用,建构在ReplicaSet之上的
滚动更新
声明式配置–>支持动态运行时修改 - DaemonSet:管理无状态应用
- Job:执行一次性任务,执行成功后就退出
- CronJob:周期性Job
- StatefulSet:管理有状态应用
Deployment滚动更新策略: