Kubernetes Multi-Pod Deploymentの設定方法

k8sのDeploymentオブジェクトでデプロイメントを管理し、アプリケーションクラスタをデプロイしたいと思っています。ドキュメントを見ると、非常に混乱してしまいます。私の基本的なレイアウトには、独立してスケールする以下のコンポーネントがあります。

1.APIサーバー 2.UIサーバー 3.Redisキャッシュ 4.タイマー/スケジュールタスクサーバー

技術的には、上記の4つはすべて別々のPodに属し、独立してスケーリングされます。

私の質問は

1.1. Pod.ymlファイルを作成し、それをdeployment.ymlファイルで参照する必要がありますか? それとも、デプロイメントファイルにも Pod 定義を埋め込むことができますか? 2.2. K8sのドキュメントでは、Deploymentspec` 部分は one ポッドの定義と同等であると示唆しているようです。これは正しいですか?3.複数のポッドのデプロイメントを宣言的に記述したい場合はどうすればよいですか?複数の deployment.yml ファイルが必要なのでしょうか?

ソリューション

Pagidsの回答は基本的なことをほとんど網羅しています。あなたのシナリオのために4つのDeploymentsを作成する必要があります。各展開は、DeploymentのためのPODのコレクションをスケジュールし、監督するReplicaSetを作成します。

それぞれの Deployment は、アクセスするために、その前に Service を必要とすることがほとんどです。私は通常、一つの yaml ファイルを作成して、その中に Deployment とそれに対応する Service を作成する。以下は、私が使用している nginx.yaml の例です。

apiVersion: v1
kind: Service
metadata:
  annotations:
    service.alpha.kubernetes.io/tolerate-unready-endpoints: "true"
  name: nginx
  labels:
    app: nginx
spec:
  type: NodePort
  ports:
  - port: 80
    name: nginx
    targetPort: 80
    nodePort: 32756
  selector:
    app: nginx
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginxdeployment
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginxcontainer
        image: nginx:latest
        imagePullPolicy: Always
        ports:
        - containerPort: 80

以下は、説明のための追加情報です。

  • PODはスケーラブルなユニットではありません。POD をスケジュールするDeployment` はそうです。
  • デプロイメント(Deployment)は、1つの目的を果たすPODの1つのグループを表すためのものです。
  • クラスタの仮想ネットワーク上では、多くの Deployment を一緒に動作させることができます。
  • 異なるノードで動作している多くの POD からなる Deployment にアクセスするには、サービスを作成する必要があります。
  • Deploymentはステートレスなサービスを含むことを意図しています。状態を保存する必要がある場合は、代わりに StatefulSet を作成する必要があります (例: データベースサービス用)。
解説 (11)

KubernetesのAPI referenceにあるDeploymentで、spec->templateフィールドが[PodTemplateSpec]という型になっていることがわかります3。そして関連コメント(Template descriptions the pods that will be created. )とともに質問に答えてくれています。もちろん、より長い説明は、Deployment user guide に記載されています。

あなたの質問に答えるために...

  1. ポッドはデプロイメントによって管理され、デプロイメントによって必要に応じて作成されるため、別々に定義しても意味がありません。同じポッドタイプのレプリカが複数存在する可能性があることを念頭に置いてください。

  2. リスト内の各アプリケーションについて、1つの Deployment を定義する必要があります。これは、レプリカ数の違いとアプリケーションのロールアウトに関しても意味があります。

3)3) 質問されていませんが、関連しています - 別の Deployments と共に、各アプリケーションは専用の Service を必要とし、他のアプリケーションはそれにアクセスすることができます。

解説 (6)