我们如何使用kubernetes创建服务依赖关系

Gau*_*mar 7 kubernetes kubectl kubernetes-helm

我有2个服务。一个包含2个用于Web应用程序的pod副本,该副本依赖于另一个后端服务,该后端服务具有用于MySQL容器的pod(2个副本)。

Web应用程序使用后端数据库服务设置的环境变量。我将所有json都放在同一目录中。

有什么方法可以表达依赖关系,以便kubectl在启动Web应用程序服务之前始终创建(并运行)后端Pod和服务?我已经使用kubedeam创建了集群。

Ign*_*lán 7

我可以提出两种解决方案:

首先,将一个初始化容器附加到Web服务器,该容器等待MySQL启动并运行。部署将如下所示:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web
spec:
  selector:
    matchLabels:
      app: web
  replicas: 2
  template:
    metadata:
      labels:
        app: web
    spec:
      initContainers:
      - name: init-wait
        image: alpine
        command: ["sh", "-c", "for i in $(seq 1 300); do nc -zvw1 mysql 3306 && exit 0 || sleep 3; done; exit 1"]
      containers:
      - name: web
        image: web-server
        ports:
        - containerPort: 80
          protocol: TCP
Run Code Online (Sandbox Code Playgroud)

它使用netcat尝试每3秒在端口3306上启动与mysql服务的TCP连接。一旦实现连接,init容器将结束,Web服务器将正常启动。

第二个选项是使用Mirantis AppController。它允许您在服务器和数据库部署之间根据需要创建依赖项对象。检查他们的仓库以获取完整的文档。


sar*_*eno 5

遇到同样的问题并且按照他们的建议,使用 k8s initContainers解决了我的问题。

更新

添加了示例代码。

kind: Service
apiVersion: v1
metadata:
  name:  postgres-service
spec:
  # ...
---
apiVersion: apps/v1
kind: Deployment
# ...
spec:
  # ...
  template:
    # ...
    spec:
      # wait for postgres-service to run first
      initContainers:
      - name: init-wait-for-db
        image: alpine
        command: ["/bin/sh", "-c", "for i in $(seq 1 300); do nc -zvw1 postgres-service 5432 && exit 0 || sleep 3; done; exit 1"]
      containers:
      - name: my-django-app
        image: dockerhubuser/my-django-app
        command: ["/bin/sh", "-c", "python /root/django/manage.py migrate && python /root/django/manage.py runserver 0.0.0.0:8000 --noreload"]
        ports:
        - containerPort: 8000
        env:
          # ...
Run Code Online (Sandbox Code Playgroud)


Kun*_* Li 2

使用readiness探针或者init容器,参考这里