NotInとDoesNotExistはNode Anti-Affinity、またはPodを特定のNodeにスケジュールさせない場合に使われるTaintsに使用します。, nodeSelectorとnodeAffinityの両方を指定した場合、Podは両方の条件を満たすNodeにスケジュールされます。, nodeAffinity内で複数のnodeSelectorTermsを指定した場合、PodはいずれかのnodeSelectorTermsを満たしたNodeへスケジュールされます。, nodeSelectorTerms内で複数のmatchExpressionsを指定した場合にはPodは全てのmatchExpressionsを満たしたNodeへスケジュールされます。, PodがスケジュールされたNodeのラベルを削除したり変更しても、Podは削除されません。 手を動かす準備はできていますか?本チュートリアルでは、Node.jsを使った簡単な"Hello World"を実行するKubernetesクラスタをビルドします。. Stack Overflow. k8s-node:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 575ffdf9c5d3 3a093384ac30 "sleep 3600" 32 minutes ago Up 32 minutes k8s_busybox-02_sample-pod_default_8e79fad5-17c7-11e9-87b0-000c29cd2791_7 31381a2cd6a7 3a093384ac30 "sleep 3600" 32 minutes ago Up 32 minutes k8s_busybox-01_sample-pod… “IgnoredDuringExecution”の意味するところは、nodeSelectorの機能と同様であり、Nodeのラベルが変更され、Podがその条件を満たさなくなった場合でも 省略した場合や空の場合は、AffinityとAnti-Affinityが定義されたPodのnamespaceがデフォルトで設定されます。, requiredDuringSchedulingIgnoredDuringExecutionが指定されたAffinityとAnti-Affinityでは、matchExpressionsに記載された全ての条件が満たされるNodeにPodがスケジュールされます。, Inter-Pod AffinityとAnti-Affinityは、ReplicaSet、StatefulSet、Deploymentなどのより高レベルなコレクションと併せて使用すると更に有用です。 あるノードでPodを稼働させるためには、そのノードがラベルとして指定されたkey-valueペアを保持している必要があります(複数のラベルを保持することも可能です)。 https://kubernetes.io/docs/tutorials/kubernetes-basics/explore-intro/, 2章でDeploymentを作ったとき、KubernetesはアプリケーションをホストするためにPodを作成しました。 CLIから操作する方法.

以下のいずれかのKubernetesプレイグラウンドも使用できます: 上の出力を見ると、worker0にdisktype=ssdというラベルがあることがわかります。, 以下のPodの構成ファイルには、nodeSelectorにdisktype: ssdを持つPodが書かれています。これにより、Podはdisktype: ssdというラベルを持っているノードにスケジューリングされるようになります。, 構成ファイルを使用して、選択したノードにスケジューリングされるPodを作成します。, nodeNameという設定を使用して、Podを特定のノードにスケジューリングすることもできます。, 構成ファイルを使用して、foo-nodeにだけスケジューリングされるPodを作成します。. requiredDuringSchedulingIgnoredDuringExecutionを指定するAffinityの使用例は、”Service AのPodとService BのPodが密に通信する際、それらを同じゾーンで稼働させる場合”です。 また、preferredDuringSchedulingIgnoredDuringExecutionを指定するAnti-Affinityの使用例は、”ゾーンをまたいでPodのサービスを稼働させる場合”(Podの数はゾーンの数よりも多いため、必須条件を指定すると合理的ではありません)です。, Inter-Pod Affinityは、PodSpecのaffinityフィールド内にpodAffinityで指定し、Inter-Pod Anti-Affinityは、podAntiAffinityで指定します。, このPodのAffifnityは、Pod AffinityとPod Anti-Affinityを1つずつ定義しています。 チュートリアル、サンプルやドキュメントのリファレンスを使って Kubernetes の利用方法を学んでください。あなたはドキュメントへコントリビュートをすることもできます!

Nodeの隔離にラベルのプレフィックスを使用するためには、以下の3点を確認してください。, nodeSelectorはPodの稼働を特定のラベルが付与されたNodeに制限する最も簡単な方法です。

Podは必ずNode上で実行されます。 NodeはKubernetesのワーカーマシンで、仮想マシンか物理マシンです。 それぞれのNodeはMasterに管理されます。 ひとつのNodeは複数のPodを持てます。 Masterはクラスタ内のノード全体でPod … ラベルの作成: kubectl label pod/nginx foo=bar ラベルの更新: kubectl label --overwrite pod/nginx foo=bar ラベルの削除: kubectl label pod…

概念的に、XはNodeや、ラック、クラウドプロバイダゾーン、クラウドプロバイダのリージョン等を表すトポロジードメインです。 ここに値が設定されると、schedulerはそのPodを考慮しなくなり、その名前が付与されているNodeのkubeletはPodを稼働させようとします。 原則として、topologyKeyには任意のラベルとキーが使用できます。 Workloadが、Node等の定義された同じトポロジーに共存させるよう、簡単に設定できます。, 3つのノードから成るクラスターでは、ウェブアプリケーションはredisのようにインメモリキャッシュを保持しています。 同様の方法で、Anti-Affinityを用いて高可用性を実現したStatefulSetの使用例はZooKeeper tutorialを参照してください。, nodeNameはNodeの選択を制限する最も簡単な方法ですが、制約があることからあまり使用されません。

例として以下のconfigファイルを扱います: kubectl apply -f https://k8s.io/examples/pods/pod-nginx.yamlにより、Podは先ほどラベルを付与したNodeへスケジュールされます。 Pod Affinityは、「キーが”security”、値が”S1”のラベルが付与されたPodが少なくとも1つは稼働しているNodeが同じゾーンにあれば、PodはそのNodeにスケジュールされる」という条件を指定しています(より正確には、キーが”security”、値が”S1”のラベルが付与されたPodが稼働しており、キーがfailure-domain.beta.kubernetes.io/zone、値がVであるNodeが少なくとも1つはある状態で、 には、Taintsの要点に関して様々な背景が紹介されています。. そして、ラベルを付与するNodeを選び、kubectl label nodes =で選択したNodeにラベルを付与します。 これらを表すためにシステムが使用するNode LabelのキーであるtopologyKeyを使うことで、トポロジードメインを指定することができます。

環境変数の一覧を取得してみましょう。, ログのときと同じように、Pod内にひとつしかコンテナがないのでコンテナの名前は省略できます。, Node.jsアプリケーションを起動しているコンテナでコンソールを開けました。 全てのレプリカがapp=storeのラベルが付与されたPodと同じゾーンで稼働するよう、スケジューラーに設定されます。 Podは1個または2個以上のアプリケーションコンテナのグループを表す概念で、Pod内のコンテナ群はいくつかのリソースを共有しています。 Podが稼働するNodeを特定のものに指定したり、優先条件を指定して制限することができます。 この例では、podAffinityにrequiredDuringSchedulingIgnoredDuringExecution、podAntiAffinityにpreferredDuringSchedulingIgnoredDuringExecutionが設定されています。 最も一般的な使用方法は、1つのkey-valueペアを付与する方法です。, この例では、KubernetesのPodに関して基本的な知識を有していることと、Kubernetesクラスターのセットアップがされていることが前提となっています。, kubectl get nodesで、クラスターのノードの名前を取得してください。 将来的には、requiredDuringSchedulingIgnoredDuringExecutionに、PodのNode Affinityに記された必須要件を満たさなくなったNodeからそのPodを退避させることができる機能を備えたrequiredDuringSchedulingRequiredDuringExecutionが提供される予定です。, それぞれの使用例として、

KubernetesにDeploymentを作るとき、Deploymentはコンテナを直接作るのではなく、コンテナを内包したPod(群)を作成します。 Node. が使用できる。, また、LabelのValueはKeyのNameと同じで、63文字以下で上記の正規表現に従っている必要がある。, ラベルを指定するするにはManifestを使用する方法とCLIから操作する方法がある。, Manifestを使ったラベルの指定は metadata.labels に記述する。以下のような感じ。, Labelはkubectlから操作することも可能だ。 kubectl label コマンドで行う。, 削除の時だけ少し特殊で、Keyの最後に - をつけることで対象のLabelを削除することができる。, Podの取得は kubectl get po でできるが、 --show-labels オプションを付けることでLabelも表示することができる。, それではCLIからラベルを付けてみよう。foo=bar というラベルを付けるため kubectl label pod/nginx foo=bar を実行してみる。, 削除も試してみよう。 kubectl label pod/nginx fooi- を実行する。, NodeSelectorはPodを特定のNodeへスケジューリングする仕組みだ。Selectorと書いてあるから予測できるかと思うが、ここにもLabelSelectorを使う。, NodeのLabelとNodeSelectorの条件がマッチしたNodeに対してスケジューリングされるようになる。, NodeSelectorはPodの spec.nodeSelector に指定をする。但し、このNodeSelectorは matchExpressions は使えず、完全一致での比較のみになる。, nodeSelector に environment=dev を指定した。 これを適用してみよう。, スケジューリングに失敗しているのがわかる。 nodeSelector で指定した対象がなかったようだ。, ローカル環境だと有り難みが薄いが、実際に複数のNodeがあるクラスタなどでは活用できる機能だ。例えば, などなど。実際にマネージドサービスなどで複数Nodeのクラスタを立ち上げて動作を確認すると理解が進むと思う。, Annotationはオブジェクトに対してKey/Valueの形式でMetadataを登録できる仕組みだ。, 構文と使用できる文字列はLabelと同様だ。Valueについては特に使用文字や長さについて成約がない。, 使用方法はManifestで metadata.annotations に指定するか、 kubectl annotate コマンドで操作をする。, 具体的な操作方法はLabelと全く同じためManifestの例だけ記載して適用などについては省略させていただく。, 次回はAffinity / Anti-Affinity / Taint / Tolerationについて見ていこう。, Kubernetes道場 18日目 - Affinity / Anti-Affinity / Taint / Tolerationについて, Kubernetes道場 17日目 - Label / NodeSelector / Annotationについて.