nekop's blog

OpenShift / JBoss / WildFly / Infinispanの中の人 http://twitter.com/nekop

OpenShiftのnodeSelector

OpenShiftのpodはnodeSelectorによって利用するノードが決まります。nodeSelectorにはざっくり2つのレベルがあり、projectのnodeSelectorとDeploymentConfigのnodeSelectorがあります。

上位のproject (namespace)レベルのnodeSelectorは、openshift.io/node-selectorアノテーションで指定されます。このプロジェクトのpodは全てこのregion=infraラベルの付与されたノード群にしかデプロイされません。

$ oc describe project default
Name:           default
Created:        18 hours ago
Labels:         <none>
Annotations:        openshift.io/node-selector=region=infra
            openshift.io/sa.initialized-roles=true
            openshift.io/sa.scc.mcs=s0:c1,c0
            openshift.io/sa.scc.supplemental-groups=1000000000/10000
            openshift.io/sa.scc.uid-range=1000000000/10000
Display Name:       <none>
Description:        <none>
Status:         Active
Node Selector:      region=infra
Quota:          <none>

アノテーションの付与にはoc annotate namespaceを利用します。projectはnamespaceのエイリアスでread-onlyなので、projectは更新できません。

oc annotate namespace default openshift.io/node-selector=region=infra

projectのnodeSelectorのデフォルトはmaster-config.xmlprojectConfig: defaultNodeSelectorに定義できます。プロジェクトにこのopenshift.io/node-selectorアノテーションが付与されていない場合は、defaultNodeSelectorが暗黙で適用されます。

/etc/origin/master/master-config.xml

projectConfig:
  defaultNodeSelector: region=primary

project (namespace)の書き換えはOpenShift管理者の権限が必要で、ユーザはprojectレベルのnodeSelectorを超えてpodをデプロイすることはできません。これを利用して、OpenShift管理者は特定のプロジェクトに専用のノードを割り当てたりすることができます。

ユーザはDeploymentConfigに追加でnodeSelectorを指定できます。例えば地域ごとにノード群にzone=tokyo1などのラベルを付与しておくことで、ユーザはnodeSelectorを指定してレイテンシの低いローカル地域のノード群にpodをデプロイ、というようなことが可能になります。

template:
  spec:
    nodeSelector:
      zone: tokyo1