4个Kubernetes的高级技巧

背景

基于之前的文章,我们把服务程序部署在了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:

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

等待几秒钟然后运行:

ini 复制代码
kubectl get po -l app=django-example

输出如下: 如图所示,我们看到这个 po 尚未准备就绪,使用以下命令,进一步查看未准备就绪的原因:

ini 复制代码
kubectl describe po -l app=django-example

输出如下: 从图中可以看到,pod未准备就绪,我们需要进入pod来检查。文章后续也会讲解这个技巧。

技巧2. 在Pod中执行命令

有时,我们需要在容器中运行命令,如何连接到我们创建的 pod 并建立"/tmp/ready",引发容器准备就绪。

使用以下命令:

bash 复制代码
kubectl exec django-example-5c79c94df6-9vkr7 -c web-app -it -- /bin/bash

说明

  1. 'django-example-5c79c94df6-9vkr7' 是 pod 名称, 依赖之前的命令kubectl get po -l app=django-example查看。
  2. -c 接受容器名称,用于pod中有多个容器的情况。
  3. '--' 之后是传递给容器的命令,这里开启了一个 bash。
  4. -it是一个标志,表明这是一个交互式会话。

然后,我们进入了容器里,并在终端连接到容器后,输入以下命令:

bash 复制代码
touch /tmp/ready

然后按 CTRL+D 退出,检查 Pod 的状态后,您会发现它已准备就绪,如下所示:

技巧3. 滚动更新

当程序更新后,需要重新打包镜像,并将镜像版本号增加1位。

erlang 复制代码
docker build -t django-example:v1.1 .

然后编辑 Kubernetes 上的yaml文件,来更新其中的镜像版本。

通过以下命令来更新yaml文件:

复制代码
kubectl edit deployments.apps django-example

搜索image关键字,并将其更改为新的镜像地址,同时删除就绪性检查,如下所示: 接着运行命令更新Pod:

arduino 复制代码
kubectl get po

看到旧的 Pod 正在终止,新的 Pod 正在启动。启动完成后,可以通过引用服务地址从浏览器里访问验证。

技巧4. 回滚

如果我们更新的镜像有问题,我们也可以使用Kubernetes 回滚。

首先获取历史信息:

bash 复制代码
kubectl rollout history  deployment django-example 

输出如下: 如果要回滚到Version1,可以使用以下命令:

ini 复制代码
kubectl rollout  undo  deployment django-example --to-revision=1

输出如下: 注意 :状态还不是ready,按照上面的操作来更新一下文件就好。如下所示:

总结

本文讲述了4个Kubernetes的高级技巧,包括:

  1. 如何做就绪性(Readiness)和存活性(Liveness)检查。
  2. 如何在Pod中执行命令。
  3. 如何滚动更新。
  4. 如何回滚。
相关推荐
2301_8107463140 分钟前
CKA冲刺40天笔记 - day24 Kubernetes Clusterrole 和 Clusterrole Binding
笔记·容器·kubernetes
ICT董老师3 小时前
通过kubernetes部署nginx + php网站环境
运维·nginx·云原生·容器·kubernetes·php
原神启动13 小时前
K8S(八)—— Kubernetes Pod 资源限制 + 探针(Probe)解析
云原生·容器·kubernetes
zxnbmk3 小时前
【7】Kubernetes存储(本章知识密度较高,仅浅浅了解后续详解)
linux·云原生·容器·kubernetes
叫致寒吧3 小时前
pod详解
云原生·kubernetes
水上冰石3 小时前
查看k8s下Jenkins的插件在宿主机的路径
容器·kubernetes·jenkins
孤岛悬城3 小时前
58 k8s之pod
云原生·容器·kubernetes
可爱又迷人的反派角色“yang”3 小时前
k8s(五)
linux·运维·docker·云原生·容器·kubernetes
oMcLin3 小时前
如何在Ubuntu 22.10上通过配置K3s轻量级Kubernetes集群,提升边缘计算环境的资源管理能力?
ubuntu·kubernetes·边缘计算
水上冰石4 小时前
如何查看k8s按照的jenkins插件的路径
容器·kubernetes·jenkins