我有一个包含以下条目的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中的健康检查等效是我已经创建的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
答案 0 :(得分:3)
虽然除了this link (k8s-AppController)之外我不知道问题的直接答案,但我认为对数据库和应用程序使用相同的部署并不明智。因为您正在将数据库与应用程序紧密耦合并丢失了令人敬畏的k8s选项,以根据需要扩展其中任何一个。更进一步,如果您的数据库pod崩溃,您也会丢失数据。
我个人要做的是为数据库和部署应用程序单独StatefulSet Persistent Volume并使用Service来确保他们的通信。
是的我必须运行几个不同的命令,可能需要至少两个单独的部署文件,但这样我将它们分离,并可以根据需要进行扩展。我的数据也很持久!
答案 1 :(得分:3)
这就是Docker Compose和Docker Swarm的美丽……它们的简单性。
我们在部署ELK堆栈时遇到了同样的Kubernetes缺点。 我们通过使用小车(initContainer)来解决了这个问题,这是同一个容器中首先运行的另一个容器,当它完成后,kubernetes会自动启动[main]容器。我们制作了一个简单的shell脚本,该脚本一直循环运行,直到Elasticsearch启动并运行,然后退出并启动Kibana的容器。
下面是一个等待格拉法纳(Grafana)准备就绪的小汽车的示例。
在Pod中的其他容器上方添加此“ initContainer”块:
spec:
initContainers:
- name: wait-for-grafana
image: darthcabs/tiny-tools:1
args:
- /bin/bash
- -c
- >
set -x;
while [[ "$(curl -s -o /dev/null -w ''%{http_code}'' http://grafana:3000/login)" != "200" ]]; do
echo '.'
sleep 15;
done
containers:
.
.
(your other containers)
.
.
答案 2 :(得分:2)
在Kubernetes中没有等效于docker swarm depends_on 的功能。 这种情况的解决方案是将helm charts用于kubernetes部署 在Helm中,您可以指定依赖项列表。 如今,Helm越来越流行,并且是管理复杂的kubernetes部署的好工具。
答案 3 :(得分:2)
这是故意遗漏的。原因是应用程序应负责其连接/重新连接逻辑,以连接到数据库之类的服务。这超出了Kubernetes的范围。
答案 4 :(得分:0)
在Kubernetes术语中,你的码头组合集是Pod。
所以,那里没有empty_vec <- c()
for (numbers in number_vec) {
sqrt<-sqrt(numbers)
empty_vec <- c(empty_vec,sqrt)
}
等价物。 Kubernetes将检查吊舱中的所有容器,并且它们都必须存活,以便将吊舱称为健康并始终将它们一起运行。
在您的情况下,您需要准备部署配置:
depends_on
启动pod之后,由于network conception,您的数据库将在 apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 1
template:
metadata:
labels:
app: app-and-db
spec:
containers:
- name: app
image: nginx
ports:
- containerPort: 80
- name: db
image: mysql
ports:
- containerPort: 3306
界面的stateful application in the Kubernetes上提供:
pod中的容器共享IP地址和端口空间,并且可以通过localhost找到彼此。他们还可以使用标准的进程间通信(如SystemV信号量或POSIX共享内存)相互通信。
但是,正如@leninhasda所提到的,在你的pod中运行数据库和应用程序并且没有持久卷也不是一个好主意。这是一个关于如何运行{{3}}的好教程。
答案 5 :(得分:0)
如前所述,您应该在单独的容器中运行数据库和应用程序容器,并将它们与服务连接。
不幸的是,Kubernetes和Helm都没有提供与您所描述的功能类似的功能。在此之前,我们遇到了很多问题,并尝试了几种方法,直到我们决定开发一个小型实用程序为我们解决了这个问题。
以下是我们开发的工具的链接:https://github.com/Opsfleet/depends-on
您可以根据自己的ReadinessProbe配置,让Pod等待直到其他Pod准备就绪。它与Docker的depends_on功能非常接近。