我们如何使用kubernetes

时间:2018-06-13 13:10:25

标签: kubernetes kubectl kubernetes-helm

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

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

有没有办法表达依赖关系,以便kubectl在启动Web应用程序服务之前始终创建(并运行)后端pod和服务?我使用kubedeam来创建集群。

3 个答案:

答案 0 :(得分:5)

我可以建议两种解决方案:

首先,将一个init容器附加到等待MySQL启动并运行的Web服务器上。部署将是这样的:

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

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

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

答案 1 :(得分:2)

使用就绪探针或初始容器,请参阅here

答案 2 :(得分:1)

使用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:
          # ...