目录
一、Pod创建过程:
二、Pod的终止
三、pod配置详解
四、查看每种资源的可配置项
五、Pod状态
六、Pod调度
七、Pod探针
1、Pod 探针的检测方式:
一、Pod创建过程:
- 用户提交创建pod请求
- API Server处理用户请求,存储Pod数据到Etcd
- Schedule通过和API Server的监听机制,查看到新的Pod,尝试为Pod绑定node
- 过滤主机:调度器用一组规则过滤不符合要求的主机,比如:Pod指定了所需要的资源,那么就要过滤掉资源不够的主机、或者pod标签指定调度到那个主机上、或者某个节点上存在污点,而此pod能否容忍这个污点,也会被过滤,
- 主机打分:对第一步筛选出来的符合要求的主机进行打分,在此阶段,调度器会考虑一些整体优化策略。
- 选择主机:选择得分最高的主机,进行binding,并把结果存储到Etcd中。
- kubelet根据调度结果执行Pod的创建操作,绑定成功后,会启动container、docker run,scheduler会掉用API Server在etcd中创建一个bound pod 对象,描述在一个工作节点上绑定运行的所有pod 信息。运行在每个工作节点上的kubelet也会定期与etcd同步bound pod 信息,一旦发现应该在该工作节点上运行的bound pod对象没有更新,则调用 Docker API 创建并启动pod 内的容器
- POD 创建完成
二、Pod的终止
- api server收到删除pod的请求,将 pod 标记为“Terminating”状态
- 同时会在Endpoint删除Pod的IP地址
- 容器运行时给所有容器的1号进程发送TERM
- 如果定义了preStop,则会执行preStop
- 容器开始graceful关闭
- 如果超过grace-period,pod还没有被关闭,则会执行强制关闭pod流程,容器运行时向所有的container发送 SIGKILL;之后kubelet强制删除pod
如图:如果执行了删除pod 的指令,pod状态变更的同时在Endpoint中pod 的IP也会被删除
三、pod配置详解
#必选,api版本
apiVersion: v1
#必选,定义什么就写什么,比如定义一个pod就写pod,要定义server就写server
kind: Pod
#必选,元数据
metadata:
#必选,pod名称
name: string
#pod的命名空间,如果不填,默认是default,或者使用-n 参数来指定命名空间
namespace: string
#对应kind,是pod的标签列表,可以填写多个labels
labels:
#对应kind,自定义标签列表,
- name: string
#对应kind,自定义注解列表,
annotations:
- name: string
#必选,pod中容器的详细定义
spec:
initContainers: # 初始化容器,在容器启动之前执行的一些初始化操作
- command:
- sh
- -c
- echo "初始化"
#必选,容器列表
containers:
#必选,容器名字
- name: string
#必选,容器的镜像名称
image: string
#拉取镜像的策略,Always:总是拉取镜像库的镜像,Never:使用本地镜像,IfNotPresent:本地有镜像就不拉取镜像库镜像,没有就拉取
imagePullPolicy: [Always | Never | IfNotPresent]
#容器的启动命令,如果不指定,则使用镜像打包时使用的启动命令
command: [string]
#容器的启动命令参数列表
args: [string]
#容器的工作目录
workingDir: string
# workingDir: /k8s/kubernetes/
#挂载到容器内部的存储卷配置
volumeMounts:
#引用pod定义的共享存储卷的名称,
- name: string
#存储卷在容器内挂在的绝对路径,赢小于512个字符
mountsPath: string
#是否为只读模式,默认是读写
readOnly: boolean
#容器需要暴露的端口号列表
ports:
#端口名称
- name: string
#容器需要监听的端口号
containerPort: int
hostPort: int
#端口协议,支持TCP和UDP 默认TCP
protocol: string
#容器运行前设置的环境变量列表
env:
#环境变量名称
- name: string
#值
value: string
#资源限制和请求设置
resource:
#资源限制设置
limits:
#cpu限制,单位为core数,将用于docker run --cpu-shares参数
cpu: string
#内存限制,单位为MiB、GiB等,将用于docker run --momory参数
memory: string
#资源请求设置
requests:
#cpu请求,容器启动的初始可用数量
cpu: string
#内存请求,容器启动的初始可用数量
memory: string
#对pod内各容器健康检查设置当探针无响应几次之后,系统将自动重启该容器,可以设置的方法包括:exec、httpGet、tcpSocket。对一个容器仅需设置一种方法
livenessProbe:
#执行容器命令检测方式
exec:
command: [string]
#httpGet检查方式
httpGet:
path: string # http服务器上的访问URL
port: string # 容器上要访问端口号或名称
host: string # 要连接的主机名,默认POD ip
scheme: string # 用于连接host的协议,默认HTTP
httpHeaders: # 自定义HTTP请求headers,HTTP允许重复headers
- name: string
values: string
tcpSocket: # 端口检测方式
port: 端口号
initialDelaySeconds: 60 #在容器启动后多少秒进行探测,单位为S
timeoutSeconds: 2 #探针执行检测请求后,等待响应的超时时间,默认1S,若超过该时间,则认为不健康,就会重启
periodSeconds: 5 #执行探测的时间间隔,默认 10 s 一次
successThreshold: 2 # 检查成功两次表示就绪
failureThreshold: 1 # 检查失败1次表示未就绪
Lifecycle:
postStart: # 容容器创建成功后,运行前的任务,用于资源部署、环境准备等 可以使exec、httpGet、TCPSocket
exec:
command:
- sh
- -c
- "mkdir /data/"
PreStop: #在容器被终止前的任务,用于优雅关闭应用程序、通知其他系统等等。
httpGet:
host: monitor.com
psth: /waring
port: 8080
scheme: HTTP
securityContext:
privileged: false
# restartPolicy pod的重启策略,默认为 Always。
1、Always:POD一旦终止运行,无论容器是如何终止的,kubelet都将重启它,
2、OnFailure:只有pod以非0退出码终止时,kubelet才会重启该容器,如果容器正常结束(退出码为0)则不会重启
3、Never :无论什么状态,都不会重启
restartPolicy: [Always | Never | OnFailure]
#设置NodeName表示将该Pod调度到指定到名称的node节点上
nodeName: k8s-node-2
#用于将pod调度到添加了指定标签的node节点上,指定node 节点,先打一个标签。
nodeSelector: object
hostname: k8s-node-1
imagePullSecrets:
- name: string
hostNetwork: false/true 默认为false
# dnsPolicy 设置pod的DNS策略:
1、default:继承Pod所在宿主机的域名解析设置
2、clusterFirst:优先是用kubernetes环境的DNS服务,
3、clusterFirstWithHostNet:适用于以hostNetwork模式运行的pod,此时hostNetwork 必须为true
4、None:忽略kubernetes集群的DNS配置,需要手工通过dnsConfig自定义DNS配置
dnsPolicy: default
Volumes: # 共享存储卷列表
- name: string #名称,
emptyDir: {} # 挂载目录
hostPath: #挂载本机目录
path: string
secret:
secretName: string
items:
- key:string
path: string
configMap:
name: string
items:
- key: string
path: string
四、查看每种资源的可配置项
kubelet explain 资源类型
# kubectl explain 资源类型 查看某种资源可以配置的一级属性
# kubectl explain 资源类型.属性 查看属性的子属性
[root@k8s-master-1 logs]# kubectl explain pod
[root@k8s-master-1 logs]# kubectl explain pod.metadata
五、Pod状态
1、Pending:挂起。我们在请求创建pod时,天剑不满足,调度没有完成,没有任何一个节点能满足调度条件,已经创建了但是没有适合它运行的节点叫做挂起。
2、Running:Pod内多有容器都已经被创建,且至少一个容器正处于运行状态,正在启动状态或者重启状态。
3、Succeeded:Pod中所有容器都执行成功后退出,并且没有处于重启的容器
4、Failed:Pod中所有容器都已退出,但是至少还有一个容器退出时为失败状态
5、Unknown:位置状态,所谓pod是什么状态是apiserver和运行在节点的kubelet进行通信获取状态信息的,如果节点之上的kubelet本身出故障,那么apiserver就连不上kubelet,得不到信息 了,就会看到Unknown。
六、Pod调度
在默认情况下,一个Pod在哪个Node节点上运行,是由Scheduler组件采用相应的算法计算出来的,这个过程是不受人工控制的。但是在实际使用中,这并不满足的需求,因为很多情况下,我们想控制某些Pod到达某些节点上,那么应该怎么做呢?这就要求了解kubernetes对Pod的调度规则,kubernetes提供了四大类调度方式:
- 自动调度:运行在哪个节点上完全由Scheduler经过一系列的算法计算得出
- 定向调度:NodeName、NodeSelector
- 亲和性调度:NodeAffinity、PodAffinity、PodAntiAffinity
- 污点(容忍)调度:Taints、Toleration
七、Pod探针
StartupProbe:k8s1.16版本后新加的探测方式,用于判断容器内应用程序是否启动。如果配置了StartupProbe,就会先禁止其他的探测,直到他成功为止,成功后将不在进行探测。
LivenessProbe 存活性探针:用于探测容器是否运行,如果探测失败,kubelet 会根据配置的重启策略,进行相应的处理,若没有配置该探针,默认就是success
ReadinessProbe 就绪性探针:一般用于探测容器内的程序是否健康,它的返回值如果为success ,那么就代表这个容器已经完全启动,并且程序已经是可以接受流量的状态
区别:探测方式相同,只是对Pod的处置方式不同
readinessProbe:当检测到失败后,将POD的IP:PORT从对应的EndPoint列表中删除
LicenessProbe:当检测到失败后,将杀死容器并根据pod的重启策略来决定作出对应的措施
1、Pod 探针的检测方式:
Exec:在容器内执行一个命令,如果返回值为0,则认为容器健康
TCPSocket:通过容器的IP地址和端口号执行TCP检查,如果是通的就认为容器健康,
HTTPGet:通过应用程序暴露的API地址来检测程序是否是正常的,如果状态码为200-400之间,则认为容器健康
探针检查参数配置:
initialDelaySeconds: 60 #在容器启动后多少秒进行探测,单位为S
timeoutSeconds: 2 #响应的超时时间,默认1S,若超过该时间,则认为不健康,就会重启
periodSeconds: 5 #执行探测的时间间隔,默认 10 s 一次
successThreshold: 2 # 检查成功2次表示就绪
failureThreshold: 1 # 检查失败1次表示未就绪
探针探测结果有以下值
Success:表示通过检测。
Failure:表示未通过检测。
Unknown:表示检测没有正常进行。
1.2 探针使用用例
(1)通过exec 方式做健康检查
apiVersion: v1
kind: Pod
metadata:
name: liveness-exec
labels:
app: liveness
spec:
containers:
- name: liveness
image: busybox
args: #创建测试探针探测的文件
- /bin/sh
- -c
- touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
livenessProbe:
initialDelaySeconds: 10 #延迟检测时间
periodSeconds: 5 #检测时间间隔
exec: #使用命令检查
command: #指令,类似于运行命令sh
- cat #sh 后的第一个内容,直到需要输入空格,变成下一行
- /tmp/healthy #由于不能输入空格,需要另外声明,结果为sh cat"空格"/tmp/healthy
解释:
容器在初始化后,执行(/bin/sh -c "touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600")首先创建一个 /tmp/healthy 文件,然后执行睡眠命令,睡眠 30 秒,到时间后执行删除 /tmp/healthy 文件命令。而设置的存活探针检检测方式为执行 shell 命令,用 cat 命令输出 healthy 文件的内容,如果能成功执行这条命令一次(默认successThreshold:1),存活探针就认为探测成功,由于没有配置(failureThreshold、timeoutSeconds),所以执行(cat /tmp/healthy)并只等待1s,如果1s内执行后返回失败,探测失败。在前 30 秒内,由于文件存在,所以存活探针探测时执行 cat /tmp/healthy 命令成功执行。30 秒后 healthy 文件被删除,所以执行命令失败,Kubernetes 会根据 Pod 设置的重启策略来判断,是否重启 Pod。