【云原生】k8s之pod基础(下)

news2024/11/17 3:26:41

内容预知

 1.pod的镜像拉取策略

1.1 镜像拉取说明 

1.2 镜像拉取的策略 

1.3 镜像拉取策略的设置操作 

 (1)Never策略的使用

(2)IfNotPresent策略在本地无镜像的情况下使用

(3) IfNotPresent策略在本地有镜像的情况下使用

(4)再次使用Never策略进行测试 

(5)Always策略 

 2.pod的启动命令说明

 3.Pod 容器的重启策略

(1)docker的重启策略 

(2)k8s中pod的重启策略 

 4. pod的状态说明

(1)Pod 一直处于Pending状态

(2)Pod一直处于Waiting 或 ContainerCreating状态

(3)Pod 一直处于ImagePullBackOff状态

(4)Pod 一直处于CrashLoopBackOff状态

(5)  Pod处于Error状态

(6)  Pod 处于Terminating或 Unknown状态

(7)pod从创建到成功或失败的事件

PodScheduledpod正处于调度中,刚开始调度的时候,hostip还没绑定上,持续调度之后,有合适的节点就会绑定hostip,然后更新etcd数据

 5. Pod 容器资源限制

5.1 资源限制的了解 

 (1)cpu限制的参数了解

(2)memory的表达形式 

5.2 实例运用 

 6. Pod 容器的探针

6.1 探针的概念及其作用 

6.2 探针的探测方式 

6.3 探针字段 

6.4 探针实验测试 

 (1)LivenessProbe 探针使用

1) 通过exec方式做健康探测 

2)通过HTTP方式做健康探测 

 3)通过TCP方式做健康探测

 (2)ReadinessProbe 探针使用

(3)启动探针的使用 

 7.Pod 容器的启动和退出动作

实例运用


 1.pod的镜像拉取策略

1.1 镜像拉取说明 

当你在创建容器时会针对指定的镜像来进行容器的创建,所以pod的创建是以镜像为基础。当你在拉取镜向不指定仓库的主机名,Kubernetes 认为你在使用 Docker 公共仓库。

在镜像名称之后,你可以添加一个标签(Tag)(与使用 docker 或 podman 等命令时的方式相同)。 使用标签能让你辨识同一镜像序列中的不同版本。

镜像标签可以包含小写字母、大写字母、数字、下划线(_)、句点(.)和连字符(-。 关于在镜像标签中何处可以使用分隔字符(_- 和 .)还有一些额外的规则。 如果你不指定标签Kubernetes 认为你想使用标签latest

1.2 镜像拉取的策略 

 首先在资源式声明中存在着imagePullPolicy的字段,它的value决定着k8s创建容器时拉取镜像的方式策略。【此字段所在位置也说明了在声明式yaml中,imagePullPolicy是包含containers中

kubectl explain pod.spec.containers.imagePullPolicy

如图所示,这三种便是k8s拉取镜像的三种策略:

IfNotPresent

只有当镜像在本地不存在时才会拉取。(先对本地进行排查,本地有该镜像直接使用,本地没有该镜像则选择在仓库中拉取)

Always

总是从仓库拉取镜像,无论本地是否存在镜像(即使本地中存在我们所指定的相关镜像,该策略也会先从仓库中拉取进行应用)

Never

Kubelet 不会尝试获取镜像。如果镜像已经以某种方式存在本地, kubelet 会尝试启动容器;否则,会启动失败。(如果本地不存在,并不会在仓库中拉取,直接报错)

 注意:如果没有显式设定的话, Pod 中所有容器的默认镜像拉取策略是IfNotPresent。但是也存在着默认策略选择Always的情况。

  • 如果你省略了 imagePullPolicy 字段,并且容器镜像的标签是 :latest imagePullPolicy 会自动设置为 Always
  • 如果你省略了 imagePullPolicy 字段,并且没有指定容器镜像的标签, imagePullPolicy 会自动设置为 Always
  • 如果你省略了 imagePullPolicy 字段,并且为容器镜像指定了非 :latest 的标签, imagePullPolicy 就会自动设置为 IfNotPresent

此外:

在生产环境中部署容器时,你应该避免使用 :latest 标签,因为这使得正在运行的镜像的版本难以追踪,并且难以正确地回滚。(难以追溯版本,且latest一直会不断迭代更新,给版本维护照成困扰) 

1.3 镜像拉取策略的设置操作 

 (1)Never策略的使用

kubectl run app-test --image=nginx:1.14  --dry-run=client -o yaml > demo1.yaml
vim demo1.yaml 

apiVersion: v1
kind: Pod
metadata:
  name: app-test
spec:
  containers:
  - image: nginx:1.14
    name: app-test
    imagePullPolicy: Never

 

(2)IfNotPresent策略在本地无镜像的情况下使用

apiVersion: v1
kind: Pod
metadata:
  name: app-test
spec:
  containers:
  - image: nginx:1.14
    name: app-test
    imagePullPolicy: IfNotPresent

#查看详细的pod信息,其中也有日志的作用
kubectl describe pod  app-test

(3) IfNotPresent策略在本地有镜像的情况下使用

 

 

 

(4)再次使用Never策略进行测试 

 

 

(5)Always策略 

 

 

 2.pod的启动命令说明

在k8s的容器中也存在着和docker-compose类似的shell启动命令字段,用于pod容器启动后执行命令的操作。 

该字段存在containers中:

kubectl explain pod.spec.containers

 

command,用于在 pod 中的容器初始化完毕之后运行一个命令

 command: ["/bin/sh","-c","touch /tmp/hello.txt"]

  • "/bin/sh","-c", 使用sh执行命令
  • touch /tmp/hello.txt; 创建一个/tmp/hello.txt 文件

 该字段还可以运用args进行编写(起到同样的效果):

args:
- /bin/bash
- touch /tmp/hello.txt

除了 command 参数外,还有一个 args 参数

 command 已经可以完成启动命令和传递参数的功能,为什么这里还要提供一个 args 选项,用于传递参数呢?这其实跟 docker 有点关系,kubernetes 中的 command、args 两项其实是实现覆盖 Dockerfile 中 ENTRYPOINT 的功能。

  • 如果 command 和 args 均没有写,那么用 Dockerfile 的配置。
  • 如果 command 写了,但 args 没有写,那么 Dockerfile 默认的配置会被忽略,执行输入的 command
  • 如果 command 没写,但 args 写了,那么 Dockerfile 中配置的 ENTRYPOINT 的命令会被执行,使用当前 args 的参数
  • 如果 command 和 args 都写了,那么 Dockerfile 的配置被忽略,执行 command 并追加上 args 参数

 

 3.Pod 容器的重启策略

 k8s中重启策略适用于pod对象中的所有容器,首次需要重启的容器,将在其需要时立即进行重启,随后再次需要重启的操作将由kubelet延迟一段时间后进行,且反复的重启操作的延迟时长为10s,20s,40s,80s,160s,300s,  300s是最大延迟时长

kubectl explain pod.spec.restartPolicy

(1)docker的重启策略 

never默认策略,在容器退出时不重启容器。
on-failure在容器非正常退出时(退出状态非0),才会重启容器。此外on-failure还可以指定重启次数(on-failure:3,在容器非正常退出时重启容器,最多重启3次。)
always在容器退出时总是重启容器。
unless-stopped在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器。

(2)k8s中pod的重启策略 

 Always当Pod中的容器退出时,总是重启容器,无论容器退出状态码如何。默认的重启策略
OnFailure 当Pod中的容器异常退出(容器退出状态码非0)时,会重启容器,正常退出(容器退出状态码为0)时不重启容器
Never 当Pod中的容器退出时,总是不重启容器,无论容器退出状态码如何

注意:yaml方式创建Deployment和StatefulSet类型时,restartPolicy只能是Always,kubectl run -个pod可以选择Always,OnFailure,Never三种策略

 4. pod的状态说明

(1)Pod 一直处于Pending状态


 Pending状态意味着Pod的YAML文件已经提交给Kubernetes,API对象已经被创建并保存在Etcd当中。但是,这个Pod里有些容器因为某种原因而不能被顺利创建。比如,调度不成功(可以通过kubectl describe pod命令查看到当前Pod的事件,进而判断为什么没有调度)。

可能原因:资源不足(集群内所有的Node都不满足该Pod请求的CPU、内存、GPU等资源);      HostPort  已被占用(通常推荐使用Service对外开放服务端口)。

(2)Pod一直处于Waiting 或 ContainerCreating状态

首先还是通过 kubectl describe pod命令查看当前Pod的事件。可能的原因有:
1)镜像拉取失败,比如镜像地址配置错误、拉取不了国外镜像源(gcr.io)、私有镜像密钥配置错误、镜像太大导致拉取超时 (可以适当调整kubelet的-image-pull-progress-deadline和-runtime-request-timeout选项)等。
2)CNI网络错误,一般需要检查CNI网络插件的配置,比如:无法配置Pod 网络、无法分配IP地址。
3)容器无法启动,需要检查是否打包了正确的镜像或者是否配置了正确的容器参数
4)Failed create pod sandbox,查看kubelet日志,原因可能是磁盘坏道(input/output error)。

(3)Pod 一直处于ImagePullBackOff状态


通常是镜像名称配置错误或者私有镜像的密钥配置错误导致。

(4)Pod 一直处于CrashLoopBackOff状态

 
此状态说明容器曾经启动了,但又异常退出。这时可以先查看一下容器的日志。
通过命令kubectl logs 和kubectl logs --previous 可以发下一些容器退出的原因,比如:容器进程退出、健康检查失败退出;此时如果还未发现线索,还而已到容器内执行命令(kubectl exec cassandra - cat /var.log/cassandra/system.loq)来进一步查看退出原因;如果还是没有线索,那就需要SSH登录该Pod所在的Node上,查看Kubelet或者Docker的日志进一步排查。

(5)  Pod处于Error状态


通常处于Error状态说明Pod启动过程中发生了错误。

常见的原因:依赖的ConfigMap、Secret或PV等不存在;请求的资源超过了管理员设置的限制,比如超过了LimitRange等;违反集群的安全策略,比如违反了PodSecurityPolicy.等;容器无法操作集群内的资源,比如开启RDAC后,需要为ServiceAccount配置角色绑定。

(6)  Pod 处于Terminating或 Unknown状态

 从v1.5开始,Kubernetes不会因为Node失联而删除其上正在运行的Pod,而是将其标记为Terminating 或 Unknown 状态。想要删除这些状态的Pod有三种方法:

1)从集群中删除Node。使用公有云时,kube-controller-manager会在VM删除后自动删除对应的Node。而在物理机部署的集群中,需要管理员手动删除Node(kubectl delete node)。

2)Node恢复正常。kubelet会重新跟kube-apiserver通信确认这些Pod的期待状态,进而再决定删除或者继续运行这些Pod。用户强制删除,用户可以执行(kubectl delete pods pod-name --grace-period=0 --force)强制删除Pod。除非明确知道Pod的确处于停止状态(比如Node所在VM或物理机已经关机),否则不建议使用该方法。特别是StatefulSet 管理的Pod,强制删除容易导致脑裂或数据丢失等问题。

3)Pod行为异常,这里所说的行为异常是指Pod没有按预期的行为执行,比如没有运行podSpec 里面设置的命令行参数。这一般是podSpec yaml文件内容有误,可以尝试使用 --validate 参数重建容器,比如(kubectl delete pod mypod 和 kubectl create --validate -f mypod.yaml);也可以查看创建后的podSpec是否是对的,比如(kubectl get pod mypod -o yaml);修改静态Pod的Manifest后未自动重建,kubelet 使用inotify 机制检测 /etc/kubernetes/manifests 目录(可通过 kubelet 的 -pod-manifest-path 选项指定)中静态Pod的变化,并在文件发生变化后重新创建相应的 Pod。但有时也会发现修改静态Pod的 Manifest后未自动创建新 Pod的情景,此时已过简单的修复方法是重启 Kubelet。

Unknown 这个异常状态意味着Pod的状态不能持续地被 kubelet汇报给 kube-apiserver,这很有可能是主从节点(Master 和 Kubelet)间的通信出现了问题。

(7)pod从创建到成功或失败的事件


PodScheduled
pod正处于调度中,刚开始调度的时候,hostip还没绑定上,持续调度之后,有合适的节点就会绑定hostip,然后更新etcd数据

Initialized
pod中的所有初始化容器已经初启动完毕

Ready
pod中的容器可以提供服务了

Unschedulable
不能调度,没有合适的节点

 


CrashLoopBackOff:    容器退出,kubelet正在将它重启
InvalidImageName:    无法解析镜像名称
ImageInspectError:   无法校验镜像
ErrImageNeverPull:   策略禁止拉取镜像
ImagePullBackOff:    正在重试拉取
RegistryUnavailable: 连接不到镜像中心
ErrImagePull:        通用的拉取镜像出错
CreateContainerConfigError: 不能创建kubelet使用的容器配置
CreateContainerError: 创建容器失败
m.internalLifecycle.PreStartContainer 执行hook报错
RunContainerError:   启动容器失败
PostStartHookError:   执行hook报错
ContainersNotInitialized: 容器没有初始化完毕
ContainersNotReady:   容器没有准备完毕
ContainerCreating:    容器创建中
PodInitializing:pod   初始化中
DockerDaemonNotReady:  docker还没有完全启动
NetworkPluginNotReady: 网络插件还没有完全启动
Evicte:     pod被驱赶

 5. Pod 容器资源限制

5.1 资源限制的了解 

  在我前面Docker的Cgroup文章中,就提到过,为什么我们对容器进行资源限制。同理:首先K8s中pod使用宿主机的资源默认情况下是无节制的,但是当一个集群搭建成功后并投入生产环境中。如果其中的某一个pod因为不明原因出现了bug,疯狂占用宿主机资源,抢占其他pod的资源。势必会导致整个集群的瘫痪,所以pod资源的限制是非常有必要的

 在资源控制器中我们也可以准确的找到相应的资源控制字段:

kubectl explain deployment.spec.template.spec.containers.resources
kubectl explain  statefulset.spec.template.spec.containers.resources

 

 

在官方文档中(资源配额 | Kubernetes) 我们可以得知:pod控制的资源总共为三大类:

cpu,memory,hugepages(巨页)。其中我们运用最多的限制还是cpu和memory。

 (1)cpu限制的参数了解

 pod对于cpu限制的参数有两种表达形式:

第一种是指定个数的表达形式,例如:1 ,2, 0.5 ,0.2 ,0.3 指定cpu的个数(该个数可以为整数,也可以为小数点后一位的小数)

第二种是以毫核为单位的表达形式:100m  500m   1000m   2000m (这里1000m等价于一个cpu,该方式来自于cpu时间分片原理得来) 

(2)memory的表达形式 

pod对内存参数的要求十分严谨。对硬件有过研究的朋友,应该会了解到,我们常常提到的GB,MB,TB其实是于实际字节总数是有误差的(原因是GB是以10为底数计量,而真正的换算是以2为底数计量。导致了总量的误差。)而真正没有此误差的单位是Ki  Mi  Gi  Ti 

所以k8s中pod资源限制为了对pod的内存限制更为精准,采用的单位是 Ki  Mi  Gi  Ti 

5.2 实例运用 

 需求:创建一个deployment资源,镜像使用nginx:latest,创建3个pod副本,镜像拉取策略使用IfNotPresent,重启策略使用Always,容器资源预留cpu 0.25个,内存128MiB,上限最多1个cpu,1g内存

kubectl create deployement nginx-test --images=nginx:latest  --dry-run=client -o yaml >test.yaml
vim test.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: nginx-test
  name: nginx-test
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx-test
  template:
    metadata:
      labels:
        app: nginx-test
    spec:
      containers:
      - image: nginx:latest
        name: nginx
        resources:
          requests:
            memory: "128Mi"
            cpu: "250m"
          limits:
            memory: "1Gi"
            cpu: "1"
        imagePullPolicy: IfNotPresent
      restartPolicy: Always


kubectl apply -f test.yaml

#查看pod的资源使用情况
kubectl describe pod nginx-test

#查看node节点pod资源使用详情
kubectl describe node node02

 6. Pod 容器的探针

6.1 探针的概念及其作用 

 探针是由 kubelet 对容器执行的定期诊断(pod中探针又分为三类):

 存活探针(livenessProbe)探测容器是否运行正常。如果探测失败则kubelet杀掉容器(不是Pod),容器会根据重启策略决定是否重启

就绪探针(readinessProbe)探测Pod是否能够进入READY状态,并做好接收请求的准备。如果探测失败Pod则会进入NOTREADY状态(READY为0/1)并且从所关联的service资源的端点(endpoints)中踢出,service将不会再把访问请求转发给这个Pod

启动探针(startupProbe)探测容器内的应用是否启动成功,在启动探针探测成功之前,其它类型的探针都会暂时处于禁用状态 

 注意:启动探针只是在容器启动后按照配置满足一次后就不再进行后续的探测了。存活探针和就绪探针会一直探测到Pod生命周期结束为止

kubectl explain pod.spec.containers

6.2 探针的探测方式 

exec : 通过command字段设置在容器内执行的Linux命令来进行探测,如果命令返回码为0,则认为探测成功,返回码非0则探测失败

httpGet : 通过向容器的指定端口和uri路径发起HTTP GET请求,如果HTTP返回状态码为 >=200且<400的(2XX,3XX),则认为探测成功,返回状态码为4XX,5XX则探测失败

tcpSocket1 : 通过向容器的指定端口发送tcp三次握手连接,如果端口正确却tcp连接成功,则认为探测成功,tcp连接失败则探测失败 

探针探测结果有以下值:
Success:表示通过检测。
Failure:表示未通过检测。
Unknown:表示检测没有正常进行。
 

6.3 探针字段 

 探针(Probe)有许多可选字段,可以用来更加精确的控制Liveness和Readiness两种探针的行为(Probe):

  • initialDelaySeconds:容器启动后要等待多少秒后就探针开始工作,单位“秒”,默认是 0s,最小值是 0s;
  • periodSeconds:执行探测的时间间隔(单位是秒),默认为 10s,最小值是 1s,
  • timeoutSeconds:探针执行检测请求后,等待响应的超时时间,默认为 1s,最小值是 1s,
  • successThreshold:探针检测失败后认为成功的最小连接成功次数,默认为 1,在 Liveness和startup探针中必须为 1,最小值为 1。
  • failureThreshold:探测失败的重试次数,重试一定次数后将认为失败,默认为 3,最小值为 1
     

6.4 探针实验测试 

 (1)LivenessProbe 探针使用

1) 通过exec方式做健康探测 

apiVersion: v1
kind: Pod
metadata:
  name: demo-live
  labels:
    app: demo-live
spec:
  containers:
  - name: demo-live
    image: centos:7
    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。

2)通过HTTP方式做健康探测 

apiVersion: v1
kind: Pod
metadata:
  name: liveness-http
  labels:
    test: liveness
spec:
  containers:
  - name: liveness
    image: mydlqclub/springboot-helloworld:0.0.1
    livenessProbe:
      failureThreshold: 5       #检测失败5次表示未就绪
      initialDelaySeconds: 20   #延迟加载时间
      periodSeconds: 10          #重试时间间隔
      timeoutSeconds: 5         #超时时间设置
      successThreshold: 2       #检查成功为2次表示就绪
      httpGet:
        scheme: HTTP           # 用于连接host的协议,默认为HTTP。
        port: 8081             #容器上要访问端口号或名称。
        path: /actuator/health    #http服务器上的访问URI。


此外:

host:要连接的主机名,默认为Pod IP,可以在http request head中设置host头部。

httpHeaders:自定义HTTP请求headers,HTTP允许重复headers


#####过程了解##########################


 Pod 中启动的容器是一个 SpringBoot 应用,其中引用了 Actuator 组件,提供了 /actuator/health 健康检查地址,在pod启动后,初始化等待20s后,livenessProbe开始工作,去请求HTTP://podIP:8081/actuator/health 接口,类似于curl -I HTTP://podIP:8081/actuator/health接口,考虑到请求会有延迟(curl -I后一直出现假死状态),所以给这次请求操作一直持续5s,如果5s内访问返回数值在>=200且<=400代表第一次检测success,如果是其他的数值,或者5s后还是假死状态,执行类似(ctrl+c)中断,并反回failure失败。等待10s后,再一次的去请求HTTP://podIP:8081/actuator/health接口。如果有连续的2次都是success,代表无问题。如果期间有连续的5次都是failure,代表有问题,直接重启pod,此操作会伴随pod的整个生命周期

 

 3)通过TCP方式做健康探测

apiVersion: v1
kind: Pod
metadata:
  name: liveness-tcp
  labels:
    app: liveness
spec:
  containers:
  - name: liveness
    image: nginx
    livenessProbe:
      initialDelaySeconds: 15
      periodSeconds: 20
      tcpSocket:
        port: 80

#########过程解析#####################


TCP 检查方式和 HTTP 检查方式非常相似,在容器启动 initialDelaySeconds 参数设定的时间后,kubelet 将发送第一个 livenessProbe 探针,尝试连接容器的 80 端口,类似于telnet 80端口,如果连接失败则将杀死 Pod 重启容器。

 

 (2)ReadinessProbe 探针使用

  livenessProbe+readinessProbe通过httpGet探测方法的实验过程:

 本次过程我将nginx的网页目录中index.html修改为test.html。并写下了下面的资源yaml进行测试

apiVersion: v1
kind: Pod
metadata:
  name: myapp-test4
spec:
  containers:
  - image: nginx:1.14
    imagePullPolicy: IfNotPresent
    name: myapp-test4
    ports:
    - containerPort: 80
      name: http
    livenessProbe:
      httpGet:
        port: http
        path: /index.html
      initialDelaySeconds: 5
      periodSeconds: 4
      failureThreshold: 2
    readinessProbe:
      httpGet:
        port: 80
        path: /test.html
      initialDelaySeconds: 1
      periodSeconds: 3
      failureThreshold: 3
      timeoutSeconds: 10
  restartPolicy: Always

该过程:

(1)首先是就绪探针在容器重启1s后进行httpGet方式探测,寻找到了 test.html网页验证成功。将该Pod 标记为就绪状态,kubelet 将继续每隔 10 秒运行一次探测。 

 (2)除此之外我还设置了存活探针,存活探针在容器启动的5s后,进行httpGet探测,因为默认网页被修改的缘故,找不到index.html,随后继续了两次4s间隔的探测,依旧没有发现uri目标网页。根据重启策略重启容器(该过程实际上就是删除原有pod,根据镜像拉取新的pod)。

(3)由于容器被重启,所以一切恢复默认初始化,此时默认的网页目录只存在Index.html,不在存在test.html。所以本次中就绪探针的httpGet进行uri的探测失败,此后期间会做出3次间隔3s的重复探测,最终均为失败。该pod则会进入NOTREADY状态,并且从所关联的service资源的端点(endpoints)中踢出,该pod将彻底称为notready状态,后面的就绪探针也就不在进行探测。

 

 

(3)启动探针的使用 

启动探针存在的必要:

有时候,会有一些现有的应用在启动时需要较长的初始化时间。 要这种情况下,若要不影响对死锁作出快速响应的探测,设置存活探测参数是要技巧的。 技巧就是使用相同的命令来设置启动探测,针对 HTTP 或 TCP 检测,可以通过将 failureThreshold * periodSeconds 参数设置为足够长的时间来应对糟糕情况下的启动时间。(因为启动探针在启动后,其他的两种探针就会进入短暂的禁用装态,于是给容器启动预留了充足的时间,保证容器中业务启动的顺利进行。而且启动探针只会启动一次,后续工作就完全交给其他两个探针,直到容器的生命周期结束)。

 

ports:
- name: liveness-port
  containerPort: 8080
  hostPort: 8080

livenessProbe:
  httpGet:
    path: /healthz
    port: liveness-port
  failureThreshold: 1
  periodSeconds: 10

startupProbe:
  httpGet:
    path: /healthz
    port: liveness-port
  failureThreshold: 30
  periodSeconds: 10

在这里,幸亏有了启动探测,应用程序将会有最多 5 分钟(30 * 10 = 300s)的时间来完成其启动过程。 一旦启动探测成功一次,存活探测任务就会接管对容器的探测,对容器死锁作出快速响应。 如果启动探测一直没有成功,容器会在 300 秒后被杀死,并且根据 restartPolicy 来执行进一步处置。

 7.Pod 容器的启动和退出动作

postStart    配置 exec.command 字段设置 Linux 命令,实现当应用容器启动时,会执行的额外操作

preStop      配置 exec.command 字段设置 Linux 命令,实现当应用容器退出时,会执行的最后一个操作

实例运用

apiVersion: v1
kind: Pod
metadata:
  name: lifecycle-demo
spec:
  containers:
  - name: lifecycle-demo-container
    image: soscscs/myapp:v1
    lifecycle:   #此为关键字段
      postStart:
        exec:
          command: ["/bin/sh", "-c", "echo Hello from the postStart handler >> /var/log/nginx/message"]      
      preStop:
        exec:
          command: ["/bin/sh", "-c", "echo Hello from the prestop handler >> /var/log/nginx/message"]
    volumeMounts:
    - name: message-log
      mountPath: /var/log/nginx/
      readOnly: false
  initContainers:
  - name: init-myservice
    image: soscscs/myapp:v1
    command: ["/bin/sh", "-c", "echo 'Hello initContainers'   >> /var/log/nginx/message"]
    volumeMounts:
    - name: message-log
      mountPath: /var/log/nginx/
      readOnly: false
  volumes:
  - name: message-log
    hostPath:
      path: /data/volumes/nginx/log/
      type: DirectoryOrCreate

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/136559.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

客观认识植物乳杆菌 (L. plantarum) 及其健康益处

人体消化系统包含大约几百到几千种不同的细菌种类&#xff0c;其丰度构成因人而异。 其中少数益生菌乳杆菌属&#xff0c;即嗜酸乳杆菌、植物乳杆菌、短乳杆菌、乳酸乳杆菌、干酪乳杆菌、保加利亚乳杆菌、发酵乳杆菌、鼠李糖乳杆菌特异性产生细胞外蛋白、胞外多糖、细菌素和脂磷…

信息安全治理-信息安全状态示例

声明 本文是学习github5.com 网站的报告而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 信息安全治理-信息安全状态示例 组织可以生成一个信息安全状态&#xff0c;并将其作为信息安全的沟通工具披露给利益相关者。 组织宜选择和决定信息安全状态的格…

Curve 分布式存储在 KubeSphere 中的实践

Curve 介绍 Curve 是网易开发的现代存储系统&#xff0c;目前支持文件存储 (CurveFS) 和块存储 (CurveBS)。现在它作为一个沙盒项目托管在 CNCF。 Curve 是一个高性能、轻量级操作、本地云的开源分布式存储系统。Curve 可以应用于 : 1) 主流云本地基础设施平台 OpenStack 和…

【Bigdata】【Java】用IDEA创建一个Maven项目时,一直卡在Generating project in Batch mode步骤

Project Scenario&#xff08;项目场景&#xff09;&#xff1a; I want to create a Maven project with IDEA to practice writing UDF functions and upload it to hdfs, so I need to initialize the maven project. &#xff08;本人想用IDEA创建一个Maven项目来练习UDF函…

Netty初探

序&#xff1a; 为什么打算写Netty 相关的博客呢&#xff1f; Netty如今已经是应用非常广泛了&#xff0c; 很多框架底层都能看到他的影子&#xff0c;如Dubbo , Spring Gateway &#xff0c; RocketMQ、Elasticsearch、HBase 等比较出名的框架&#xff0c;在性能&#xff0c;…

使用div+css实现表格布局

DIVCSS是WEB设计标准&#xff0c;它是一种网页的布局方法。与传统中通过表格&#xff08;table&#xff09;布局定位的方式不同&#xff0c;它可以实现网页页面内容与表现相分离。提起DIVCSS组合&#xff0c;还要从XHTML说起。XHTML是一种在HTML&#xff08;标准通用标记语言的…

【MySQL】【systemd】mysqld_pre_systemd 及 mysqld@.service 的 bugs

mysqld_pre_systemd 及 mysqld.service 的 bugs问题原理mysqld_pre_systemd 的 bugsmysqld.service 的 bugs测试案例重现不指定 datadir 和 log-error 的 bugs开启 SELinux &#xff0c;指定不同于默认值的自定义数据目录和错误日志位置进行测试修正方法方法一&#xff1a;向 m…

【Word】MathType 运行时错误‘53’:文件未找到:MathPage.WLL

问题描述 1. 环境&#xff1a; MathType7.4Microsoft Office 365Windows 11 2. 问题 情景1. Microsoft Word 启动时显示 Please reload Word to load MathType addin properly 情景2. 安装MathType后在 Microsoft Word 中使用复制粘贴时报错 运行时错误‘53’ 情景3. 在 M…

JavaScript 对象-三种创建对象的方式,遍历获取到对象。

JavaScript 对象-三种创建对象的方式&#xff0c;遍历获取到对象。 目录JavaScript 对象-三种创建对象的方式&#xff0c;遍历获取到对象。1. 对象1.1 什么是对象&#xff1f;1.2 为什么需要对象2. 创建对象的三种方式2.1 利用字面量创建对象2.2 利用new Object创建对象2.3 利用…

【数组】leetcode209.有序数组的平方(C/C++/Java/Js)

leetcode209.长度最小的子数组1 题目2 思路-滑动窗口3 代码3.1 C版本3.2 C版本3.3 Java版本3.4 JavaScript版本4 总结1 题目 题源链接 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl1, …, nu…

系列教程之《高铁上的GO》-第一篇

作者&#xff1a;坚果&#xff0c;OpenHarmony布道师&#xff0c;OpenHarmony校源行开源大使&#xff0c;CSDN博客专家&#xff0c;电子发烧友鸿蒙MVP&#xff0c;51CTO博客专家博主&#xff0c;阿里云博客专家。 本文主要讲解Go是什么&#xff0c;Go如何安装&#xff0c;开发G…

【Docker】(二)使用Dockerfile构建并发布一个SpringBoot服务

1.前言 在上一篇笔记 Docker基本概念与安装 中&#xff0c;我们已经获取到了一个Docker服务&#xff0c;并了解了Docker的基本组成及其各个组件的作用。 我们了解到&#xff0c;使用Docker的其中一个目的&#xff0c;是为了更加简单&#xff0c;方便的部署我们编写的服务&…

Typora下载和Markdown基础语法

本章内容如下&#xff1a; Typoar笔记下载资源及主题设置Markdown语法使用的基本方法 这篇博客一开始是为了教女朋友如何使用Typora和Markdown语法写的笔记&#xff0c;Markdown语法的内容不太全&#xff0c;只涉及基础使用。 文章目录Typora下载与主题设置Typora主题设置修改图…

在线考试答题系统的五大功能,你知道多少?

在线考试答题系统-五大功能&#xff0c;你知道多少&#xff1f;-在线考试答题系统优势&#xff1a;在线考试答题系统具有高度的可扩展性&#xff0c;高效灵活、功能强大。考试用户随时随地就可通过网络登录在线考试答题系统&#xff0c;参加在线报名、在线练习、在线考试、在线…

嵌入式开发中为什么选择C语言?它有哪些特点?

众所周知&#xff0c;C语言在嵌入式开发中占据着十分重要的地位&#xff0c;为什么嵌入式开发要选择C语言&#xff1f;嵌入式开发的方向可以分为单片机开发、Linx应用开发和现场可编辑逻辑门阵列&#xff08;FPGA)开发&#xff0c;不同于传统开发模式&#xff0c;操作系统是嵌入…

Nepnep x CatCTF Writeup

Web&#xff1a; 题目名称 ez_js 直接查看网页源代码&#xff0c;查看game.js&#xff0c;进入该目录即可得到flag Reverse&#xff1a; 题目名称 The cat did it 点进来看到一个看着很复杂的图像&#xff0c;离开的概率我猜是0% MD5加密&#xff0c;第一个即为flag Misc&am…

给在校学生的科普文:数字芯片后端工程师的日常

芯片后端设计&#xff0c;看似只是将网表中的晶体管摆放好。但并不是如同砖头砌墙那样简单粗暴。它是一门兼具形式美和工程实践需求的技术。形式美&#xff0c;直接来源于功能内容和需求&#xff0c;在后端设计的环节中&#xff0c;数以万计的标准单元如散乱的点点繁星&#xf…

2022年度穿戴设备行业分析:智能手表销额增长25%,智能手环销量下滑

当前&#xff0c;随着社会经济的发展与居民可支配收入的提高&#xff0c;居民的购买力逐渐增强&#xff0c;我国智能穿戴设备行业也得以快速发展。同时&#xff0c;随着相关技术的不断开发&#xff0c;我国智能穿戴设备行业的技术水平也持续提高。根据数据显示&#xff0c;智能…

软考中级数据库系统工程师好考吗?

数据库还好的&#xff0c;每年五月份考试&#xff0c;通过率20-30%。 数据库系统工程师&#xff0c;主要考核内容&#xff1a;数据库系统基本概念及关系理论&#xff1b;常用的大型数据库管理系统的应用技术&#xff1b;数据库应用系统的设计方法和开发过程&#xff1b;数据库系…

【C++修炼之路】12. stack queue类

每一个不曾起舞的日子都是对生命的辜负 stack&&queue一. stack的介绍和使用1. stack的介绍2. stack的使用二. stack的模拟实现三. queue的介绍和使用1. queue的介绍2. queue的使用四. queue的模拟实现五. deque的介绍和使用1. deque的介绍2. deque的使用3. deque的缺陷…