pod的初始化容器实操,两个Hook的实操
pod的init初始化容器,就是init容器启动,应用pod才能开始启动,比如:①、数据库启动完成后,才能开启启动应用;②、在init容器中,根据需要生成配置文件,然后在主应用pod中启动应用。
yaml文件如下:
# 这里是 Pod 模版apiVersion: v1kind: Podmetadata: name: my-podspec: #业务容器 containers: - name: myapp-container image: busybox:latest command: ['sh', '-c', 'echo The app is running! && sleep 3600'] #初始化的容器:一般我们用不到初始化容器,除非做一些初始化的话会做 # 看日志的话:kubectl logs -f 容器名 --container=init-myservice initContainers: - name: init-myservice image: busybox:latest command: ['sh', '-c', 'echo waiting for myservice! && sleep 10'] - name: init-mydb image: busybox:latest command: ['sh', '-c', 'echo waiting for mydb! && sleep 10']
运行如下:
执行初始化容器1
执行初始化容器2:
看下初始化容器的日志:
Pod钩子Hook方法
pod钩子作用于:
①、pod创建后立刻执行PostStart方法
②、pod容器终止后之前立刻执行PreStop方法
PostStart钩子:
容器创建后立即执行,注意由于是异步执行,它无法保证一定在ENTRYPOINT之前执行,如果失败,容器会被杀死,并根据RestartPolicy决定是否重启。
preStop钩子:
在容器终止之前调用,是阻塞的,需要执行完该步骤后,才能真正执行终止容器的步骤。容器终止执前执行,常用于资源清理。执行完成之后容器将被成功终止,如果失败,容器同样也会被杀死。
钩子的回调函数支持三种方式定义动作:
①、exec:执行一段命令
exec:在容器内执行命令,如果命令的退出状态码是0表示执行成功,否则表示失败
……lifecycle:postStart:exec:command:- cat- /tmp/healthy……
②、HTTP:发送HTTP请求
httpGet:向指定URL发起GET请求,如果返回的HTTP状态码在[200,400)之间表示请求成功,否则表示失败
……lifecycle:postStart:httpGet:path: /login # URI地址port: 80 # 端口号host: 192.168.126.100 # 主机地址scheme: HTTP # 支持的协议,http或https# http://192.168.126.100:80/login……
③、TCPSocket:在容器尝试访问指定的socket
……lifecycle:postStart:tcpSocket:port: 8080……
Pod的钩子Hook的方法Demo如下:
# 这里是 Pod 模版#在外面的虚拟机里面执行 kubectl 命令apiVersion: v1kind: Podmetadata: name: my-podspec: containers: - name: hello image: busybox:latest command: ['sh', '-c', 'echo "Hello, Kubernetes!" && sleep 3600'] lifecycle: #钩子方法 启动执行的钩子 postStart: exec: # shell命令 重定向到一个文件里面 会输出到内存里面,没有刷盘 文件是有缓存,所以在看不到,等到刷盘就能看到了 command: ["/bin/sh", "-c", "echo Hello from the postStart handler >> /usr/share/message"] #停止的时候执行的钩子 preStop: exec: command: ["/bin/sh", "-c", "echo Hello from the preStop handler >> /usr/share/message"] #使用了一个卷的挂载 和 docker编排里面的卷的挂载不一样 volumeMounts: - name: outfile #这里的name名称要和volumes相同 这个是对应的名字 对应的是外面的卷 mountPath: /usr/share #这个是容器里面的目录 挂载到容器里的路径 #一个pod内部的所有网络命名空间和存储空间是共享的 所以和容器是并列的 volumes: - name: outfile #创建 volumes 外面卷的名字 hostPath: path: /tmp 对应到本地的目录 容器外面的路径 会在MiniKube的虚拟机里,需要进去 minikube ssh restartPolicy: OnFailure
运行结果如下:
Pod的状态和重启策略:
在介绍Pod的重启策略前,首先得了解pod的状态
pod的常见的状态:
pending:挂起,我们在请求创建pod时,条件不满足,调度没有完成,没有任何一个节点能满足调度条件,已经创建了但是没有适合它运行的节点叫做挂起,这其中也包含了含集群为容器创建网络,或者下载镜像的过程。
Running:Pod内的所有的容器都已经被创建,且至少一个容器正处于运行状态,正在启动状态或者重启状态。
Succeded:Pod中所有容器都执行成功后退出,并且没有处于重启的容器
Failed:Pod中所有容器都已经退出,但是至少还有一个容器退出时是失败的状态。
Unknown:未知状态,所谓的pod是什么状态是apiserver和运行在pod节点进行通信获取状态信息的,如果节点上的kubelet本身出故障,那么apiserver就连不上kubelet,得不到信息了,就会看到Unknown。
通过Kubectl的命令也可以查看Pod的状态信息:
Pod重启策略
根据restartPolicy来定义重启策略
①、Always:但凡Pod对象终止就将其重启,此为默认设定。
②、OnFailure:仅在Pod对象出现错误时将其重启
③、Never:从不重启
Pod的重启,只会在当前同一node节点上尝试重启pod
只有第一次重启是立刻执行,后面需要重启时,kubelet会延迟时间进行,且反复的重启操作的延迟时长依次为10秒,20秒,40秒,80秒 和300秒,300秒是最大的延迟时长。
Pod常见状态转换场景
不同的重启策略下,Pod常见状态转换过程