我有一个包含以下条目的docker compose文件
version: '2.1'
services:
mysql:
container_name: mysql
image: mysql:latest
volumes:
- ./mysqldata:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: 'password'
ports:
- '3306:3306'
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3306"]
interval: 30s
timeout: 10s
retries: 5
test1:
container_name: test1
image: test1:latest
ports:
- '4884:4884'
- '8443'
depends_on:
mysql:
condition: service_healthy
links:
- mysql
Test-1容器依赖于mysql,它需要启动并运行 .
在docker中,可以使用运行状况检查和depends_on属性来控制它 . kubernetes中的 Health 检查等价物是我已经创建的readinessprobe但是我们如何控制pod中的容器启动?????
任何方向都非常感谢 .
我的Kubernetes档案:
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: deployment
spec:
replicas: 1
template:
metadata:
labels:
app: deployment
spec:
containers:
- name: mysqldb
image: "dockerregistry:mysqldatabase"
imagePullPolicy: Always
ports:
- containerPort: 3306
readinessProbe:
tcpSocket:
port: 3306
initialDelaySeconds: 15
periodSeconds: 10
- name: test1
image: "dockerregistry::test1"
imagePullPolicy: Always
ports:
- containerPort: 3000
5 回答
有目的地遗漏了这一点 . 原因是应用程序应负责连接/重新连接逻辑以连接到服务(如数据库) . 这超出了Kubernetes的范围 .
虽然除了this link (k8s-AppController)之外我不知道您的问题的直接答案,但我还是明智地对数据库和应用程序使用相同的部署 . 因为您正在将数据库与应用程序紧密耦合并丢失了令人敬畏的k8s选项,以根据需要扩展其中任何一个 . 更进一步,如果您的数据库pod死亡,您也会丢失数据 .
我个人会做的是为数据库和部署应用程序单独StatefulSet与Persistent Volume并使用Service以确保他们的通信 .
是的我必须运行几个不同的命令,可能需要至少两个单独的部署文件,但这样我将它们分离,并可以根据需要进行扩展 . 我的数据也很持久!
没有相当于kubernetes中的docker swarm depends_on . 这种情况的解决方案是使用helm charts进行kubernetes部署在Helm中,您可以指定依赖关系列表 . Helm现在变得越来越流行,是管理复杂kubernetes部署的绝佳工具 .
https://helm.sh/
如上所述,您应该在单独的pod中运行数据库和应用程序容器,并将它们与服务连接起来 .
不幸的是,Kubernetes和Helm都没有提供类似于你所描述的功能 . 我们遇到了很多问题并尝试了一些方法,直到我们决定开发一个小型实用程序来解决这个问题 .
这里发展了's the link to the tool we':https://github.com/Opsfleet/depends-on
您可以根据其readyinessProbe配置使pod等待其他pod变为就绪状态 . 它非常接近Docker的depends_on功能 .
在Kubernetes术语中,你的docker-compose集是一个Pod .
所以,那里没有
depends_on
等价物 . Kubernetes将检查一个容器中的所有容器,它们都必须存活,以获得一个标记为pod作为Healthy并将始终将它们一起运行 .在您的情况下,您需要准备部署配置,如下所示:
在启动pod之后,您的数据库将在
localhost
接口上为您的应用程序提供,因为network conception:但是,正如@leninhasda所提到的,在你的pod中运行数据库和应用程序并且没有持久卷也不是一个好主意 . 这是一个关于如何运行stateful application in the Kubernetes的好教程 .