背景
基于之前的文章,我们把服务程序部署在了Kubernetes上。本篇文章总结了4个在Kubernetes上常用的高级技巧。服务程序是Django开发的,但是本文总结的技巧跟程序开发语言无关。
技巧1. 就绪性(Readiness)和存活性(Liveness)检查
- 就绪性(Rediness)检查:当为 true 时,表示容器已准备好接受访问。常用在容器需要一些时间来准备环境后,再开始接受访问。
- 存活性(Liveness)检查:这是 Kubernetes 定期运行的检查项,以确保容器处于活动状态并运行,如果失败,容器将被视为死亡,并将被终止并启动新容器。
二者在配置方面相似,但在调用时有所不同。
注意:我们说的是“容器”而不是“pod”,检查是针对每个容器的。
检查方式
上述检查项Kubernetes有以下三种检查方式:
- command : 如果成功则返回 0,否则返回错误信息。
- httpGet:如果返回值在 200 到 399 之间,则表示成功。
- tcpSocket:如果 Kubernetes 可以打开 TCP 端口的连接,则表示成功,否则表示失败。
配置探针(Probes)
使用下属3种探针:
- initialDelaySeconds : 在容器启动后,检查启动前的时间,默认为 0秒。
- periodSeconds:检查的间隔时间,默认10秒。
- failureThreadhold:如果探测失败后重试的次数,默认为 3次。
示例
采用 "httpGet"的方式做就绪性(Readiness)和存活性(Liveness)检查。
在Django应用的容器部分中,添加django-example_checks.yaml:
containers:
- name: web-app
image: django-example:v1.0
ports:
- containerPort: 80
readinessProbe: #<-- 检查定义开始
periodSeconds: 5
initialDelaySeconds: 5
failureThreshold: 100
exec:
command:
- cat
- /tmp/ready
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 2
periodSeconds: 3 #<-- 检查定义结束
volumeMounts:
- name: sqlite-volume
mountPath: /app/db.sqlite3
如果容器已准备就绪,那么“/tmp/ready”存在,容器处于活动状态,可以响应端口 80 上的 HTTP 请求。
注意:为了演示,我们将 failureThreshold 设置得非常高,而在真实环境中不应出现这种情况。
测试一下:
kubectl apply -f django-example_checks.yaml
等待几秒钟然后运行:
kubectl get po -l app=django-example
输出如下:
如图所示,我们看到这个 po 尚未准备就绪,使用以下命令,进一步查看未准备就绪的原因:
kubectl describe po -l app=django-example
输出如下:
从图中可以看到,pod未准备就绪,我们需要进入pod来检查。文章后续也会讲解这个技巧。
技巧2. 在Pod中执行命令
有时,我们需要在容器中运行命令,如何连接到我们创建的 pod 并建立“/tmp/ready”,引发容器准备就绪。
使用以下命令:
kubectl exec django-example-5c79c94df6-9vkr7 -c web-app -it -- /bin/bash
说明:
- ‘django-example-5c79c94df6-9vkr7’ 是 pod 名称, 依赖之前的命令kubectl get po -l app=django-example查看。
- -c 接受容器名称,用于pod中有多个容器的情况。
- ‘–’ 之后是传递给容器的命令,这里开启了一个 bash。
- -it是一个标志,表明这是一个交互式会话。
然后,我们进入了容器里,并在终端连接到容器后,输入以下命令:
touch /tmp/ready
然后按 CTRL+D 退出,检查 Pod 的状态后,您会发现它已准备就绪,如下所示:
技巧3. 滚动更新
当程序更新后,需要重新打包镜像,并将镜像版本号增加1位。
docker build -t django-example:v1.1 .
然后编辑 Kubernetes 上的yaml文件,来更新其中的镜像版本。
通过以下命令来更新yaml文件:
kubectl edit deployments.apps django-example
搜索image关键字,并将其更改为新的镜像地址,同时删除就绪性检查,如下所示:
接着运行命令更新Pod:
kubectl get po
看到旧的 Pod 正在终止,新的 Pod 正在启动。启动完成后,可以通过引用服务地址从浏览器里访问验证。
技巧4. 回滚
如果我们更新的镜像有问题,我们也可以使用Kubernetes 回滚。
首先获取历史信息:
kubectl rollout history deployment django-example
输出如下:
如果要回滚到Version1,可以使用以下命令:
kubectl rollout undo deployment django-example --to-revision=1
输出如下:
注意:状态还不是ready,按照上面的操作来更新一下文件就好。如下所示:
总结
本文讲述了4个Kubernetes的高级技巧,包括:
- 如何做就绪性(Readiness)和存活性(Liveness)检查。
- 如何在Pod中执行命令。
- 如何滚动更新。
- 如何回滚。