セレクターフィールドは、Deploymentが管理するポッドを見つける方法を定義します。
しかし、デプロイを作成するとき、デプロイの一部としてポッドテンプレートをすでに指定しています。では、なぜセレクタも必要になるのでしょうか?
ポッドはすでに個別に開始されているが、後でデプロイメントの傘下にまとめて管理されるサービスのように使用することを想定していますか?
この質問への回答は、kubernetes.ioのセクション Deployments で確認できます。
では、なぜセレクタも必要になるのでしょうか?
以下からの引用 k8s v 1.14のドキュメント
.spec.selector
はrequiredフィールドであり、このデプロイメントのターゲットとなるポッドのラベルセレクターを指定します。
.spec.selector
一致している必要があります.spec.template.metadata.labels
、またはAPIによって拒否されます。APIバージョンapps/v1では、.spec.selectorおよび.metadata.labelsは、設定されていない場合、デフォルトで.spec.template.metadata.labelsになりません。 そのため、明示的に設定する必要があります。また、apps/v1でDeploymentを作成した後、.spec.selectorは不変であることに注意してください。
テンプレートが.spec.templateと異なる場合、またはそのようなポッドの総数が.spec.replicasを超える場合、Deploymentはラベルがセレクタと一致するポッドを終了する場合があります。ポッドの数が必要な数より少ない場合は、.spec.templateで新しいポッドが表示されます。
ポッドは既に個別に開始されていますが、後でデプロイメントの傘下にまとめて管理しますか?
簡単に言えば、いいえ
注:別の
Deployment
を作成するか、ReplicaSet
やReplicationController
などの別のコントローラーを作成して、このセレクターとラベルが一致する他のポッドを作成しないでください。その場合、最初のDeployment
は、これらの他のポッドを作成したと考えます。Kubernetes
を使用しても、これを止めることはできません。セレクタが重複しているコントローラが複数ある場合、コントローラは互いに競合し、正しく動作しません。