次のエントリを含む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
これは意図的に除外されました。その理由は、データベースなどのサービスに接続するための接続/再接続ロジックをアプリケーションが担当する必要があるためです。これはKubernetesの範囲外です。
それが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)
.
.
このリンク(k8s-AppController) 以外の質問に対する直接的な答えはわかりませんが、DBとアプリに同じ展開を使用するのが賢明とは思いません。データベースとアプリを密に結合し、必要に応じていずれかをスケーリングするための素晴らしいk8sオプションを失うためです。さらに、dbポッドが死んだ場合、データも失われます。
個人的に私がやることは、データベースとアプリの展開用に StatefulSet with Persistent Volume を用意し、 Service を使用して通信を確認することです。
はい、いくつかの異なるコマンドを実行する必要があり、少なくとも2つの個別のデプロイメントファイルが必要になる場合がありますが、この方法でそれらを分離し、必要に応じてスケーリングできます。そして、私のデータも永続的です!
Kubernetesにはdocker swarmdepends_onに相当するものはありません。このようなシナリオの解決策は、kubernetesの展開に helm charts を使用することです。Helmでは、依存関係リストを指定できます。 Helmは現在、非常に人気が高まっており、複雑なKubernetesの展開を管理するための優れたツールです。
前述のように、データベースとアプリケーションコンテナーを個別のポッドで実行し、それらをサービスに接続する必要があります。
残念ながら、KubernetesとHelmの両方は、あなたが説明したような機能を提供していません。私たちはそれに関して多くの問題を抱えており、この問題を解決する小さなユーティリティを開発することを決定するまで、いくつかのアプローチを試みました。
開発したツールへのリンクは次のとおりです。 https://github.com/Opsfleet/depends-on
他のポッドがそのreadinessProbe構成に従って準備ができるまでポッドを待機させることができます。 Dockerのdepend_on機能に非常に近いです。
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のステートフルアプリケーション の実行方法に関する優れたチュートリアルを次に示します。