kubernetes的基本单位Pod详解( 五 )


apiVersion: v1kind: Podmetadata:name: expodpostprespec:containers:- name: postprecontainerimage: busyboximagePullPolicy: IfNotPresentcommand: ['sh', '-c']args: ['echo "Hello Kubernetes!"; sleep 3600']lifecycle:postStart:httpGet:host: www.baidu.compath: /port: 80scheme: HTTPpreStop:exec:command: ['sh', '-c', 'echo "preStop callback done!"; sleep 60']postStart 中我们执行 HttpGet 回调,访问了百度首页,preStop 则执行命令输出一段文本,然后停留 60s 。我们执行创建命令,观察一下 Pod 的状态 。
kubectl apply -f expodpostpre.yml正常情况下是和之前的是一样的,我们做一些测试操作,例如把 postStart 的网址写一个不可访问的网址,比如:
host: www.fackbook.com创建后,查看日志信息
kubectl logs expodpostpre

kubernetes的基本单位Pod详解

文章插图
 
还可以通过 kubectl describe 来查看详细情况
kubernetes的基本单位Pod详解

文章插图
 
Pod 的健康检查在容器运行的过程中,我们可以通过探针来持续检查容器的状况,kubernetes 为我们提供了两种探针:存活探针、就绪探针 。
  • 存活探针livenessProbe:检测容器是否正在运行,如果返回 Failure,kubelet 会终止容器,然后容器会按照重启策略执行 。如果没有提供存活探针,默认状态就是 Success 。
  • 就绪探针readlinessProbe:检测容器是否已经可以启动了应用服务,如果返回 Failure,Endpoint 控制器就会从所有 Service 的 Endpoint 中移除此 Pod 的 IP 地址 。从容器启动到第一次探测之前,默认的就绪状态是 Failure 。如果没有提供就绪探针,默认状态就是 Success 。
容器配置当中有 3 种方法来执行探针检测:exec、tcpSocket、httpGet 。
  • exec:在容器内部执行指定的命令,如果命令以状态码“0”退出,则表示诊断成功 。配置如下:
livenessProbe/readlinessProbe:exec:command: [xxxx] # 命令列表
  • tcpSocket:对容器的指定端口执行 TCP 检测 。如果端口是打开的,则诊断成功 。配置如下:
livenessProbe/readlinessProbe:tcpSocket:port: Number # 指定端口号
  • httpGet:对容器内的 HTTP 服务进行检测,如果响应的状态码范围为 200~400,则诊断成功 。配置如下:
livenessProbe/readlinessProbe:httpGet:port: Number # 指定的端口号path: String # 指定路径下面举几个例子来展示一下探针的使用 。
存活探针的使用apiVersion: v1kind: Podmetadata:name: expodlivespec:containers:- name: livecontainerimage: busyboximagePullPolicy: IfNotPresentcommand: ['sh', '-c']args: ['mkdir /files_dir; echo "Hello Kubernetes!" > /files_dir/newfile; sleep 3600']livenessProbe:exec:command: ['cat', '/files_dir/newfile']先创建一个文件夹 files_dir,再新建一个文件 newfile,写入 Hello Kubernetes! 内容,然后在存活探针中使用 cat 查看文件内容 。执行创建 Pod 命令:
kubectl apply -f expodlive.yml
kubernetes的基本单位Pod详解

文章插图
 
目前 Pod 运行一切正常,现在我们可以做一些破坏性的操作,进入 Pod 内部,删除 newfile 文件 。
[root@k8s-master]# kubectl exec -it expodlive -- /bin/sh/# rm -f /files_dir/newfile/# exit由于探针定期检查 /files_dir/newfile 文件是否存在,而我们的 Pod 默认是异常后重启,因此可以通过以下命令查看 Pod 详细信息:
kubectl describe pods expodlive
kubernetes的基本单位Pod详解

文章插图
 
可以看到 Event 中打印了存活探针的运行情况:存活探针失败,并且准备重启 。
就绪探针的使用apiVersion: v1kind: Podmetadata:name: expodreadspec:containers:- name: readcontainerimage: nginximagePullPolicy: IfNotPresentports:- name: portnginxcontainerPort: 80readinessProbe:httpGet:port: 80path: /我们创建了一个 Nginx 容器,通过 containerPort 属性,将 80 端口暴露出来,然后设置一个就绪探针定期向 80 端口发送 HttpGet 请求,检测响应范围是否为 200~400 。使用 apply 命令创建成功后,我们同样要进行一些测试性的操作 。
[root@k8s-master]# kubectl apply -f expodread.yml[root@k8s-master]# kubectl exec -it expodread -- /bin/sh/# nginx -s stop
kubernetes的基本单位Pod详解


推荐阅读