15 章 在微服务中服务众多如何实践他们复杂的依赖关系进行 helm安装

发布于:2024-09-18 ⋅ 阅读:(11) ⋅ 点赞:(0)

让我们通过一个实际的例子来详细讲解如何将 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

流程说明

  1. wait-for-dependencies-job.yaml: 这个 Job 会在 Helm Chart 的 post-install 阶段运行。它会检查 mysql-servicenacos-service 的端口是否开放。如果端口未开放,它会每 5 秒重试一次,直到服务就绪。
  2. deployment.yaml: 定义了 my-web-service 的 Deployment。它会在 wait-for-dependencies Job 成功执行后启动。确保数据库和 Nacos 服务都已准备好,Web 服务才会启动。
  3. service.yaml: 为 my-web-service 创建了一个 Service,暴露端口供外部访问。

总结

  • Job 的作用: 确保依赖服务(数据库和 Nacos)在 Web 服务启动之前已经就绪。
  • Job 执行: wait-for-dependencies Job 在 Helm 的 post-install 阶段执行,等待所有依赖服务的端口开放。
  • Web 服务启动: 只有在 Job 成功执行后,my-web-service 的 Deployment 才会启动,确保所有依赖服务可用。

这样,你可以确保 Web 服务在其依赖的服务完全可用之后才会启动,避免启动时出现连接失败的问题。


网站公告

今日签到

点亮在社区的每一天
去签到