web-dev-qa-db-ja.com

Kubernetesのdepends_onに相当するものは何ですか

次のエントリを含む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ですが、ポッドでコンテナーの起動をどのように制御しますか?????

これに関する指示は大歓迎です。

私の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 
15
anish anil

これは意図的に除外されました。その理由は、データベースなどのサービスに接続するための接続/再接続ロジックをアプリケーションが担当する必要があるためです。これはKubernetesの範囲外です。

6
yomateo

それがDocker ComposeとDocker Swarmの美しさです...そのシンプルさ。

ELKスタックを展開するときに、この同じKubernetesの欠点に遭遇しました。サイドカー(initContainer)を使用して解決しました。これは、最初に実行される同じポッド内の別のコンテナーであり、完了すると、kubernetesは自動的に[メイン]コンテナーを開始します。 Elasticsearchが起動して実行されるまでループする単純なシェルスクリプトを作成し、終了してKibanaのコンテナーを起動します。

以下は、Grafanaの準備ができるまで待機するサイドカーの例です。

この「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)
          .
          .
8
David Cardoso

このリンク(k8s-AppController) 以外の質問に対する直接的な答えはわかりませんが、DBとアプリに同じ展開を使用するのが賢明とは思いません。データベースとアプリを密に結合し、必要に応じていずれかをスケーリングするための素晴らしいk8sオプションを失うためです。さらに、dbポッドが死んだ場合、データも失われます。

個人的に私がやることは、データベースとアプリの展開用に StatefulSet with Persistent Volume を用意し、 Service を使用して通信を確認することです。
はい、いくつかの異なるコマンドを実行する必要があり、少なくとも2つの個別のデプロイメントファイルが必要になる場合がありますが、この方法でそれらを分離し、必要に応じてスケーリングできます。そして、私のデータも永続的です!

4
leninhasda

Kubernetesにはdocker swarmdepends_onに相当するものはありません。このようなシナリオの解決策は、kubernetesの展開に helm charts を使用することです。Helmでは、依存関係リストを指定できます。 Helmは現在、非常に人気が高まっており、複雑なKubernetesの展開を管理するための優れたツールです。

https://helm.sh/

1
SHAHS

前述のように、データベースとアプリケーションコンテナーを個別のポッドで実行し、それらをサービスに接続する必要があります。

残念ながら、KubernetesとHelmの両方は、あなたが説明したような機能を提供していません。私たちはそれに関して多くの問題を抱えており、この問題を解決する小さなユーティリティを開発することを決定するまで、いくつかのアプローチを試みました。

開発したツールへのリンクは次のとおりです。 https://github.com/Opsfleet/depends-on

他のポッドがそのreadinessProbe構成に従って準備ができるまでポッドを待機させることができます。 Dockerのdepend_on機能に非常に近いです。

1
Leonid Mirsky

Kubernetesの用語では、docker-composeセットは Pod です。

したがって、depends_onに相当するものはありません。 Kubernetesはポッド内のすべてのコンテナーをチェックし、それらがすべてポッドが健全であるとマークするために生きていなければならず、常に一緒に実行します。

あなたの場合、そのようなデプロイメントの設定を準備する必要があります:

 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

ポッドが開始されると、 network conception :のため、データベースはアプリケーションのlocalhostインターフェイスで使用可能になります。

ポッド内のコンテナーはIPアドレスとポートスペースを共有し、localhostを介して相互に検索できます。また、SystemVセマフォやPOSIX共有メモリなどの標準のプロセス間通信を使用して相互に通信することもできます。

しかし、@ leninhasdaが言及したように、永続ボリュームなしでポッドでデータベースとアプリケーションを実行することはお勧めできません。 Kubernetesのステートフルアプリケーション の実行方法に関する優れたチュートリアルを次に示します。

0
Anton Kostenko