一、污点和容忍度
名词解释:
污点是一种节点上的属性,他表示该节点存在某种问题,如磁盘空间不足、内存不足等。如果一个节点被标记污点,那么默认情况下,K8S不会在该节点上调度新的Pod
容忍度是一种Pod属性,容忍度只是告诉K8S,这个Pod可以容忍特定的污点,但是并不意味着Pod必须被调度到拥有这个污点的节点上。
例:
给节点添加污点
kubectl taint nodes lx252 a=b:NoSchedule
解释:这会给lx252节点打上a=b的污点,它的效果是NoSchedule不调度
编写Yaml文件容忍:
vim podtaint.yaml
---
apiVersion: v1
kind: Pod
metadata:
name: taint
spec:
containers:
- name: taint
image: ikubernetes/myapp:v1
imagePullPolicy: IfNotPresent
tolerations:
- key: a
operator: Equal #选项有Equal和Exists分别为 Equal:键值对完全相当,Exists:只要键相等即可
value: b
effect: NoSchedule #选项有NoSchedule、PreferNoSchedule、NoExecute
#NoSchedule:该节点将被标记为不可调度状态,即不会将新的 Pod 调度到该节点上
#PreferNoSchedule:当节点上存在与 Pod 的 Taints 相匹配的污点时,该节点仍然可以被调度 Pod,但是调度器会尽量避免将新的 Pod 调度到带有污点的节点上。
#NoExecute:如果一段时间后Pod仍然无法容忍,那么Pod将会被去追。!!!!谨慎使用!!!!
二、Pod状态和重启策略
Pod常见状态:
Pending:等待指定Node节点或者调度到的Node有足够的资源被释放
Running:Pod中的容器正在运行中
Succeeded: 如果指定了具体任务且任务已经完成成功了,那么Pod将会进入Succeeded状态
Failed:如果指定了具体任务但是任务失败了,Pod就会进入Failed状态
Unknown: 当删除一个Pod的控制器时,Kubernetes将会对该Pod的监视,那状态就会变成Unknown
containerCreating:Pod已经被Kubernetes调度到了某个节点上,但是容器还没有开始
Terminating:Pod正在被删除
CrashLoopBackOff:当一个容器启动失败,并且已经尝试了指定的重启次数(通常为3次),但是每次都失败了
ImagePullBackOff:Pod中某个容器无法拉取镜像
CreateContainerConfigError:Pod中的某个容器无法创建
CreateContainerError:Pod中的某个容器无法创建
PodInitializing:Pod正在初始化
error
Pod重启策略
kubernetes提供了三种重启策略
Always:无论什么情况下,只要容器退出或者停止,就会自动重启Pod里的容器
OnFailure:只有当容器以非0状态终止时才会自动重启Pod里的容器
Never: Pod里的容器不会被自动重启,除非显式的进行手动操作
例:
OnFailure重启策略
vim onfailure.yaml
---
apiVersion: v1
kind: Pod
metadata:
name: onfailure
spec:
containers:
- name: onfailure
image: nginx:latest
imagePullPolicy: IfNotPresent
restartPolicy: OnFailure
kubectl apply -f onfailure.yaml
#查看pod状态
kubectl get pods
#进入Pod正常停止Pod
kubectl exec -it [PodName] /bin/bash
#停止Nginx
nginx -s stop
#容器退出,现在查看容器状态为Completed
删除容器重新创建
kubectl delete pods onfailure
kubectl apply -f onfailure.yaml
#查看pod状态
kubectl get pods
#进入Pod异常停止Pod
kubectl exec -it [PodName] /bin/bash
#停止Nginx
pkill nginx
就会发现Pod在重启
三、生命周期
Pod生命周期包括一下几个阶段
1、初始化容器(init Containers)阶段 初始化容器是在Pod启动之前运行一组容器,他们复制执行一些必要的初始化任务
2、主容器(main containers)阶段 主容器时Pod中的核心容器他们负责实际运行应用程序或服务
3、运行时状态(running state)阶段 一旦Pod的中的所有容器都启动成功,它们会进入Running状态
4、容器重启(Container Restart)阶段 在Pod运行期间,容器可能会出现故障或崩溃。当容器重新启动时,Kubernetes会记录重启次数,并在频繁重启时采用相应的措施
5、终止(Termination)阶段 当Pod不再需要时,Kubernetes会将其终止
四、健康监测
常用的健康探测方式:
1、Liveness Probe(存活探测):Liveness Probe 用于监测 pod 内的容器是否处于运行状态。当Liveness Probe 探测失败时,Kubernetes 根据重启策略决定是否重启该容器。适用于需要在容器发生故障时立即进行重启的应用场景,比如 Web 服务器和数据库等应用。
2、Readiness Probe(就绪探测):Readiness Probe 用于监测 pod 内的容器是否已经准备好接受流量,即容器是否已经完成初始化并已经启动了应用程序。当容器的 Readiness Probe 探测失败时,Kubernetes 将停止将新的流量转发到该容器。适用于需要应用程序启动较长时间的应用场景,比如大型 Web 应用程序
3、Startup Probe(启动探测) Startup Probe 用于监测 pod 内的容器是否已经启动成功并准备好接受流量。与 Liveness Probe 不同的是,Startup Probe 只会在容器启动时执行一次。当 Startup Probe 探测失败时,Kubernetes 将自动重启该容器。适用于需要较长启动时间的应用场景,比如应用程序需要大量预热或者需要等待外部依赖组件的应用程序。
三种均支持 httpGet、exec和tcpSocket三种探针
例:
vim hunhe.yaml
apiVersion: v1
kind: Pod
metadata:
name: hunhe
spec:
containers:
- name: hunhe
image: nginx
imagePullPolicy: IfNotPresent
readinessProbe: #就绪探测
httpGet: #尝试连接80端口的index.html路径
path: /index.html
port: 80
initialDelaySeconds: 10 #每间隔10秒重新连接
periodSeconds: 5 #容器启动后等待5秒
successThreshold: 1 #成功一次后就表明容器已经就绪
failureThreshold: 3 #失败三次说明这个容器不健康,容器会被重启
livenessProbe: #存活探测
httpGet: #尝试连接80端口的index.html路径
path: /index.html
port: 80
initialDelaySeconds: 15 #等待15秒
periodSeconds: 10 #每隔10秒再次尝试重新连接
failureThreshold: 3 #如果三次连续探测失败就是不健康的,容器会被重启
startupProbe: #启动探测
httpGet: #尝试连接80端口的index.html路径
path: /index.html
port: 80
periodSeconds: 10 #每隔10秒再次尝试重新连接
initialDelaySeconds: 5 #等待5秒
failureThreshold: 10 #如果10次连续探测失败就是不健康的,容器会被重启