kubernetes资源清单 - initC

Pod 能够具有多个容器,应用运行在容器里面,每一个容器可能有一个或者多个先于容器启动的 init 容器。


Init 容器与普通容器的区别:

  • ​ Init 容器总是运行到成功完成为止。
  • ​ 每个 Init 容器都必须在下一个 Init 容器启动之前成功完成。

如果init C 容器启动失败,则不会到达 Main C 状态

如果 Pod 的 init 容器初始失败,kubernetes会不断地重启该 Pod,直到 Init 容器成功为止。

如果 Pod 对应的策略 restartPolicy 为 Never,它就不会重新启动。


Init 容器作用

确保Main C 容器的安全性、冗余性。

  1. 在主容器被创建之前,需要有一些文件被创建,需要准备好一些数据,但是这些数据或文件的创建工具,加载到 Main C 之后会造成Main C容器的冗余、资源重复,随着工具越来越多会出现资源的严重浪费。
  2. 所以将这些基础的配置文件,工具写入到 Init C 容器,让他在初始化的过程中帮助 Main C 将所用的文件数据提前创建出来。这样可以最大化利用 Pod 内部资源。
  3. Init 容器通过 Namespace,将 Main C容器所需要的文件,通过 Init C来进行访问下载读取,直接将初始化的文件传给Main C ,保证安全性。
  4. Init C 可以探测 Main C 容器是否成功启动。

一、 Init 容器模板

1、运行一个Pod,Pod中有一个 Main C 容器,为这个容器初始化两个 Init C 容器。
Init C 容器执行命令 解析 myservice、mydb。由于没有这两个域名肯定是初始化失败的

apiVersion: v1
kind: Pod			
metadata: 
  name: myapp-pod 		#Pod 名称
  labels: 			#Pod 标签
    app: myapp
spec:				#Pod内的详细信息
  containers: 			#Pod内的第一个容器
   - name: myapp-container	#第一个容器的名称
     image: busybox		#第一个容器所使用的镜像
     command: ['sh','-c','echo The app is running !; sleep 3600']
  initContainers:		#在为第一个容器赋予初始化时,可以在下面添加一个 initcontainers进行初始化
   - name: init-myservice	#第一个初始化容器名称
     image: busybox		#容器镜像
     command: ['sh','-c','until nslookup myservice; do echo waiting for myservice; sleep 2; done;']
   - name: init-mydb		#第二个初始化容器名称
     image: busybox		#容器镜像
     command: ['sh','-c','until nslookup mydb;do echo waiting for mydb; sleep 2; done;']

kubectl create -f init-pod.yaml 运行Pod容器剧本

kubectl get pod 查看Pod容器启动状态


2、创建myservice.yaml文件,让Init C 容器可以成功解析

kind: Service
apiVersion: v1
metadata: 
 name: myservice

spec:
 ports:
   - protocol: TCP
     port: 80
     targetPort: 9376

kubectl create -f myservice.yaml


3、创建mydb.yaml文件,让Init C文件可以成功解析

kind: Service
apiVersion: v1
metadata: 
 name: mydb

spec: 
 ports: 
  - protocol: TCP
    port: 80
    targetPort: 9377

kubectl create -f mydb.yaml

kubectl get pod 查看最终运行效果

在这里插入图片描述


探针

​ 探针是由 kubelet 对容器执行的定期诊断。要执行诊断,kubelect 调用由容器实现的 处理程序。功三种类型的处理程序:

  1. ExecAction:在容器内执行指定命令。如果命令返回码为0则成功,非0都不成功
  2. TCPSocketAction:在对指定端口上的容器的IP地址进行TCP检查。如果端口打开,则诊断被认为是成功的。
  3. HTTPGetAction:对指定端口和路径上的容器的IP地址执行 HTTP Get请求。如果响应的状态码大于等于200,且小于400,则诊断被认为是成功的。
探针结果:
  • 成功:容器通过了诊断
  • 失败:容器未通过诊断
  • 未知:诊断失败,不会采取任何操作
探测方式:
  1. livenessProbe:指示容器是否在运行。如果存活探测失败,则 kubelet 会杀死容器,并且容器将受到其 重启策略 的影响。如果容器不提供存活探针,则默认状态为 Success。
  2. readinessProbe:指示容器是否准备好服务请求。如果就绪探测失败,端点控制器将从与 Pod 匹配的所有 Service 的端点种删除该 Pod 的IP地址。初始延迟之前的就绪状态默认为 Failure。如果容器不提供就绪探针, 则默认状态为
    success。


二、检测探针-就绪检测

readinessProbe-httpget

vim read.yaml

apiVersion: v1
kind: Pod				#Pod
metadata: 				#Pod信息
  name: readiness-httpget-pod		#Pod名字
  namespace: default			#指定名称空间
spec:					#容器描述
  containers: 				#容器
    - name: readiness-httpget-container	#容器名字
      image: httpd:latest		#容器使用镜像
      imagePullPolicy: IfNotPresent 	#镜像下载策略,如果有则不下载
      readinessProbe:  			#就绪检测,绑定在每一个容器之下
        httpGet: 			#检测方案httpGet
          port: 80			#检测端口
          path: /index1.html		#检测页面
        initialDelaySeconds: 1		#检测延时,容器创建后延时几秒开启检测
        periodSeconds: 3   		#重试检测时间,检测3秒后继续检测

1、执行资源就绪检测剧本 虽然 STATUS 为 Running,但是READY处于没有就绪状态
kubectl create -f read.yaml

kubectl get pod
在这里插入图片描述

2、检测详细的Pod运行信息,发现检测的页面结果为 404 ,所以启动不了

kubectl describe pod readiness-httpget-pod

在这里插入图片描述

3、所以进入该容器,让它符合检测条件,手动创建一个 index1.html

kubectl exec readiness-httpget-pod -it – /bin/bash
echo “1111” > htdocs/index1.html

exec:进入Pod
readiness-httpget-pod:Pod名称
-c:指定Pod中的某一个容器
-it: 开启一个终端
-- /bin/bash:以什么环境进行容器

4、最后验证,kubectl get pod
在这里插入图片描述

三、检测探针 -存活检测

1、livenessProbe - exec

vim live-exec.yaml

apiVersion: v1
kind: Pod				#Pod
metadata: 				#Pod信息
  name: liveness-exec-pod		#Pod名称
  namespace: default			#Pod名称空间
spec:					#Pod内容器信息
  containers: 				#容器信息
   - name: liveness-exec-container	#容器名字
     image: busybox:latest		#容器使用镜像
     imagePullPolicy: IfNotPresent	#如果存在则不进行下载
     command: ["/bin/sh","-c","touch /tmp/live ; sleep 60 ; rm -rf /tmp/live ; sleep 3600"]								   #创建一个文件,60秒后将其删除,再休眠6分钟
     livenessProbe: 			#存活检测,绑定在每一个容器之下
     	exec: 			
     	  command: ["test","-e","/tmp/live"]	#命令检测文件,如果存在返回0,不存在返回非0。
     	initialDelaySeconds: 1		#检测延时,容器创建后延时几秒开启检测
        periodSeconds: 3   		#重试检测时间,检测3秒后继续检测

kubectl create -f live-exec.yaml

kubectl get pod -w 实时检测Pod容器状态,发现每过60秒就要重启重新创建一个新的Pod,因为liveness检测会干掉错误 Pod ,所以会不断的重启,每创建60秒又会删掉/tmp/live,然后再次重新创建
在这里插入图片描述

2、livenessProbe-httpget

vim live-httpget.yaml

apiVersion: v1
kind: Pod 				#Pod单元
metadata: 				#Pod信息
 name: liveness-httpget-pod		#Pod名称 
 namespace: default			#Pod存在的命名空间
spec: 					#Pod内信息
 containers: 				#容器信息
   - name: liveness-httpget-container	#容器名字
     image: httpd:latest		#容器镜像
     imagePullPolicy: IfNotPresent	#镜像下载策略
     ports: 				#容器使用端口
      - name: http			#端口名称http,方便liveness检测
        containerPort: 80		#使用80端口
     livenessProbe: 			#存活检测
        httpGet: 			#检测策略 HTTPGet
          port: http			#检测端口 http
          path: /index.html		#检测文件 /index.html
        initialDelaySeconds: 1		#检测延时,容器创建后延时几秒开启检测
        periodSeconds: 3		#每3秒一次检测
        timeoutSeconds: 10		#检测超时时间

kubectl create -f live-httpget.yaml

kubectl get pod

kubectl get pod -o wide 查看Pod容器的详细信息,包含IP,NODE
在这里插入图片描述

1、模拟文件丢失,进入容器将index.html文件删掉

kubectl exec liveness-httpget-pod -it – /bin/bash

rm -f /htdocs/index.html

2、则检测失败,重启重新创建Pod,效果如下

kubectl get pod -w
在这里插入图片描述

3、livenessProbe-tcp

vim live-tcp.yaml

apiVersion: v1
kind: Pod
metadata: 
 name: probe-tcp
 namespace: default
spec: 
 containers: 
   - name: nginx
     image: httpd:latest
     livenessProbe: 
       initialDelaySeconds: 5
       timeoutSeconds: 1
       periodSeconds: 3
       tcpSocket: 		#检测TCP连接socket文件
         port: 8080		#检测TCP连接的端口
       

在这里插入图片描述

4、合并 livenessProbe + readinessProbe 的探测

readinessProbe 就绪检测先检测,然后再执行存活检测。如果不存活直接将Pod容器干掉

apiVersion: v1
kind: Pod
metadata: 
 name: myapp-http
 namespace: default
spec: 
 containers: 
  - name: apache
    image: httpd:latest
    imagePullPolicy: IfNotPresent
	ports: 
	 - name: http
	   containerPort: 80
    readinessProbe:  			#readliness检测,如果出现错误,则进入失败状态,但不会重启
	httpGet: 		
	  port: 80		
          path: /index.html	
        initialDelaySeconds: 1	
        periodSeconds: 3 
    livenessProbe: 			#liveness检测,如果出现错误,直接干掉原有Pod,重新启动一个新的Pod
    	httpGet: 
    	  port: http
    	  path: /index.html
    	initialDelaySeconds: 1
        periodSeconds: 3
        timeoutSeconds: 10

四、启动、退出动作

apiVersion: v1
kind: Pod
metadata: 
 name: lifecycle-demo
spec: 
 containers: 
   - name: lifecycle-demo-container
     image: nginx:latest
     lifecycle: 	#设置启动、退出动作
       postStart:	#启动容器时
         exec:		#执行以下命令
           command: ["/bin/sh","-c","echo hello world~! > /tmp/shm"]
       preStop: 	#退出容器时
         exec: 		#执行以下命令
           command: ["/bin/sh","-c","echo goodbye shm~! > /tmp/shm"]

五、Pod 状态阈值

挂起(pending):Pod 已被 Kubernetes 系统接受,但有一个或者多个容器镜像尚未创建。等待时间包括调度 Pod 的时间和通过网络下载镜像的时间,需要花点时间。

运行中(running):Pod已经帮到了一个节点上,Pod 中所有的容器都已被创建。至少有一个容器正在运行,或者正处于启动、重启状态

成功(Succeeded):Pod 中的所有容器都成功终止,并且不会再重启

失败(Failed):Pod 中的所有容器都已经终止了,并且至少有一个容器是因为失败终止。容器以非0状态退出。

未知(Unknown):因为某些原因无法取得 Pod 状态,通常是因为与 Pod 所在主机通信失败。

ommand: ["/bin/sh","-c",“echo goodbye shm~! > /tmp/shm”]

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐