kubernetes资源清单 - initC,探针检测
kubernetes资源清单 - initC个人学习记录kubernetes资源清单 - initCInit 容器与普通容器的区别:Init 容器作用一、 Init 容器模板探针探针结果:探测方式:二、检测探针-就绪检测readinessProbe-httpget三、检测探针 -存活检测1、livenessProbe - exec2、livenessProbe-httpget3、livenessP
kubernetes资源清单 - initC
个人学习记录
Pod 能够具有多个容器,应用运行在容器里面,每一个容器可能有一个或者多个先于容器启动的 init 容器。
Init 容器与普通容器的区别:
- Init 容器总是运行到成功完成为止。
- 每个 Init 容器都必须在下一个 Init 容器启动之前成功完成。
如果init C 容器启动失败,则不会到达 Main C 状态
如果 Pod 的 init 容器初始失败,kubernetes会不断地重启该 Pod,直到 Init 容器成功为止。
如果 Pod 对应的策略 restartPolicy 为 Never,它就不会重新启动。
Init 容器作用
确保Main C 容器的安全性、冗余性。
在主容器被创建之前,需要有一些文件被创建,需要准备好一些数据,但是这些数据或文件的创建工具,加载到 Main C 之后会造成Main C容器的冗余、资源重复,随着工具越来越多会出现资源的严重浪费。-
所以将这些基础的配置文件,工具写入到 Init C 容器,让他在初始化的过程中帮助 Main C 将所用的文件数据提前创建出来。这样可以最大化利用 Pod 内部资源。 -
Init 容器通过 Namespace,将 Main C容器所需要的文件,通过 Init C来进行访问下载读取,直接将初始化的文件传给Main C ,保证安全性。 -
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 调用由容器实现的 处理程序。功三种类型的处理程序:
- ExecAction:在容器内执行指定命令。如果命令返回码为0则成功,非0都不成功
- TCPSocketAction:在对指定端口上的容器的IP地址进行TCP检查。如果端口打开,则诊断被认为是成功的。
- HTTPGetAction:对指定端口和路径上的容器的IP地址执行 HTTP Get请求。如果响应的状态码大于等于200,且小于400,则诊断被认为是成功的。
探针结果:
- 成功:容器通过了诊断
- 失败:容器未通过诊断
- 未知:诊断失败,不会采取任何操作
探测方式:
- livenessProbe:指示容器是否在运行。如果存活探测失败,则 kubelet 会杀死容器,并且容器将受到其 重启策略 的影响。如果容器不提供存活探针,则默认状态为 Success。
- 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”]
更多推荐
所有评论(0)