15 章 在微服务中服务众多如何实践他们复杂的依赖关系进行 helm安装
让我们通过一个实际的例子来详细讲解如何将 wait-for-dependencies
Job 结合到一个 Web 服务的 Helm Chart 中。假设你有一个 Web 服务 my-web-service
,它依赖于一个 MySQL 数据库和一个 Nacos 配置服务。
场景
我们有以下服务:
- 数据库服务:
mysql-service
,监听端口3306
- Nacos 服务:
nacos-service
,监听端口8848
- Web 服务:
my-web-service
,监听端口8080
我们希望在 Helm Chart 部署 my-web-service
之前确保数据库和 Nacos 服务都已经就绪。
Helm Chart 结构
假设你的 Helm Chart 目录结构如下:
my-web-service-chart/
├── charts/
├── templates/
│ ├── deployment.yaml
│ ├── service.yaml
│ ├── wait-for-dependencies-job.yaml
├── values.yaml
├── Chart.yaml
wait-for-dependencies-job.yaml
在 templates/
目录下创建 wait-for-dependencies-job.yaml
文件,内容如下:
apiVersion: batch/v1
kind: Job
metadata:
name: wait-for-dependencies
annotations:
"helm.sh/hook": post-install
spec:
template:
spec:
containers:
- name: wait
image: alpine:latest
command: ["sh", "-c", "apk add --no-cache netcat-openbsd && while ! nc -z mysql-service 3306; do sleep 5; done; while ! nc -z nacos-service 8848; do sleep 5; done; echo 'Dependencies are ready'"]
restartPolicy: Never
deployment.yaml
这是 my-web-service
的 Deployment 配置。在 templates/
目录下创建 deployment.yaml
文件,内容如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-web-service
spec:
replicas: 1
selector:
matchLabels:
app: my-web-service
template:
metadata:
labels:
app: my-web-service
spec:
containers:
- name: my-web-service
image: my-web-service-image:latest
ports:
- containerPort: 8080
env:
- name: DATABASE_URL
value: "jdbc:mysql://mysql-service:3306/mydb"
- name: NACOS_SERVER
value: "nacos-service:8848"
service.yaml
在 templates/
目录下创建 service.yaml
文件,定义 Web 服务的 Service,内容如下:
apiVersion: v1
kind: Service
metadata:
name: my-web-service
spec:
selector:
app: my-web-service
ports:
- protocol: TCP
port: 80
targetPort: 8080
values.yaml
在 values.yaml
中,可以配置服务相关的参数,比如数据库和 Nacos 的配置。但在这个简单的例子中,我们不需要做额外的配置。
使用 Helm 安装 Chart
确保你的 Helm Chart 已经准备好并且包含上述文件。然后使用 Helm 安装 Chart:
helm install my-web-service ./my-web-service-chart
流程说明
wait-for-dependencies-job.yaml
: 这个 Job 会在 Helm Chart 的post-install
阶段运行。它会检查mysql-service
和nacos-service
的端口是否开放。如果端口未开放,它会每 5 秒重试一次,直到服务就绪。deployment.yaml
: 定义了my-web-service
的 Deployment。它会在wait-for-dependencies
Job 成功执行后启动。确保数据库和 Nacos 服务都已准备好,Web 服务才会启动。service.yaml
: 为my-web-service
创建了一个 Service,暴露端口供外部访问。
总结
- Job 的作用: 确保依赖服务(数据库和 Nacos)在 Web 服务启动之前已经就绪。
- Job 执行:
wait-for-dependencies
Job 在 Helm 的post-install
阶段执行,等待所有依赖服务的端口开放。 - Web 服务启动: 只有在 Job 成功执行后,
my-web-service
的 Deployment 才会启动,确保所有依赖服务可用。
这样,你可以确保 Web 服务在其依赖的服务完全可用之后才会启动,避免启动时出现连接失败的问题。