Gau*_*mar 7 kubernetes kubectl kubernetes-helm
我有2个服务。一个包含2个用于Web应用程序的pod副本,该副本依赖于另一个后端服务,该后端服务具有用于MySQL容器的pod(2个副本)。
Web应用程序使用后端数据库服务设置的环境变量。我将所有json都放在同一目录中。
有什么方法可以表达依赖关系,以便kubectl在启动Web应用程序服务之前始终创建(并运行)后端Pod和服务?我已经使用kubedeam创建了集群。
我可以提出两种解决方案:
首先,将一个初始化容器附加到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。它允许您在服务器和数据库部署之间根据需要创建依赖项对象。检查他们的仓库以获取完整的文档。
遇到同样的问题并且按照他们的建议,使用 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)
| 归档时间: |
|
| 查看次数: |
4907 次 |
| 最近记录: |