首页 文章

kubernetes中depends_on的等价物是什么

提问于
浏览
2

我有一个包含以下条目的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 回答

  • 0

    有目的地遗漏了这一点 . 原因是应用程序应负责连接/重新连接逻辑以连接到服务(如数据库) . 这超出了Kubernetes的范围 .

  • 2

    虽然除了this link (k8s-AppController)之外我不知道您的问题的直接答案,但我还是明智地对数据库和应用程序使用相同的部署 . 因为您正在将数据库与应用程序紧密耦合并丢失了令人敬畏的k8s选项,以根据需要扩展其中任何一个 . 更进一步,如果您的数据库pod死亡,您也会丢失数据 .

    我个人会做的是为数据库和部署应用程序单独StatefulSetPersistent Volume并使用Service以确保他们的通信 .
    是的我必须运行几个不同的命令,可能需要至少两个单独的部署文件,但这样我将它们分离,并可以根据需要进行扩展 . 我的数据也很持久!

  • 1

    没有相当于kubernetes中的docker swarm depends_on . 这种情况的解决方案是使用helm charts进行kubernetes部署在Helm中,您可以指定依赖关系列表 . Helm现在变得越来越流行,是管理复杂kubernetes部署的绝佳工具 .

    https://helm.sh/

  • 1

    如上所述,您应该在单独的pod中运行数据库和应用程序容器,并将它们与服务连接起来 .

    不幸的是,Kubernetes和Helm都没有提供类似于你所描述的功能 . 我们遇到了很多问题并尝试了一些方法,直到我们决定开发一个小型实用程序来解决这个问题 .

    这里发展了's the link to the tool we':https://github.com/Opsfleet/depends-on

    您可以根据其readyinessProbe配置使pod等待其他pod变为就绪状态 . 它非常接近Docker的depends_on功能 .

  • 0

    在Kubernetes术语中,你的docker-compose集是一个Pod .

    所以,那里没有 depends_on 等价物 . Kubernetes将检查一个容器中的所有容器,它们都必须存活,以获得一个标记为pod作为Healthy并将始终将它们一起运行 .

    在您的情况下,您需要准备部署配置,如下所示:

    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

    Pod中的容器共享IP地址和端口空间,并可通过localhost找到彼此 . 他们还可以使用标准的进程间通信(如SystemV信号量或POSIX共享内存)相互通信 .

    但是,正如@leninhasda所提到的,在你的pod中运行数据库和应用程序并且没有持久卷也不是一个好主意 . 这是一个关于如何运行stateful application in the Kubernetes的好教程 .

相关问题