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 部署的好工具。

https://helm.sh/

这是故意遗漏的。原因是应用程序应该负责其 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)
          .
          .

https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/

活跃度和准备度如何???支持命令、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