kubernetes 中 depends_on 的等价物是什么
What is the equivalent for depends_on in kubernetes
我有一个 docker 包含以下条目的撰写文件
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
虽然除了 this link (k8s-AppController) 之外我不知道您问题的直接答案,但我认为对数据库和应用程序使用相同的部署是不明智的。因为您将数据库与应用程序紧密耦合,并且失去了很棒的 k8s 选项以根据需要扩展其中的任何一个。此外,如果您的 db pod 挂掉,您的数据也会丢失。
就我个人而言,我会做的是有一个单独的 StatefulSet with Persistent Volume for database and Deployment for app and use Service 来确保他们的沟通。
是的,我必须 运行 几个不同的命令,并且可能至少需要两个单独的部署文件,但通过这种方式,我可以将它们解耦并可以根据需要扩展它们。我的数据也是持久的!
在 Kubernetes 术语中,您的 docker-compose 集是 Pod。
所以,那里没有 depends_on
等价物。 Kubernetes 将检查 pod 中的所有容器,并且它们都必须处于活动状态才能将 pod 标记为健康,并且始终 运行 它们在一起。
在您的情况下,您需要像这样准备 Deployment 配置:
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
pod 启动后,您的数据库将在您的应用程序的 localhost
界面上可用,因为 network conception:
Containers within a pod share an IP address and port space, and can find each other via localhost. They can also communicate with each other using standard inter-process communications like SystemV semaphores or POSIX shared memory.
但是,正如@leninhasda 提到的,在没有 Persistent Volume 的情况下 运行 数据库和应用程序并不是一个好主意。这是一个关于如何 运行 a stateful application in the Kubernetes.
的好教程
如前所述,您应该 运行 将数据库和应用程序容器分开 pods 并将它们与服务连接。
不幸的是,Kubernetes 和 Helm 都没有提供类似于您所描述的功能。我们遇到了很多问题并尝试了一些方法,直到我们决定开发一个小型实用程序来为我们解决这个问题。
这是我们开发的工具的link:https://github.com/Opsfleet/depends-on
您可以让 pods 等待其他 pods 根据其 readinessProbe 配置准备就绪。它非常接近 Docker 的 depends_on 功能。
在 kubernetes 中没有等同于 docker swarm depends_on 的东西。
这种情况的解决方案是使用 helm charts 进行 kubernetes 部署
在 Helm 中,您可以指定依赖列表。
Helm 现在越来越受欢迎,是管理复杂 kubernetes 部署的好工具。
这是故意遗漏的。原因是应用程序应该负责其 connect/re-connect 连接到服务(如数据库)的逻辑。这超出了 Kubernetes 的范围。
这就是 Docker Compose 和 Docker Swarm 的美妙之处……它们的简单性。
我们在部署 ELK 堆栈时遇到了同样的 Kubernetes 缺点。
我们通过使用 side-car (initContainer) 来解决它,它只是同一个 pod 中的另一个容器,首先是 运行,当它完成时,kubernetes 会自动启动 [main] 容器。我们将其设为一个简单的 shell 脚本,该脚本会一直循环,直到 Elasticsearch 启动并 运行ning,然后它退出并启动 Kibana 的容器。
下面是等待 Grafana 准备就绪的边车示例。
将此 'initContainer' 块添加到 Pod 中其他容器的正上方:
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)
.
.
活跃度和准备度如何???支持命令、http 请求等
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-exec
spec:
containers:
- name: liveness
image: k8s.gcr.io/busybox
args:
- /bin/sh
- -c
- touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5
periodSeconds: 5
我有一个 docker 包含以下条目的撰写文件
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
虽然除了 this link (k8s-AppController) 之外我不知道您问题的直接答案,但我认为对数据库和应用程序使用相同的部署是不明智的。因为您将数据库与应用程序紧密耦合,并且失去了很棒的 k8s 选项以根据需要扩展其中的任何一个。此外,如果您的 db pod 挂掉,您的数据也会丢失。
就我个人而言,我会做的是有一个单独的 StatefulSet with Persistent Volume for database and Deployment for app and use Service 来确保他们的沟通。
是的,我必须 运行 几个不同的命令,并且可能至少需要两个单独的部署文件,但通过这种方式,我可以将它们解耦并可以根据需要扩展它们。我的数据也是持久的!
在 Kubernetes 术语中,您的 docker-compose 集是 Pod。
所以,那里没有 depends_on
等价物。 Kubernetes 将检查 pod 中的所有容器,并且它们都必须处于活动状态才能将 pod 标记为健康,并且始终 运行 它们在一起。
在您的情况下,您需要像这样准备 Deployment 配置:
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
pod 启动后,您的数据库将在您的应用程序的 localhost
界面上可用,因为 network conception:
Containers within a pod share an IP address and port space, and can find each other via localhost. They can also communicate with each other using standard inter-process communications like SystemV semaphores or POSIX shared memory.
但是,正如@leninhasda 提到的,在没有 Persistent Volume 的情况下 运行 数据库和应用程序并不是一个好主意。这是一个关于如何 运行 a stateful application in the Kubernetes.
的好教程如前所述,您应该 运行 将数据库和应用程序容器分开 pods 并将它们与服务连接。
不幸的是,Kubernetes 和 Helm 都没有提供类似于您所描述的功能。我们遇到了很多问题并尝试了一些方法,直到我们决定开发一个小型实用程序来为我们解决这个问题。
这是我们开发的工具的link:https://github.com/Opsfleet/depends-on
您可以让 pods 等待其他 pods 根据其 readinessProbe 配置准备就绪。它非常接近 Docker 的 depends_on 功能。
在 kubernetes 中没有等同于 docker swarm depends_on 的东西。 这种情况的解决方案是使用 helm charts 进行 kubernetes 部署 在 Helm 中,您可以指定依赖列表。 Helm 现在越来越受欢迎,是管理复杂 kubernetes 部署的好工具。
这是故意遗漏的。原因是应用程序应该负责其 connect/re-connect 连接到服务(如数据库)的逻辑。这超出了 Kubernetes 的范围。
这就是 Docker Compose 和 Docker Swarm 的美妙之处……它们的简单性。
我们在部署 ELK 堆栈时遇到了同样的 Kubernetes 缺点。 我们通过使用 side-car (initContainer) 来解决它,它只是同一个 pod 中的另一个容器,首先是 运行,当它完成时,kubernetes 会自动启动 [main] 容器。我们将其设为一个简单的 shell 脚本,该脚本会一直循环,直到 Elasticsearch 启动并 运行ning,然后它退出并启动 Kibana 的容器。
下面是等待 Grafana 准备就绪的边车示例。
将此 'initContainer' 块添加到 Pod 中其他容器的正上方:
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)
.
.
活跃度和准备度如何???支持命令、http 请求等
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-exec
spec:
containers:
- name: liveness
image: k8s.gcr.io/busybox
args:
- /bin/sh
- -c
- touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5
periodSeconds: 5