39、Kubernetes应用部署、探针配置与零停机更新全解析

Kubernetes应用部署、探针配置与零停机更新全解析

在当今的分布式应用开发与部署中,Kubernetes 已成为一个不可或缺的容器编排工具。它能够帮助开发者高效地部署、运行和更新应用,同时确保应用的高可用性和可扩展性。本文将详细介绍如何在 Kubernetes 中部署应用,如何定义探针来监控应用的健康状态,以及如何实现零停机更新。

1. 部署首个应用

在 Kubernetes 集群中部署应用时,通常涉及多个组件,如 Web 组件和数据库组件。以下是部署一个示例宠物应用的详细步骤:

1.1 部署数据库

数据库是有状态的组件,与无状态的 Web 组件处理方式不同。Kubernetes 为有状态组件定义了特殊的 StatefulSet 对象,我们可以使用它来部署数据库。

graph LR
    A[创建 db-stateful-set.yaml 文件] --> B[添加 StatefulSet 定义]
    B --> C[使用 kubectl 部署 StatefulSet]
    C --> D[创建 db-service.yaml 文件]
    D --> E[添加 Service 定义]
    E --> F[使用 kubectl 部署 Service]

具体操作步骤如下:
1. 创建 db-stateful-set.yaml 文件 :该文件用于定义数据库的 StatefulSet 对象。文件内容可参考示例,其中需要定义一个名为 pets-data 的存储卷,最大容量为 100MB,并将其挂载到容器的 /var/lib/postgresql/data 路径,同时声明 PostgreSQL 监听端口为 5432。
2. 部署 StatefulSet :使用以下命令部署 StatefulSet

kubectl apply -f db-stateful-set.yaml
  1. 创建 db-service.yaml 文件 :为了使 Web 组件能够访问数据库,需要创建一个 Service 对象。由于数据库仅需在集群内部访问,因此使用 ClusterIP 类型的 Service 。文件内容可参考示例,通过 app: pets service: db 标签选择对应的 Pod。
  2. 部署 Service :使用以下命令部署 Service
kubectl apply -f db-service.yaml
1.2 测试应用

完成上述步骤后,即可测试应用。通过浏览器访问应用,使用 kubectl get services 命令获取 Kubernetes 为 Web Service 对象分配的端口号,替换示例中的端口号进行访问。

1.3 清理应用

若要从集群中移除应用,可使用以下脚本:

kubectl delete svc/web
kubectl delete deploy/web
kubectl delete svc/db
kubectl delete statefulset/db
kubectl delete pvc/pets-data-db-0

需要注意的是,删除数据库部署时,持久卷声明(PVC)不会自动删除,需手动删除。

2. 简化部署

对于复杂的应用,部署多个组件会变得繁琐。可以将多个 Kubernetes 对象定义在一个文件中,使用三个连字符分隔不同对象的定义,从而简化部署过程。

操作 命令
部署应用 kubectl apply -f install-pets.yaml
移除应用 ./remove-pets.sh kubectl delete -f install-pets.yaml 并手动删除 PVC
3. 定义存活和就绪探针

容器编排系统如 Kubernetes 虽然能自动化许多任务,但在某些情况下,需要开发者提供额外信息来支持编排引擎。存活和就绪探针就是这样的机制,用于帮助 Kubernetes 了解应用服务的内部状态。

3.1 Kubernetes 存活探针

存活探针用于判断容器是否需要被终止并重新启动。只有当 Pod 中的所有容器都健康时,Pod 才被认为是健康的。以下是一个定义存活探针的示例:

apiVersion: v1
kind: Pod
metadata:
  ...
spec:
  containers:
  - name: liveness-demo
    image: postgres:12.10
    ...
    livenessProbe:
      exec:
        command: nc localhost 5432 || exit -1
      initialDelaySeconds: 10
      periodSeconds: 5

在上述示例中,使用 netcat 工具探测 PostgreSQL 容器的 5432 端口。 initialDelaySeconds 表示容器启动后等待多久开始执行第一次探针, periodSeconds 表示探针执行的间隔时间。

也可以使用 HTTP 端点进行探测,示例如下:

apiVersion: v1
kind: Pod
metadata:
  ...
spec:
  containers:
  - name: liveness
    image: acme.com/my-api:1.0
    ...
    livenessProbe:
      httpGet:
        path: /api/health
        port: 3000
      initialDelaySeconds: 5
      periodSeconds: 3

还可以直接使用 TCP 协议进行探测:

apiVersion: v1
kind: Pod
metadata:
  ...
spec:
  containers:
  - name: liveness-demo
    image: postgres:12.10
    ...
    livenessProbe:
      tcpSocket:
        port: 5432
      initialDelaySeconds: 10
      periodSeconds: 5

存活探针还可以设置 failureThreshold ,表示连续失败多少次后重启容器,默认值为 3,最小值为 1。

3.2 测试存活探针

以下是测试存活探针的步骤:
1. 复制 probes 子文件夹到本地。
2. 构建 Docker 镜像:

docker image build -t demo/probes-demo:2.0 probes
  1. 使用 kubectl 部署示例 Pod:
kubectl apply -f probes/probes-demo.yaml
  1. 描述 Pod 并分析日志:
kubectl describe pods/probes-demo
  1. 等待至少 30 秒后再次描述 Pod,观察探针失败和 Pod 重启的信息。
  2. 查看 Pod 列表,确认 Pod 已重启多次:
kubectl get pods
  1. 完成测试后,删除 Pod:
kubectl delete pods/probes-demo
3.3 Kubernetes 就绪探针

就绪探针用于判断服务实例(容器)是否准备好接受流量。只有当 Pod 中的所有容器都准备好时,Pod 才被认为是就绪的。就绪探针的定义方式与存活探针类似,只需将 livenessProbe 替换为 readinessProbe

...
spec:
  containers:
  - name: liveness-demo
    image: postgres:12.10
    ...
    livenessProbe:
      tcpSocket:
        port: 5432
      failureThreshold: 2
      periodSeconds: 5
    readinessProbe:
      tcpSocket:
        port: 5432
      initialDelaySeconds: 10
      periodSeconds: 5
3.4 Kubernetes 启动探针

启动探针用于判断服务实例是否已启动。在启动探针未成功之前,Kubernetes 不会执行存活和就绪探针。启动探针的定义方式与存活和就绪探针相同。

spec:
  containers:
  ...
    startupProbe:
      tcpSocket:
        port: 3000
      failureThreshold: 30
      periodSeconds: 5
  ...

需要确保 failureThreshold * periodSeconds 的乘积足够大,以应对最坏的启动时间。在上述示例中,最大启动时间不应超过 150 秒。

4. 零停机部署

在关键任务环境中,应用必须始终保持运行,零停机部署是实现这一目标的重要手段。Kubernetes 提供了两种实现零停机部署的方法:滚动更新和蓝绿部署,下面主要介绍滚动更新。

4.1 滚动更新示例

我们以 Web 组件为例,通过修改部署清单来实现滚动更新。具体步骤如下:
1. 创建包含五个副本的部署 :使用 web-deployment-rolling-v1.yaml 文件创建包含五个副本的 Web 组件部署,同时创建对应的服务。

kubectl apply -f web-deployment-rolling-v1.yaml
kubectl apply -f web-service.yaml
  1. 测试应用 :获取分配的节点端口,并使用 curl 命令测试应用。
PORT=$(kubectl get svc/web -o jsonpath='{.spec.ports[0].nodePort}')
curl localhost:${PORT}/
  1. 构建并推送新镜像 :开发人员创建了 Web 组件的新版本 2.1,我们需要构建并推送新镜像。
docker image build -t demo/ch17-web:2.1 web
docker image push demo/ch17-web:2.1
  1. 更新部署中的镜像 :使用 kubectl set image 命令更新部署中使用的镜像。
kubectl set image deployment/web web=demo/ch17-web:2.1
  1. 再次测试应用 :确认更新是否成功。
curl localhost:${PORT}/
4.2 验证滚动更新

为了验证滚动更新是否成功且没有停机时间,我们可以使用以下方法:
- 检查部署状态 :使用 kubectl rollout status 命令确认部署是否成功。

kubectl rollout status deploy/web
  • 查看事件列表 :使用 kubectl describe deploy/web 命令查看部署的事件列表,了解更新过程。
graph LR
    A[创建部署] --> B[创建初始 ReplicaSet(web-769b88f67,5 个副本)]
    B --> C[执行更新命令]
    C --> D[创建新 ReplicaSet(web-55cdf67cd,1 个副本)]
    D --> E[旧 ReplicaSet 缩容至 4 个副本]
    E --> F[新 ReplicaSet 扩容至 2 个副本]
    F --> G[旧 ReplicaSet 缩容至 3 个副本]
    G --> H[新 ReplicaSet 扩容至 5 个副本,旧 ReplicaSet 缩容至 0 个副本]
  • 查看 ReplicaSet 列表 :使用 kubectl get rs 命令查看 ReplicaSet 列表,确认新 ReplicaSet 已扩容到 5 个实例,旧 ReplicaSet 已缩容到 0 个实例。
4.3 回滚更新

如果新代码中存在未检测到的 bug,可以使用 kubectl rollout undo 命令回滚更新。

kubectl rollout undo deploy/web

回滚后,再次测试应用,确认是否恢复到旧版本。

curl localhost:${PORT}/

总结

通过本文的介绍,我们详细了解了在 Kubernetes 中部署应用的完整流程,包括数据库和 Web 组件的部署、简化部署的方法、存活和就绪探针的定义与使用,以及零停机部署的实现。这些技术能够帮助我们更高效地管理和维护分布式应用,确保应用的高可用性和可扩展性。在实际应用中,我们可以根据具体需求选择合适的部署和监控策略,以满足业务的要求。

操作类型 操作命令 说明
部署应用 kubectl apply -f install-pets.yaml 一次性部署多个 Kubernetes 对象
移除应用 ./remove-pets.sh kubectl delete -f install-pets.yaml 并手动删除 PVC 移除应用相关资源
测试存活探针 一系列 docker kubectl 命令 验证存活探针功能
滚动更新 一系列 kubectl docker 命令 实现应用的零停机更新
回滚更新 kubectl rollout undo deploy/web 回滚到上一个版本
源码地址: https://pan.quark.cn/s/d1f41682e390 miyoubiAuto 米游社每日米游币自动化Python脚本(务必使用Python3) 8更新:更换cookie的获取地址 注意:禁止在B站、贴吧、或各大论坛大肆传播! 作者已退游,项目不维护了。 如果有能力的可以pr修复。 小引一波 推荐关注几个非常可爱有趣的女孩! 欢迎B站搜索: @嘉然今天吃什么 @向晚大魔王 @乃琳Queen @贝拉kira 第三方库 食用方法 下载源码 在Global.py中设置米游社Cookie 运行myb.py 本地第一次运行时会自动生产一个文件储存cookie,请勿删除 当前仅支持单个账号! 获取Cookie方法 浏览器无痕模式打开 http://user.mihoyo.com/ ,登录账号 按,打开,找到并点击 按刷新页面,按下图复制 Cookie: How to get mys cookie 当触发时,可尝试按关闭,然后再次刷新页面,最后复制 Cookie。 也可以使用另一种方法: 复制代码 浏览器无痕模式打开 http://user.mihoyo.com/ ,登录账号 按,打开,找到并点击 控制台粘贴代码并运行,获得类似的输出信息 部分即为所需复制的 Cookie,点击确定复制 部署方法--腾讯云函数版(推荐! ) 下载项目源码和压缩包 进入项目文件夹打开命令行执行以下命令 xxxxxxx为通过上面方式或取得米游社cookie 一定要用双引号包裹!! 例如: png 复制返回内容(包括括号) 例如: QQ截图20210505031552.png 登录腾讯云函数官网 选择函数服务-新建-自定义创建 函数名称随意-地区随意-运行环境Python3....
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值