kubernetes

时间:2018-03-19 16:38:27

标签: kubernetes kubectl kubernetes-helm kubeadm

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

6 个答案:

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

https://helm.sh/

答案 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功能非常接近。