专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

不背锅运维耗时1周整理分享K8SPod知识点,带你一文打尽

  1。Pod概念热身
  Pod是一个逻辑抽象概念,K8s创建和管理的最小单元,一个Pod由一个容器或多个容器组成。特点:一个Pod可以理解为是一个应用实例Pod中容器始终部署在一个Node上Pod中容器共享网络、存储资源
  Pod主要用法:运行单个容器:最常见的用法,在这种情况下,可以将Pod看作是单个容器的抽象封装运行多个容器:边车模式(Sidecar),通过在Pod中定义专门容器,来执行主业务容器需要的辅助工作,这样好处是将辅助功能同主业务容器解耦,实现独立发布和能力重用。例如:日志收集应用监控
  扩展:READY字段的意义:tantianrantestbk8smaster:kubectlgetpodsntestaNAMEREADYSTATUSRESTARTSAGEgowebdemob9886945625sj911Running1(3m49sago)5d10h
  在READY字段中,11的意义为在这个pod里,已准备的容器一共有多少个容器。
  在pod中,它可以有3种类型的容器,分别是:基础容器(pausecontainer)初始化容器(initcontainer)普通容器(业务容器应用容器)2。POD内容器间资源共享实现机制2。1共享数据的机制emptyDir:会在Pod被删除的同时也会被删除,当Pod分派到某个节点上时,emptyDir卷会被创建,并且在Pod在该节点上运行期间,卷一直存在。就像其名称表示的那样,卷最初是空的。尽管Pod中的容器挂载emptyDir卷的路径可能相同也可能不同,这些容器都可以读写emptyDir卷中相同的文件。当Pod因为某些原因被从节点上删除时,emptyDir卷中的数据也会被永久删除。例子apiVersion:v1kind:Podmetadata:name:testpod1spec:containers:image:nginxname:nginx1volumeMounts:mountPath:cachename:cachevolumeimage:busyboxname:bs1command:〔binsh,c,sleep12h〕volumeMounts:mountPath:cachename:cachevolumevolumes:name:cachevolumeemptyDir:sizeLimit:500Micephfs:cephfs卷允许你将现存的CephFS卷挂载到Pod中,cephfs卷的内容在Pod被删除时会被保留,只是卷被卸载了。这意味着cephfs卷可以被预先填充数据,且这些数据可以在Pod之间共享。同一cephfs卷可同时被多个写者挂载。2。2共享网络的机制
  共享网络的机制是由Pause容器实现,下面慢慢分析一下,啥是pause,了解一下它的作用等等。
  先准备一个yaml文件(pod1。yaml),创建一个pod,pod里包含两个容器,一个是名为nginx1的容器,还有一个是名为bs1的容器apiVersion:v1kind:Podmetadata:name:testpod1spec:containers:image:nginxname:nginx1volumeMounts:mountPath:cachename:cachevolumeimage:busyboxname:bs1command:〔binsh,c,sleep12h〕volumeMounts:mountPath:cachename:cachevolumevolumes:name:cachevolumeemptyDir:sizeLimit:500Mi
  开始创建tantianrantestbk8smaster:kubectlcreatefpod1。yamlpodtestpod1created
  创建完后看看在哪个节点tantianrantestbk8smaster:kubectlgetpodowideNAMEREADYSTATUSRESTARTSAGEIPNODENOMINATEDNODEREADINESSGATEStestpod122Running09m21s10。244。222。44testbk8snode02nonenone
  去到对应的节点查看容器tantianrantestbk8snode02:sudodockerpsgreptestpod10db01653bdacbusyboxbinshcsleep19minutesagoUp9minutesk8sbs1testpod1defaultc3a15f703ae24a738a84d630c047d8270296972c29efenginxdockerentrypoint。9minutesagoUp9minutesk8snginx1testpod1defaultc3a15f703ae24a738a84d630c047d8270a5331fba7f11registry。aliyuncs。comgooglecontainerspause:latestpause10minutesagoUp10minutesk8sPODtestpod1defaultc3a15f703ae24a738a84d630c047d8270tantianrantestbk8snode02:
  通过查看容器,名为testpod1的pod里,除了两个业务容器外(k8sbs1testpod1、nginx1testpod1),还有一个pause容器。这个到底是什么鬼呢?
  对pause容器的理解pause容器又叫Infracontainer,就是基础设施容器的意思,Infracontainer只是pause容器的一个叫法而已上面看到paus容器,是从registry。aliyuncs。comgooglecontainerspause:latest这个镜像拉起的在其中一台node节点上查看docker镜像,可看到该镜像的大小是240KBregistry。aliyuncs。comgooglecontainerspauselatest350b164e7ae18yearsago240kB根据理解,画了图:
  nginx1容器里的nginx组件默认监听的端口是80,在bs1容器里去curlhttp:127。0。0。1就可以放到nginx1容器的80端口。step1:查看testpod1里的容器kubectlgetpodstestpod1ojsonpath{。spec。containers〔〕。name}step2:进入指定容器kubectlexecittestpod1cbs1sh访问nginx(因没有curl命令,此处用wget)wgethttp:127。0。0。1Connectingto127。0。0。1(127。0。0。1:80)savingtoindex。htmlindex。html1006150:00:00ETAindex。htmlsaved
  上面看到,使用wget命令下载到了index。html文件,说明访问成功。3。Pod常用管理命令查看pod里所有容器的名称kubectlgetpodstestpod1ojsonpath{。spec。containers〔〕。name}进入pod里的指定容器的终端,如下进入pod为testpod1里的容器nginx1和bs1kubectlexecittestpod1cnginx1bashkubectlexecittestpod1cbs1sh查看pod里指定容器的logkubectllogstestpod1cnginx14。Pod的重启策略应用健康检查(应用自修复)
  重启策略Always:当容器终止退出,总是重启容器,默认策略OnFailure:当容器异常退出(退出状态码非0)时,才重启容器Never:当容器终止退出,从不重启容器
  查看pod的重启策略查看pod,以yaml格式输出kubectlgetpodstestpod1oyaml找到restartPolicy字段,就是重启策略restartPolicy:Always
  健康检查有以下3种类型:
  健康检查是检查容器里面的服务是否正常livenessProbe(存活探测):如果检查失败,将杀死容器,根据pod的restartPolicy来操作。readinessProbe(就绪探测):如果检查失败,k8s会把Pod从serviceendpoints中剔除startupProbe(启动探测):检查成功才由存活检查接手,用于保护慢启动容器
  支持以下三种检查方法:httpGet:发起HTTP请求,返回200400范围状态码为成功。exec:执行Shell命令返回状态码是0为成功。tcpSocket:发起TCPSocket建立成功。
  案例实战
  livenessProbe(存活探针):使用exec的方式(执行Shell命令返回状态码是0则为成功)apiVersion:v1kind:Namespacemetadata:name:testaapiVersion:appsv1kind:Deploymentmetadata:name:gowebdemonamespace:testaspec:replicas:10selector:matchLabels:app:gowebdemotemplate:metadata:labels:app:gowebdemospec:containers:name:gowebdemoimage:192。168。11。247webdemogowebdemo:20221229v3livenessProbe:exec:command:lsoptgowebdemorunserverinitialDelaySeconds:5periodSeconds:5apiVersion:v1kind:Servicemetadata:name:gowebdemonamespace:testaspec:ports:port:80protocol:TCPtargetPort:8090selector:app:gowebdemotype:NodePort
  periodSeconds字段指定了kubelet应该每5秒执行一次存活探测,initialDelaySeconds字段告诉kubelet在执行第一次探测前应该等待5秒,kubelet在容器内执行命令lsoptgowebdemorunserver来进行探测。如果命令执行成功并且返回值为0,kubelet就会认为这个容器是健康存活的。如果这个命令返回非0值,kubelet会杀死这个容器并重新启动它。
  验证存活检查的效果查看某个pod的里的容器,kubectlgetpodsgowebdemo686967fd56556m9ntestaojsonpath{。spec。containers〔〕。name}进入某个pod里的容器kubectlexecitgowebdemo686967fd56556m9cgowebdemontestabash进入容器后,手动删除掉runserver可执行文件,模拟故障rmrfoptgowebdemorunserver查看Pod详情(在输出结果的最下面,有信息显示存活探针失败了,这个失败的容器被杀死并且被重建了。)kubectldescribepodgowebdemo686967fd56556m9ntestaEvents:TypeReasonAgeFromMessageWarningUnhealthy177m(x6over3h59m)kubeletLivenessprobefailed:ls:cannotaccessoptgowebdemorunserver:Nosuchfileordirectory一旦失败的容器恢复为运行状态,RESTARTS计数器就会增加1tantianrantestbk8smaster:kubectlgetpodsntestaNAMEREADYSTATUSRESTARTSAGEgowebdemo686967fd56556m911Running1(22sago)13mRESTARTS字段加1,gowebdemo686967fd568hzjb11Running013m。。。
  livenessProbe(存活探针):使用httpGet请求的方式检查uripath是否正常apiVersion:v1kind:Namespacemetadata:name:testaapiVersion:appsv1kind:Deploymentmetadata:name:gowebdemonamespace:testaspec:replicas:10selector:matchLabels:app:gowebdemotemplate:metadata:labels:app:gowebdemospec:containers:name:gowebdemoimage:192。168。11。247webdemogowebdemo:20221229v3livenessProbe:httpGet:path:loginport:8090httpHeaders:name:CustomHeadervalue:AwesomeinitialDelaySeconds:3periodSeconds:3apiVersion:v1kind:Servicemetadata:name:gowebdemonamespace:testaspec:ports:port:80protocol:TCPtargetPort:8090selector:app:gowebdemotype:NodePort
  在这个配置文件中,你可以看到Pod也只有一个容器。periodSeconds字段指定了kubelet每隔3秒执行一次存活探测。initialDelaySeconds字段告诉kubelet在执行第一次探测前应该等待3秒。kubelet会向容器内运行的服务(服务在监听8090端口)发送一个HTTPGET请求来执行探测。如果服务器上login路径下的处理程序返回成功代码,则kubelet认为容器是健康存活的。如果处理程序返回失败代码,则kubelet会杀死这个容器并将其重启。返回大于或等于200并且小于400的任何代码都表示成功,其它返回代码都表示失败。
  验证效果进入容器删除静态文件,模拟故障kubectlexecitgowebdemo586ff85ddb4646kcgowebdemontestabashrmrflogin。html查看pod的logkubectllogsgowebdemo586ff85ddb4646kntesta2023011206:45:19〔Recovery〕2023011206:45:19panicrecovered:GETloginHTTP1。1Host:10。244。222。5:8090Connection:closeAccept:Connection:closeCustomHeader:AwesomeUserAgent:kubeprobe1。25htmltemplate:login。htmlisundefinedrootmyworkspacepkgmodgithub。comgingonicginv1。8。2context。go:911(0x8836d1)rootmyworkspacepkgmodgithub。comgingonicginv1。8。2context。go:920(0x88378c)rootmyworkspacesrcgowebdemomain。go:10(0x89584e)查看pod详情kubectldescribepodgowebdemo586ff85ddb4646kntestaWarningUnhealthy34s(x3over40s)kubeletLivenessprobefailed:HTTPprobefailedwithstatuscode:500状态码为500恢复后查看Pod,RESTARTS计数器已经增1kubectlgetpodgowebdemo586ff85ddb4646kntestaNAMEREADYSTATUSRESTARTSAGEgowebdemo586ff85ddb4646k11Running1(80sago)5m39s
  readinessProbe(就绪探针)结合livenessProbe(存活探针)探测tcp端口:
  第三种类型的存活探测是使用TCP套接字。使用这种配置时,kubelet会尝试在指定端口和容器建立套接字链接。如果能建立连接,这个容器就被看作是健康的,如果不能则这个容器就被看作是有问题的。apiVersion:v1kind:Namespacemetadata:name:testaapiVersion:appsv1kind:Deploymentmetadata:name:gowebdemonamespace:testaspec:replicas:10selector:matchLabels:app:gowebdemotemplate:metadata:labels:app:gowebdemospec:containers:name:gowebdemoimage:192。168。11。247webdemogowebdemo:20221229v3readinessProbe:tcpSocket:port:8090initialDelaySeconds:5periodSeconds:10livenessProbe:tcpSocket:port:8090initialDelaySeconds:15periodSeconds:20apiVersion:v1kind:Servicemetadata:name:gowebdemonamespace:testaspec:ports:port:80protocol:TCPtargetPort:8090selector:app:gowebdemotype:NodePort
  TCP检测的配置和HTTP检测非常相似。这个例子同时使用就绪和存活探针。kubelet会在容器启动5秒后发送第一个就绪探针。探针会尝试连接gowebdemo容器的8090端口。如果探测成功,这个Pod会被标记为就绪状态,kubelet将继续每隔10秒运行一次探测。除了就绪探针,这个配置包括了一个存活探针。kubelet会在容器启动15秒后进行第一次存活探测。与就绪探针类似,存活探针会尝试连接gowebdemo容器的8090端口。如果存活探测失败,容器会被重新启动。
  验证效果进入容器后,杀掉gowebdemo的进程kubectlexecitgowebdemo5d7d55f846vm2kccgowebdemontestabashrootgowebdemo5d7d55f846vm2kc:optgowebdemopsauxUSERPIDCPUMEMVSZRSSTTYSTATSTARTTIMECOMMANDroot10。00。02476576?Ss07:230:00binshcoptgowebdemorunserverrootgowebdemo5d7d55f846vm2kc:optgowebdemokill91查看pod详情,已经发出警告kubectldescribepodgowebdemo5d7d55f846vm2kcntestaWarningUnhealthy16skubeletReadinessprobefailed:dialtcp10。244。240。48:8090:connect:connectionrefusedWarningBackOff16skubeletBackoffrestartingfailedcontainer查看pod,RESTARTS计数器已经增加为2,因为有两个探针tantianrantestbk8smaster:kubectlgetpodntestaNAMEREADYSTATUSRESTARTSAGEgowebdemo5d7d55f846vm2kc11Running2(2m55sago)12m
  使用startupProbe(启动探针)保护慢启动容器
  有一种情景是这样的,某些应用在启动时需要较长的初始化时间。要这种情况下,若要不影响对死锁作出快速响应的探测,设置存活探测参数是要技巧的。技巧就是使用相同的命令来设置启动探测,针对HTTP或TCP检测,可以通过将failureThresholdperiodSeconds参数设置为足够长的时间来应对糟糕情况下的启动时间。apiVersion:v1kind:Namespacemetadata:name:testaapiVersion:appsv1kind:Deploymentmetadata:name:gowebdemonamespace:testaspec:replicas:10selector:matchLabels:app:gowebdemotemplate:metadata:labels:app:gowebdemospec:containers:name:gowebdemoimage:192。168。11。247webdemogowebdemo:20221229v3livenessProbe:httpGet:path:loginport:8090failureThreshold:1periodSeconds:10startupProbe:httpGet:path:loginport:8090failureThreshold:30periodSeconds:10apiVersion:v1kind:Servicemetadata:name:gowebdemonamespace:testaspec:ports:port:80protocol:TCPtargetPort:8090selector:app:gowebdemotype:NodePort
  上面的例子,应用程序将会有最多5分钟(3010300s)的时间来完成其启动过程。一旦启动探测成功一次,存活探测任务就会接管对容器的探测,对容器死锁作出快速响应。如果启动探测一直没有成功,容器会在300秒后被杀死,并且根据restartPolicy来执行进一步处置。5。环境变量
  创建Pod时,可以为其下的容器设置环境变量。通过配置文件的env或者envFrom字段来设置环境变量。
  应用场景:容器内应用程序获取pod信息容器内应用程序通过用户定义的变量改变默认行为
  变量值定义的方式:自定义变量值变量值从Pod属性获取变量值从Secret、ConfigMap获取
  下面来个小例子,设置自定义变量,使用env给pod里的容器设置环境变量,本例子中,设置了环境变量有SAVETIME、MAXCONN、DNSADDR。apiVersion:v1kind:Podmetadata:name:testenvdemospec:containers:name:testenvdemocontainerimage:192。168。11。247webdemogowebdemo:20221229v3env:name:SAVETIMEvalue:60name:MAXCONNvalue:1024name:DNSADDRvalue:8。8。8。8
  开始创建podtantianrantestbk8smaster:kubectlcreateftestenv。yamlpodtestenvdemocreatedtantianrantestbk8smaster:
  创建后,验证环境变量是否能获取到使用printenv打印环境变量tantianrantestbk8smaster:gowebdemokubectlexectestenvdemoprintenvPATHgobin:usrlocalgobin:usrlocalsbin:usrlocalbin:usrsbin:usrbin:sbin:binHOSTNAMEtestenvdemoSAVETIME60这个是MAXCONN1024这个是DNSADDR8。8。8。8这个是KUBERNETESSERVICEHOST10。96。0。1KUBERNETESSERVICEPORT443KUBERNETESSERVICEPORTHTTPS443KUBERNETESPORTtcp:10。96。0。1:443KUBERNETESPORT443TCPtcp:10。96。0。1:443KUBERNETESPORT443TCPPROTOtcpKUBERNETESPORT443TCPPORT443KUBERNETESPORT443TCPADDR10。96。0。1GOLANGVERSION1。19。4GOPATHgoHOMEroottantianrantestbk8smaster:gowebdemo进入容器打印环境变量tantianrantestbk8smaster:gowebdemokubectlexecittestenvdemoctestenvdemocontainerbashroottestenvdemo:optgowebdemoechoSAVETIME单独打印一个60roottestenvdemo:optgowebdemoenv执行env命令查看KUBERNETESSERVICEPORTHTTPS443KUBERNETESSERVICEPORT443HOSTNAMEtestenvdemoPWDoptgowebdemoDNSADDR8。8。8。8HOMErootKUBERNETESPORT443TCPtcp:10。96。0。1:443MAXCONN1024GOLANGVERSION1。19。4TERMxtermSHLVL1KUBERNETESPORT443TCPPROTOtcpKUBERNETESPORT443TCPADDR10。96。0。1SAVETIME60KUBERNETESSERVICEHOST10。96。0。1KUBERNETESPORTtcp:10。96。0。1:443KUBERNETESPORT443TCPPORT443PATHgobin:usrlocalgobin:usrlocalsbin:usrlocalbin:usrsbin:usrbin:sbin:binGOPATHgousrbinenvroottestenvdemo:optgowebdemo
  再来个小例子,直接取pod的属性作为变量的值,下面的例子是拿到pod所处的节点名称apiVersion:v1kind:Podmetadata:name:testenvdemospec:containers:name:testenvdemocontainerimage:192。168。11。247webdemogowebdemo:20221229v3env:name:NODENAMEvalueFrom:fieldRef:fieldPath:spec。nodeName
  打印变量tantianrantestbk8smaster:kubectlexectestenvdemoprintenvPATHgobin:usrlocalgobin:usrlocalsbin:usrlocalbin:usrsbin:usrbin:sbin:binHOSTNAMEtestenvdemoNODENAMEtestbk8snode02NODENAME变量,值为testbk8snode02KUBERNETESPORTtcp:10。96。0。1:443KUBERNETESPORT443TCPtcp:10。96。0。1:443KUBERNETESPORT443TCPPROTOtcpKUBERNETESPORT443TCPPORT443KUBERNETESPORT443TCPADDR10。96。0。1KUBERNETESSERVICEHOST10。96。0。1KUBERNETESSERVICEPORT443KUBERNETESSERVICEPORTHTTPS443GOLANGVERSION1。19。4GOPATHgoHOMEroot
  再来最后一个例子,使用容器字段作为环境变量的值,这个例子设置了资源限制的字段requests和limits,在设置环境变量中,使用资源限制的值作为了变量的值。apiVersion:v1kind:Podmetadata:name:testenvdemospec:containers:name:testenvdemocontainerimage:192。168。11。247webdemogowebdemo:20221229v3resources:requests:memory:32Micpu:125mlimits:memory:64Micpu:250menv:name:CPUREQUESTvalueFrom:resourceFieldRef:containerName:testenvdemocontainerresource:requests。cpuname:CPULIMITvalueFrom:resourceFieldRef:containerName:testenvdemocontainerresource:limits。cpuname:MEMREQUESTvalueFrom:resourceFieldRef:containerName:testenvdemocontainerresource:requests。memoryname:MEMLIMITvalueFrom:resourceFieldRef:containerName:testenvdemocontainerresource:limits。memory
  打印变量tantianrantestbk8smaster:kubectlexectestenvdemoprintenvPATHgobin:usrlocalgobin:usrlocalsbin:usrlocalbin:usrsbin:usrbin:sbin:binHOSTNAMEtestenvdemoMEMREQUEST33554432MEMLIMIT67108864CPUREQUEST1CPULIMIT1KUBERNETESSERVICEPORTHTTPS443KUBERNETESPORTtcp:10。96。0。1:443KUBERNETESPORT443TCPtcp:10。96。0。1:443KUBERNETESPORT443TCPPROTOtcpKUBERNETESPORT443TCPPORT443KUBERNETESPORT443TCPADDR10。96。0。1KUBERNETESSERVICEHOST10。96。0。1KUBERNETESSERVICEPORT443GOLANGVERSION1。19。4GOPATHgoHOMEroot6。initcontainer(初始化容器)
  初始化容器的特点:Init容器是一种特殊容器,在Pod内,会在应用容器启动之前运行。如果Pod的Init容器失败,kubelet会不断地重启该Init容器,直到该容器成功为止。如果Pod对应的restartPolicy值为Never,并且Pod的Init容器失败,则Kubernetes会将整个Pod状态设置为失败。如果为一个Pod指定了多个Init容器,这些容器会按顺序逐个运行。每个Init容器必须运行成功,下一个才能够运行。Init容器不支持探针,包括lifecycle、livenessProbe、readinessProbe和startupProbe
  在实际工作中,可利用它的这种工作机制应对某些场景,比如在应用容器启动之前,需要做一些初始化相关的工作,比如初始化配置文件,测试IP或端口的连通性等等场景。
  下面来个小例子,场景是这样的,我的应用容器是gowebdemo,初始化容器是initcheckmysqlip,假设应用容器是依赖数据库的,如果数据库没起来,那么应用容器就算起来了也是服务不可用。所以,现在的主要目的是想在应用容器启动之前检查mysql服务器的IP地址是否可ping通,如果是通的才启动应用容器。这个例子应该是比较贴近实际场景了。下面,看我写好的yaml:apiVersion:v1kind:Namespacemetadata:name:testaapiVersion:appsv1kind:Deploymentmetadata:name:gowebdemonamespace:testaspec:replicas:3selector:matchLabels:app:gowebdemotemplate:metadata:labels:app:gowebdemospec:containers:name:gowebdemoimage:192。168。11。247webdemogowebdemo:20221229v3initContainers:name:initcheckmysqlipimage:192。168。11。247osbusybox:latestcommand:〔sh,c,ping192。168。11。248c5〕apiVersion:v1kind:Servicemetadata:name:gowebdemonamespace:testaspec:ports:port:80protocol:TCPtargetPort:8090selector:app:gowebdemotype:NodePort
  mysql服务器故意没拉起,看看效果:tantianrantestbk8smaster:gowebdemokubectlgetpodsntestaNAMEREADYSTATUSRESTARTSAGEgowebdemo859cc77bd5jpcfs01Init:012(18sago)48sgowebdemo859cc77bd5n8hqd01Init:012(17sago)48sgowebdemo859cc77bd5sns6701Init:012(17sago)48stantianrantestbk8smaster:gowebdemotantianrantestbk8smaster:gowebdemokubectlgetpodsntestaNAMEREADYSTATUSRESTARTSAGEgowebdemo859cc77bd5jpcfs01Init:Error4(67sago)2m44sgowebdemo859cc77bd5n8hqd01Init:Error4(66sago)2m44sgowebdemo859cc77bd5sns6701Init:Error4(67sago)2m44stantianrantestbk8smaster:gowebdemotantianrantestbk8smaster:gowebdemokubectlgetpodsntestaNAMEREADYSTATUSRESTARTSAGEgowebdemo859cc77bd5jpcfs01Init:CrashLoopBackOff3(34sago)2m11sgowebdemo859cc77bd5n8hqd01Init:CrashLoopBackOff3(33sago)2m11sgowebdemo859cc77bd5sns6701Init:CrashLoopBackOff3(34sago)2m11stantianrantestbk8smaster:gowebdemo
  观察STATUS字段发现,它经历了3个阶段,第一阶段是正常的运行,也就是执行ping检查的操作,因为死活Ping不同,所以进入了第二阶段,状态为Error。紧接着是第三阶段,状态变成了CrashLoopBackOff,对于这个状态,我的理解是,初始化容器运行失败了,准备再次运行。总而言之,如果Mysql服务器的IP死活ping不通,它就会的状态就会一直这样:运行ErrorCrashLoopBackOff。当然这种情况是当Pod对应的restartPolicy为Always(这是默认策略)才会这样不断的循环检查,如果Pod对应的restartPolicy值为Never,并且Pod的Init容器失败,则Kubernetes会将整个Pod状态设置为失败。
  当我把mysql服务器启动后,初始化容器执行成功,那么应用容器也就成功起来了:tantianrantestbk8smaster:gowebdemokubectlgetpodsntestaNAMEREADYSTATUSRESTARTSAGEgowebdemo859cc77bd5jpcfs11Running030mgowebdemo859cc77bd5n8hqd11Running030mgowebdemo859cc77bd5sns6711Running030mtantianrantestbk8smaster:gowebdemo7。静态pod
  在实际工作中,静态Pod的应用场景是毕竟少的,几乎没有。不过也还是得对它做一个简单的了解。静态Pod在指定的节点上由kubelet守护进程直接管理,不需要API服务器监管。与由控制面管理的Pod(例如,Deployment)不同;kubelet监视每个静态Pod(在它失败之后重新启动),静态Pod始终都会绑定到特定节点的Kubelet上。
  在每个node节点上,kubelet的守护进程会自动在etckubernetesmanifests路径下发现yaml,因此,如果想要创建静态Pod,就得把yaml放到该目录,下面我们直接实战一下。
  随便登录到某台node节点,然后创建etckubernetesmanifestsstaticpod。yamlapiVersion:v1kind:Podmetadata:name:teststaticpodspec:containers:name:testcontainerimage:192。168。11。247webdemogowebdemo:20221229v3
  创建后,回到master节点上查看podtantianrantestbk8smaster:kubectlgetpodNAMEREADYSTATUSRESTARTSAGEteststaticpodtestbk8snode0111Running011s
  通过上面的输出结果可以看到,该静态pod已经在节点testbk8snode01上面正常运行了,说明kubelet守护进程已经自动发现并创建了它。你可能会问,它不是不需要API服务器监管吗?为啥在master节点能看到它?因为kubelet会尝试通过KubernetesAPI服务器为每个静态Pod自动创建一个镜像Pod,这意味着节点上运行的静态Pod对API服务来说是可见的,但是不能通过API服务器来控制。且Pod名称将把以连字符开头的节点主机名作为后缀。
  本文转载于(喜欢的盆友关注我们):https:mp。weixin。qq。coms5Kv7DU34Ae5y17MAQVOQ

当一个人这样回复你,心里不会拒绝你的爱爱情是非常珍贵的,在很多时候我们一定要知道该如何去考虑不要总是想太多,有些时候就是这样子的,你想的太多是没有用的也不一定能够解决问题,所以有些事我们要明白。男女之间有时候看起来没有天下文章艾在人间自拍(冬日暖阳)天下是所有人的天下,非一己或一撮人的天下。文章虽表达的是个人的心声,但输出的却不应仅仅是个人的三观(价值观,道德观与人生观)。真的文章,敢于正视残酷的现实,6种生命形态,碳基生命仅排第三,排名第一的硅基生命有多可怕?综述关于宇宙中所生存的生命形态,你了解几种?生命,是一个近乎奇迹般的存在。由不同物质所产生反应,地球在漫长的时间进化中出现了原始的生命。以碳元素为基础,地球上诞生了多种多样的碳基生真的有外星生命吗外星生命,指存在于地球以外的生命体。这个概念囊括了简单的细菌到具有高度智慧的外星人。研究和测试关于外星生命猜想的学科被称作地外生物学或天体生物学(从天文视角研究地球生命也属于天体生新发现两颗超级地球!距我们仅15。8光年,唯一担心的是早有生命既然太阳拥有行星,那宇宙中其他的恒星也很可能拥有自己的行星,虽然这是一种很合理的推测,但想要找到其他恒星的行星却不容易,如果将一颗恒星比作一座闪亮的灯塔,那它的行星就大概是灯塔下的生命本就脆弱和不完美生命本就脆弱和不完美,我们生于尘埃,终归于尘埃。我们拥有的和我们缺失的,令我欢喜的,令我们无奈的,都是生命本质。美丽财富就智慧年老成熟和孩子气都是正当的,而且这就是世界。所有我们身人到中年不得不苟且,流浪的独孤老狼书写平凡中的不平凡为什么叫自己流浪的独孤老狼而不是流浪的孤独老狼?从孤独到独孤,不单是语序和上口,境界气势立现。孤独是longly,独孤是along孤独是自怨自艾,独孤是我自横刀孤独是为人人为我,独付过千般爱,莫生千般恨情感点评大赏一个人分手后的三个十年再三次被曾经的恋人伤害,那决不是愚蠢愚昧无知,而是病入膏肓无可救药。世间有一通百病的药方,却难寻千方能治的情伤。天意缘来缘尽就让它灰飞烟灭,付出千浴冰重生来自一个标本的自白传说,凤凰是人世间幸福的使者。每五百年,它就要背负着积累于人世间的所有不快和仇恨恩怨,投身于熊熊烈火中自焚,以生命的美丽终结换取人世的祥和与幸福。在肉体经受了巨大的痛苦和轮回后它们故乡的年味(一)娱兔迎春曾经仗剑走天涯,去看一看世界的繁华不知不觉离开家乡已经多年,从青葱岁月的求学时代开始,当时觉得很开心离开家乡,一直以为自己会成功,头也不回便离开了故乡。当时的心情就觉得未来连续7天超1亿元!这里的免税店,又火了!12月初,海南省启动了为期两个月的海南离岛免税跨年狂欢季,通过抽奖打折满减等方式,全面促消费。全球精品(海口)免税城有限公司总经理助理刘加我们联合航司机场渠道合作伙伴,向广大旅客发
立冬冬天藏精,就是在打底养根基原创惠娴少点盐插画莉香早上好时间过得好快,这次相见,已经是立冬了。古籍里说,立冬是冬天的开始,万物开始沉寂起来,世界变得安静寂寞。但其实,静谧的世界里,那些活泼的小生命并没有消失。冬季养生的正确打开方式!古人认可的养生好物,赶快收藏冬季养生的正确打开方式!古人认可的养生好物,赶快收藏养生需要吃的东西,也不一定就是什么昂贵的补品,大家常见的水果就是一种很好的养生食品,水果不仅味道好,营养含量还很丰富,是很适合养冬天已经到来,老年人要多吃这2样,滋补养生,增强体质冬天已经到来,老年人要多吃这2样,滋补养生,增强体质,这方面不要省钱冬天的脚步已经到来,温度一天比一天低,这个时候就要开始注意保暖,否则风寒感冒可能很快就会找上门。现在市面上的食材辟谣丨宝宝长了血管瘤,都是因为妈妈在孕期玩手机?最近有位妈妈带孩子就诊时,说孩子一出生脸上就有血管瘤,家里一直在埋怨自己,说是自己孕期玩手机导致的。自己也很自责,非常后悔怀孕时天天玩手机。那么,孩子长血管瘤是因为妈妈怀孕期间一直肺好百病消,教你3招养好肺,冬天少生病秋季是呼吸道疾病的高发季节,这主要与秋天干燥的气候有关,燥气入体,各种疾病也随之而来。其实,从中医的角度来看,秋天是养肺的黄金季节,肺养好了,自然抵御疾病的力量就增强了,所以今天跟学不来某宝上的jennie同款?今年冬天的围巾才是关键冬天到了,大家的衣服都慢慢转向了温暖舒适的类型。前一阵Jennie的机场穿搭大家看到没?这一身浅灰休闲运动服尽显慵懒松弛要说平时各位爱豆都是走在时尚前端,穿搭更是引领潮流。但是实际痛风患者吃洋葱,究竟是缓解病情还是加重病情?你要弄清楚了痛风,是很多人都不愿意多接触的一种慢性病,但这并不是你不想就不会得的疾病。据中国高尿酸血症与痛风诊疗指南(2021年)显示的调查数据,在2022年我国痛风患病率已超过1500万,是今日立冬哈尔滨市第一医院专家提醒学了这份冬藏养生之道让你冬季阳气十足立,建始也冬,终也,万物收藏也。今日11月7日,我们迎来了24节气中的第19个节气立冬,民间习惯把这一时间作为冬季的开始。春种夏耕秋收冬藏,万物在春天萌生,夏天滋长,秋天收获,在冬糖尿病患者居然会有严重低血糖?糖尿病患者居然会发生严重低血糖,你相信吗?看到这个很多人都觉得不可能,这肯定是搞错了!毕竟在大众的认知里,对糖尿病的普遍印象就是高血糖,并且需要各种方式控制糖。更别提估计不少人认识穴位养生快来按摩阳池穴,帮你扫光手脚寒气阳池穴出自针灸甲乙经,是手少阴三焦经的穴位,被称为三焦经源,本穴物质为阳热之气,性干燥,表现出三焦经气血的本源特性,故为三焦经原穴。阳,天部阳气也。池,屯物之器也。该穴名意指三焦经到浙江,感受数智化力量自始发于上世纪中叶的第三次科学技术革命后,各国经济发展水平乃至整个人类文明的进程,仿佛都在各式各样层出不穷的新兴技术的推动下走上了快车道而当以区块链5G物联网等革命性技术所代表的数
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网