我有2项服务。一个包含2个pod副本用于Web应用程序,该副本依赖于具有用于MySQL容器的pod(2个副本)的另一个后端服务。
Web应用程序使用后端数据库服务设置的环境变量。我把所有的json放在同一个目录里。
有没有办法表达依赖关系,以便kubectl在启动Web应用程序服务之前始终创建(并运行)后端pod和服务?我使用kubedeam来创建集群。
答案 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:
# ...