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. 如何回滚。
相关推荐
YCyjs8 小时前
K8S群集调度二
云原生·容器·kubernetes
Hoxy.R8 小时前
K8s小白入门
云原生·容器·kubernetes
景天科技苑19 小时前
【云原生开发】K8S多集群资源管理平台架构设计
云原生·容器·kubernetes·k8s·云原生开发·k8s管理系统
wclass-zhengge19 小时前
K8S篇(基本介绍)
云原生·容器·kubernetes
颜淡慕潇19 小时前
【K8S问题系列 |1 】Kubernetes 中 NodePort 类型的 Service 无法访问【已解决】
后端·云原生·容器·kubernetes·问题解决
昌sit!1 天前
K8S node节点没有相应的pod镜像运行故障处理办法
云原生·容器·kubernetes
A ?Charis1 天前
Gitlab-runner running on Kubernetes - hostAliases
容器·kubernetes·gitlab
北漂IT民工_程序员_ZG1 天前
k8s集群安装(minikube)
云原生·容器·kubernetes
2301_806131362 天前
Kubernetes的基本构建块和最小可调度单元pod-0
云原生·容器·kubernetes
SilentCodeY2 天前
containerd配置私有仓库registry
容器·kubernetes·containerd·镜像·crictl