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
-
创建
db-service.yaml文件 :为了使 Web 组件能够访问数据库,需要创建一个Service对象。由于数据库仅需在集群内部访问,因此使用ClusterIP类型的Service。文件内容可参考示例,通过app: pets和service: db标签选择对应的 Pod。 -
部署
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
-
使用
kubectl部署示例 Pod:
kubectl apply -f probes/probes-demo.yaml
- 描述 Pod 并分析日志:
kubectl describe pods/probes-demo
- 等待至少 30 秒后再次描述 Pod,观察探针失败和 Pod 重启的信息。
- 查看 Pod 列表,确认 Pod 已重启多次:
kubectl get pods
- 完成测试后,删除 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
-
测试应用
:获取分配的节点端口,并使用
curl命令测试应用。
PORT=$(kubectl get svc/web -o jsonpath='{.spec.ports[0].nodePort}')
curl localhost:${PORT}/
- 构建并推送新镜像 :开发人员创建了 Web 组件的新版本 2.1,我们需要构建并推送新镜像。
docker image build -t demo/ch17-web:2.1 web
docker image push demo/ch17-web:2.1
-
更新部署中的镜像
:使用
kubectl set image命令更新部署中使用的镜像。
kubectl set image deployment/web web=demo/ch17-web:2.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
| 回滚到上一个版本 |
超级会员免费看
30

被折叠的 条评论
为什么被折叠?



