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 回滚到上一个版本
【四轴飞行器】非线性三自由度四轴飞行器模拟器研究(Matlab代码实现)内容概要:本文围绕非线性三自由度四轴飞行器的建模仿真展开,重点介绍了基于Matlab的飞行器动力学模型构建控制系统设计方法。通过对四轴飞行器非线性运动方程的推导,建立其在三维空间中的姿态位置动态模型,并采用数值仿真手段实现飞行器在复杂环境下的行为模拟。文中详细阐述了系统状态方程的构建、控制输入设计以及仿真参数设置,并结合具体代码实现展示了如何对飞行器进行稳定控制轨迹跟踪。此外,文章还提到了多种优化控制策略的应用背景,如模型预测控制、PID控制等,突出了Matlab工具在无人机系统仿真中的强大功能。; 适合人群:具备一定自动控制理论基础和Matlab编程能力的高校学生、科研人员及从事无人机系统开发的工程师;尤其适合从事飞行器建模、控制算法研究及相关领域研究的专业人士。; 使用场景及目标:①用于四轴飞行器非线性动力学建模的教学科研实践;②为无人机控制系统设计(如姿态控制、轨迹跟踪)提供仿真验证平台;③支持高级控制算法(如MPC、LQR、PID)的研究对比分析; 阅读建议:建议读者结合文中提到的Matlab代码仿真模型,动手实践飞行器建模控制流程,重点关注动力学方程的实现控制器参数调优,同时可拓展至多自由度或复杂环境下的飞行仿真研究。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值