Oracle WebLogic Operator チュートリアル

ノードに対するWebLogicのPodの割り当て

管理対象サーバ(のPod)を作成すると、KubernetesスケジューラはそのPodが稼働するノードを選択します。スケジューラは、リソースの種別毎にスケジュールされたコンテナが要求するリソースの総量がノードの容量よりも少ないことを確認します。ノード上のメモリやCPUリソースの実際の使用率が極めて少ない場合であっても、ノードの容量チェックに失敗したノードに対してはPodを割り当てません。

特定のノード状にのみPodを配置するように制約するために nodeSelector を利用してアフィニティを作成できます。但し、通常はそのような制約は必要ありません。スケジューラは自動的に合理的な配置を行いますが、以下のようにPodがどこに配置されるかを制御したい場合もあります。

  • SSDが搭載されるノードに確実にPodを配置したい
  • 同一の可用性ゾーンで頻繁に通信しあう2つの異なるサービスのPodを同居させたい
  • 可用性をより高めるためにPodを異なる可用性ゾーンに配置したい
  • メンテナンス目的であるノード上から全てのPodを移動したい
  • あるソフトウェアのライセンスが与えられたノード上でだけにPadを配置したい

今回のハンズオンでは、個々の管理対象サーバやドメイン全体を特定のノードに割り当てる方法を学びます。

アフィニティの作成

特定のサーバを指定したノードに配置する

ノードにPodを割り当てるためには、カスタム・タグが付与された期待するノードのラベルが必要です。 ドメイン・リソース定義の nodeSelector プロパティを定義し、ノードに適用されているラベルを値として設定します。最後にドメイン設定の変更を反映します。

最初に kubectl get node を使用してノード名を取得します。

$ kubectl get node
NAME             STATUS    ROLES     AGE       VERSION
130.61.110.174   Ready     node      11d       v1.11.5
130.61.52.240    Ready     node      11d       v1.11.5

OKEの場合、ノード名はパブリックIPアドレスやサブネットのCIDRブロックの最初のIPアドレスになることがあります。但し、明確にはノードを特定するユニークな文字列です。

それでは、Podの詳細な情報 kubectl get pod -n sample-domain1-ns -o wide を利用して、現時点のPodの配置を確認しましょう。

$ kubectl get pod -n sample-domain1-ns -o wide
NAME                             READY     STATUS    RESTARTS   AGE       IP            NODE             NOMINATED NODE
sample-domain1-admin-server      1/1       Running   0          2m        10.244.2.33   130.61.110.174     <none>
sample-domain1-managed-server1   1/1       Running   0          1m        10.244.1.8    130.61.52.240    <none>
sample-domain1-managed-server2   1/1       Running   0          1m        10.244.0.10   130.61.110.174   <none>
sample-domain1-managed-server3   1/1       Running   0          1m        10.244.2.34   130.61.52.240     <none>

今回のハンズオンでは、トライアル環境のため、ワーカー・ノードを2つしか作成できません。そのため、管理対象サーバがいずれかのノードに偏った配置になっていることが確認できます。(上記の場合は、130.61.52.240のノードに偏っています)
今回は、現状の配置を変更することで、個々の管理対象サーバを特定のノードに割り当てる方法を学びます。ラベルを設定してドメイン・リソース定義をそれに応じて修正するだけです。

Note

ワーカー・ノードが3つ存在する環境の場合は、3つの管理対象サーバが3つのワーカー・ノードに均等に配置されていることが確認できます。このケースでは1つのノードを退避することができます。

ラベルの設定

ノードにラベルを設定します。どのような名前でも大丈夫ですが、ここでは wlservers1wlservers2 を使いましょう。kubectl label nodes <nodename> <labelname>=true コマンドを実行してラベル名を正確に置き換えてください。

$ kubectl label nodes 130.61.110.174 wlservers1=true
node/130.61.110.174 labeled
$ kubectl label nodes 130.61.52.240 wlservers2=true
node/130.61.52.240 labeled
ドメイン・リソース定義の変更

定義の変更を適用する前に、一度ドメイン・リソース定義を削除します。
以下のコマンドを実行してください。

$ kubectl delete -f /u01/domain.yaml
podが完全に削除されるまで待機します。以下のような出力が得られればpodが削除されています。
$ kubectl get po -n sample-domain1-ns -o wide
No resources found in sample-domain1-ns namespace.

domain.yaml ファイルをテキストエディタで開き adminServer: のエントリを見つけ、管理サーバの部分に新しいエントリを挿入してください。

adminServer:
  [...]
  serverPod:
    nodeSelector:
      wlservers2: true

文法については domain.yaml のコメント内の記述でダブルチェックできます。

管理対象サーバの場合は adminServer: と同じインデントのレベルで managedServers: を挿入する必要があります。このプロパティにはPodを識別するためにWebLogicサーバ名を使用する必要があります。サーバ名はWebLogicイメージを作成する際に定義したもので、このチュートリアルに従っている場合は managed-serverX になります。

spec:
  [...]
  managedServers:
  - serverName: managed-server1
    serverPod:
      nodeSelector:
        wlservers1: true
  - serverName: managed-server2
    serverPod:
      nodeSelector:
        wlservers2: true
  - serverName: managed-server3
    serverPod:
      nodeSelector:
        wlservers1: true
  [...]

設定を変更したら、ドメイン・リソース定義を適用します。

$ kubectl apply -f /u01/domain.yaml

Operatorは変更に従ってサーバの配置を変更します。繰り返し情報を更新して期待した結果が表示されるまで待ってください。

$ kubectl get po -n sample-domain1-ns -o wide
NAME                             READY     STATUS        RESTARTS   AGE       IP            NODE            NOMINATED NODE
sample-domain1-admin-server      1/1       Running       0          3m        10.244.2.36   130.61.110.174   <none>
sample-domain1-managed-server1   1/1       Running       0          55m       10.244.1.8    130.61.110.174   <none>
sample-domain1-managed-server2   1/1       Running       0          56s       10.244.1.9    130.61.52.240    <none>
sample-domain1-managed-server3   1/1       Running       0          2m        10.244.2.37   130.61.110.174   <none>
domain.yaml 内のラベルと nodeSelector エントリの削除

ノードの配置を削除するために、ノード名を適切に指定して各ノードのラベルを kubectl label node <nodename> <labelname>- コマンドを使って削除してください。

$ kubectl label nodes 130.61.110.174 wlservers1-
node/130.61.110.174 labeled
$ kubectl label nodes 130.61.52.240 wlservers2-
node/130.61.52.240 labeled

domain.yaml 内のノード配置の記述を削除、またはコメントアウトして適用してください。

$ kubectl apply -f /u01/domain.yaml
domain.weblogic.oracle/sample-domain1 configured
Podはスケジューラの決定に基づいて再配置/再起動されます。

続いて、ライセンス対象のノードに対するWebLogicのPodの配置に進んでください。