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. 如何回滚。
相关推荐
木鱼时刻1 天前
容器与 Kubernetes 基本概念与架构
容器·架构·kubernetes
chuanauc2 天前
Kubernets K8s 学习
java·学习·kubernetes
庸子2 天前
基于Jenkins和Kubernetes构建DevOps自动化运维管理平台
运维·kubernetes·jenkins
李白你好2 天前
高级运维!Kubernetes(K8S)常用命令的整理集合
运维·容器·kubernetes
Connie14512 天前
k8s多集群管理中的联邦和舰队如何理解?
云原生·容器·kubernetes
伤不起bb2 天前
Kubernetes 服务发布基础
云原生·容器·kubernetes
别骂我h3 天前
Kubernetes服务发布基础
云原生·容器·kubernetes
weixin_399380693 天前
k8s一键部署tongweb企业版7049m6(by why+lqw)
java·linux·运维·服务器·云原生·容器·kubernetes
斯普信专业组3 天前
K8s环境下基于Nginx WebDAV与TLS/SSL的文件上传下载部署指南
nginx·kubernetes·ssl
&如歌的行板&3 天前
如何在postman中动态请求k8s中的pod ip(基于nacos)
云原生·容器·kubernetes