networkはじめにKubernetesには高度スケジューリングを行えるAPIが用意されていあるので、今回はまとめようと思います。どれもlabelを使って認識するのでその事前知識が必要です。Anti-AffinityとはPodかNodeにスケジュールされるのに対して、どのNodeにPodを配置するかや、どのPodをNodeが配置を許可するかのルールを示したものです。公式記事は以下のようになっています。Kubernetesこれからいくつかのセクションで分けて解説します。以下のようにAffinityには2つの種類があります。AffinityはどのNodeにPodが配置されるかのノードのラベルで識別したものを示したものです。高度なnodeSelectorです。指定方法はnodeSelectorTermsというものがあって、以下のように設定します。Anti-Affinityはその逆です。名前の通り、どのNodeに!?を選ぶようなものです。ここで出てきたoperatorについてはあとに解説します。この中でも2つの種類があります。指定したNodeにスケジュールされることを優先的にする。weightによって1~100で優先度を設定する。どちらも語尾についているIgnoredDuringExecutionは、ランタイムでラベルのノードが変更された時などはPodは終了しないことを意味しています。以下のようにspec.affinityに設定します。another-node-label-valueまた、Node-AntiAffintiyではtopologyKeyを指定することができますが、あとで解説します。Affinityとは公式ドキュメントではNodeがPodのラベルを識別してPodを受け入れるかを指定するルールと書かれています。特定のPodが動いていた時は受け入れないっといったようなことができるようになります。実質的にはPod同士のルールを定めてPodをスケジューリングするものです。注意点としては、大きなクラスタになるとスケジューリングコストがかかります。Affinityと同様です。指定したNodeにスケジュールされることを優先的にする以下のように設定します。k8s.gcr.io/pause:2.0ここで意味するところはpodAffinityについては新しいPodはもしsecurity=S1に対して同じゾーンで一つ以上あればPodはそのNodeにスケジュールされるpodAntiAffinityについては新しいPodはもしsecurity=S2に対して同じゾーンで一つ以上あればPodはそのNodeにスケジュールされないという意味である。Labelノードにはあらかじめ自動的にラベル付けされるものがあって、それも指定することができます。現在では以下のようなラベルがあります。Platformだと以下のようにすればプリエンティティブノードにスケジューリングされることを防ぐことができます。DoesNotExistoperator以下のようなoperatorの指定方法があります。ラベルの値が指定した値よりも小さい時topologyKeypodAffintiyなどを結果的にどのレベルで一緒に配置するのというものです。現在はまだベータ版ですが、以下の機能が実装されることが予定されています。何回も指定するのは面倒なので以下のように設定します。以下のようにクラスタを作成します。Nodeの数ですがデフォルトは3ですが、せっかくのスケジューリングの実証なので6にします。Nodeのスペックは高くなくていいので、以下のg1-smallに指定します。--machine-type=g1-small正しくクラスタが構築できたか確認してください。compute/region)そしてkubectlでアクセスできるようにcredentialを取得します。compute/region)ここでNodeを確認してください。Nodes以下のオプションでNodeの個数を指定することができます。typeどのインスタンスのタイプ化かを指定します。MACHINE_TYPE]スタンダートなものと、小さなものは以下の一覧から選べます。CloudNodeラベル何かnode全体にラベルを付けたければ以下のオプションがあります。今回はスケジューリングを見るので特に作らなくて大丈夫です。以下の公式DockerImageを使おうと思います。nginx:1.15.4-alpinenode:8.12.0-alpine実際にやっていく何も指定なし以下のように何も指定しません。80以下のようになっています。24mどのようにNodeにスケジューリングされたかというと以下のようになっています。以下のコマンドでスケールされることができます。deploy/nginx結果1つはどこも配置されて、あるところは2つになっているここで確率的に一つも配置されないケースもありえるので、再度試してみてください。nodeSelector次にspec.nodeSelectorでビルドインラベルが以下のようなものを指定しようと思います。kubernetes.io/hostnameがgke-affinitiy-test-default-pool-42bc3e7f-4v8rのもの。よって以下をdeploymentに付け足します。gke-affinitiy-test-default-pool-42bc3e7f-4v8rそしてデプロイします。結果リソースが限界に対しているのでひとつはスケジューリングできなかったですが他はうまくいってます。Affinity新しいラベルをNodeごとに割り当てるのは面倒なので、以下のようにします。狙った通り、二つに入れられています。Affinityこれは2つ目のイメージも使います。一つ目のreplica数を以下の用に変更します。1また、ラベルも付与しておきます。prod2つめのdeploymentは以下のようにします。kubernetes.io/hostnameユースケースとしてはnginx-podと一緒のnodeにnode-podを入れたい時です。以下のように一致しています。クリーンアップ検証用に使ったリソースを解放します。deploymentを消してください。nodeそしてクラスタを消してください。computer/region)以上です。まとめPod同士の配置は意識したことがなかったのでいい勉強になりました。Affinityのことです。ラベルによってPodを配置するNodeを選ぶことができる。以下のようにspec.nodeSelectorにつけるだけです。ssdそれで一致するラベルがあればスケジュールしてくれます。以下のコマンドでノードも付けることができます。<label-key>=<label-value>Podも同様に付けることはできますが、.yamlなどのファイルにつけて宣言的であることを保証するためにCLIで付けることは推奨しません。Quotaたとえばクラスタ作成のときに--num-nodesは10とするとクラスタを作成することができなく、以下のエラーがでます。Quota=リソースの分け前と呼ばれるもので、この場合だと作成できるノード数はリージョンによって指定されています。編集することができます。事前に知りたい時は以下のコマンドを走らせてください。私は新卒としてとある会社のエンジニアになったわけですが...2018-12-14CircleCIでSpinnakerのデプロイメントパイプラインをデプロイするどうも、もうすぐ大学卒業の@timtimtim1026です。»プロフィール学生エンジニア。忘れてしまうので備忘録です。flaskでServerlessにホストするTelepresence概論スターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。