1. 强制删除
kubectl delete pod hook-demo1 --force --grace-period=0
默认所有的优雅退出时间都在30秒内。kubectl delete 命令支持 --grace-period=<seconds>选项,这个选项允许用户用他们自己指定的值覆盖默认值。值’日•代表强制删除pod。 在kubectl 1.5 及以上的版本里,执行强制删除时必须同时指定--force --grace-period=0.
强制删除一个 pod 是从集群状态还有etcd 里立刻删除这个 pod,只是当Pod 被强制删除时, APIServer 不会等待来自Pod 所在节点上的kubelet的确认信息:pod 己经被终止。在API 里pod 会被立刻删除,在节点上,pods 被设置成立刻终止后,在强行杀掉前还会有一个很小的宽限期,
以下示例中,定义了一个Nginx pod,其中设置了prestop钩子西数,即在容器退出之前,优雅的关闭 Nginx: (pod-prestop. yaml)
apiVersion: v1 kind: Pod metadata: name: hook-demo2 namespace: default spec: containers: - name: hook-demo2 image: nginx:latest lifecycle: preStop: exec: command: ["/user/sbin/nginx", "-s", "quit"] --- apiVersion: v1 kind: Pod metadata: name: hook-demo3 spec: volumes: - name: message hostPath: path: /tmp containers: - name: hook-demo2 image: nginx ports: - containerPort: 80 volumeMounts: - name: message mountPath: /usr/share/ lifecycle: preStop: exec: command: ['/bin/sh', '-c', "echo Hello from the preStop Handler > /usr/share/message"]
2. 健康检查
现在在Pod 的整个生命周期中,能影响到Pod 的就只剩下健康检查这一部分了。在Kubernetes 集群当中,我们可以通过配置1iveness probe(存活探针)和readiness probe (可读性探针) 来影响容器的生命周期:
-
kubelet 通过使用 liveness probe 来确定你的应用程序是否正在运行,通俗点将就是是否还活着。一般来说,如果你的程序一旦崩溃了,Kubernetes 就会立刻知道这个程序已经终止了,然后就会重启这个程康。而我们的liveness probe 的目的就是来捕获到当前应用程序还没有终止,还没有崩溃,如果出现了这些情况,那么就重启处于该状态下的容器,使应用程序在存在 bug 的情况下依然能够继续运行下去。
- kubelet 使用 readiness probe 来确定容器是否已经就绪可以接收流量过来了。这个探针通俗点讲就是说是否准备好了,现在可以开始工作了。只有当Pod 中的容器都处于就绪状态的时候 kubelet 才会认定该pod 处于就绪状态,因为-个pod 下面可能会有多个容器。当然Pod 如果处于非就绪状态,那么我们就会将他从 service 的Endpoints列表中移除出来,这样我们的流量就不会被路由到这个 Pod 里面来了。