設定ステップ

このセクションのトピック:

Kubernetesクラスタの設定

Kubernetesコントロール・プレーン(マスター・ノード)の環境の準備

  • ロード・バランサ(LBR)のL4/TCPリスナーを作成します。

  • 追加されるコントロール・プレーン・ノードのリストを使用して、LBRバックエンド・プールを作成します(IPは使用せず、常にホスト名を使用します)。

    ノート:

    次のkube-apiバックエンド・プール・パラメータの値を所定の範囲内に維持して、Kubernetesコントロール・プレーンの再起動時またはメンテナンス操作の実行時の停止時間を最小限に抑えることをお薦めします。
    • ヘルスチェック間隔: 1000ミリ秒以内
    • ヘルスチェック・タイムアウト: 900ミリ秒以内
  • L4 LBRによるバックエンド・セット/プールへのルーティングを有効にします。

    ノート:

    これは、HTTP/HTTPSリスナーではなく、L4/TCPリスナーであることが重要です。
  • ノードが準備完了状態であることを確認します。

  • sshキーを作成します(共通sshキーを使用して、設定を実行しているノードからコントロール・プレーン・ノードへのアクセスを有効にします)。

  • コントロール・プレーン・ノードとフロントエンドLBRの間の中間ファイアウォールでのトラフィックを許可します。必要なポートについては、Kubernetesのドキュメントを参照してください。

  • 3つのマスター・ノードと3つのMinionノードを持つHAクラスタを作成します。設定については、「Stacked etcd Topology」を含むドキュメントを参照してください。

環境の準備

ファイアウォールとネットワークの構成

  • ロード・バランサ(LBR)から、構成されるOracle HTTP Server (OHS)ポート(OHSの場合はデフォルトで7777)へのトラフィックを許可します。
  • OHSから、管理サーバー(30701)、SOAクラスタ(30801)およびService Busクラスタ(30901)のワーカー・ノードで構成されるノード・ポートへのトラフィックを許可します。
  • ワーカー・ノードから、コントロール・プレーン・フロントエンドのkube-api仮想サーバー・ポートおよびフロントエンドのOracle SOA Suiteへのトラフィックを許可します。
  • ワーカー・ノードからデータベース・リスナーおよびONSポート(デフォルトではそれぞれ1521および6200)へのトラフィックを許可します。

オンプレミスの『Oracle SOA Suiteエンタープライズ・デプロイメント・ガイド』をリファレンスとして使用できます。

すべてのワーカー・ノードへのOracle SOA Suiteイメージのロード

各ワーカー・ノードにイメージをロードし、適切にタグ付けするには、「Oracle SOA Suite Dockerイメージの取得」を参照してください。

永続ボリュームの共有ストレージの場所の有効化

共有ストレージ・デバイスは、異なるワーカー・ノードから使用する必要があります。このストレージは、Oracle SOA Suiteドメイン・ディレクトリをホストします。最初は、単一のストレージの場所を使用して、Oracle SOA Suiteドメインをホストする永続ボリュームを作成します。すべてのワーカー・ノードで同じマウント・パスを使用して、この共有ストレージ(NFS/NAS)をマウントします。

たとえば、すべてのワーカー・ノードのNFS1 (10.10.0.21:/k8nfs)を共有ディレクトリ/k8nfsにマウントします:

$ grep "k8nfs nfs"  /etc/fstab
10.10.0.21:/k8nfs /k8nfs nfs rw,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=10.10.0.21,mountvers=3,mountport=2048,mountproto=udp,local_lock=none,addr=10.10.0.21

後で、高可用性を実現するために2番目のストレージの場所を構成するステップを示します。

データベースおよび適切なデータベース・サービスの作成

RACデータベースのインストールおよび作成はこのドキュメントの範囲外です。データベースを構成したら、中間層からスキーマにアクセスするための適切なサービスを作成する必要があります。Oracle SOA Suiteでは、正確な非デフォルト/管理サービスを作成することが重要です。『Oracle SOA Suiteエンタープライズ・デプロイメント・ガイド14.1.2.0.0』の「エンタープライズ・デプロイメント用のデータベースの準備」を参照してください。

DMZでのOracle HTTP Serverのインストールおよび構成

『Oracle SOA Suiteエンタープライズ・デプロイメント・ガイド』のステップに従って、ワーカー・ノードとは別のノードに2つのOracle HTTP Server (OHS)インスタンスを作成します。バックエンドのKubernetes Oracle SOA SuiteまたはService BusサーバーでOHSを構成するには、30000 - 32767の範囲のポートを使用する必要があります。このポートは、後でOracle SOA Suite構成スクリプトで使用します。

このKubernetesエンタープライズ・デプロイメント・ガイドでは、OHSは、SOAドメイン内の個別のOracle SOA Suite/Service Busクラスタごとに構成されたノード・ポートにルーティングします。その後、OHSはこれらのノード・ポートにルーティングし、そこから関連サーバー・ポッドにリダイレクトされます。ノード・ポートは実際にはWebLogicリスナーではなく、使用可能なWebLogicサーバーのインテリジェント・リストを保持するノード・ポート構成であるため、構成のOHSディレクティブではDynamicServerListを無効にする必要があります。OHSのsoa-infraマウントのOHSディレクティブは次のようになります:

<Location /soa-infra>
       WLSRequest ON
       WebLogicCluster workernode1:30801,workernode2:30801,workernode3:30801
</Location>

同様に、他のパスの他のディレクティブも同様のノード・ポート・アドレスを反映する必要があります。

フロントエンド・ロード・バランサの構成

BigIp F5 LBR、またはCISCOなどの任意の標準LBRを使用できます。必要な仮想サーバーについては、『Oracle SOA Suiteエンタープライズ・デプロイメント・ガイド』(「エンタープライズ・デプロイメントのロード・バランサとファイアウォールの準備」)を参照してください。オンプレミスのエンタープライズ・デプロイメント・ガイドでは、サービスおよびトラフィックの最適な分離に使用できる仮想サーバー/リスナーの詳細なリストを提供しています。Kubernetesの場合は、少なくとも、OHSリスナーをバックエンド・プールとして使用したOracle SOA Suiteの仮想サーバー/リスナーが必要です。

  • ロード・バランサのL7/httpsリスナーを作成します。

  • Oracle SOA Suiteで使用されるOHSノード/ポートのリストを含むバックエンド・プールを作成します(IPは使用せず、常にホスト名を使用します)。

  • L7/httpsリスナー・ロード・バランサによるOHSバックエンド・セット/プールへのルーティングを有効にします。

  • OHSプールにルーティングするようにフロントエンド・ロード・バランサを構成します。

ノート:

BPMワークリスト(/integration/worklistapp)、SOAコンポーザ(/soa/composer)など、SOAの一部のWebアプリケーションにはセッション永続性が必要であるため、Cookieベースの永続性のためにLBRを構成することをお薦めします。

Coherenceのオペレーティング・システム変更の適用

Coherenceでは、Kubernetes環境でクラスタを作成するには特定の設定が必要です。WebLogic Kubernetes Operatorのドキュメントに記載されているステップを参照してください。

リポジトリ作成ユーティリティの実行によるデータベース・スキーマの設定

Oracle SOA Suiteのデータベース・スキーマを作成するには、SOA_PROFILE_TYPE=LARGEを指定してcreate-rcu-schema.shスクリプトを実行します。コマンド例を次に示します

./create-rcu-schema.sh \
  -s SOA1 \
  -t soaosb \
  -d oracle-db.default.svc.cluster.local:1521/devpdb.k8s \
  -n default \
  -c oracle-rcu-secret \
  -b EBR \
  -i soasuite:release-version \
  -r SOA_PROFILE_TYPE=LARGE,HEALTHCARE_INTEGRATION=NO

WebLogic Kubernetes OperatorおよびOracle SOA Suiteのデプロイ

WebLogic Kubernetes OperatorのインストールOracle SOA Suiteドメインの環境の準備Oracle SOA Suiteドメインの作成に関する項のステップに従います

Oracle SOA Suiteドメインが正常に作成され、サーバーを起動したら、ポッドおよび作成された様々なサービスを確認します。Oracle SOA Suiteの管理対象サーバーがRUNNING状態(ポッドの準備完了)になったら、フロントエンド・ロード・バランサを使用して一般的なOracle SOA Suite URLを確認します。

sessionAffinityをClientIPにして、管理サーバー、SOAクラスタおよびOSBクラスタのNodeportサービスを作成します。次に、soaクラスタ用のNodeportサービスのサンプルを示します:

$ cat soa-nodeport.yaml
apiVersion: v1
kind: Service
metadata:
  name: soainfra-soa-nodeport-service
  namespace: soans
  labels:
    weblogic.domainUID: soainfra
    weblogic.clusterName: soa_cluster
spec:
  type: NodePort
  sessionAffinity: ClientIP
  ports:
    - port: 7004
      protocol: TCP
      targetPort: 7004
      nodePort: 30234
  selector:
    weblogic.domainUID: soainfra
    weblogic.clusterName: soa_cluster

SOAポッドおよびサービスがデプロイされ、準備が完了します:

$ kubectl get all -n soans
NAME                                                 READY   STATUS      RESTARTS   AGE
pod/soaedgdomain-adminserver                         1/1     Running     0          47h
pod/soaedgdomain-create-soa-infra-domain-job-6pq9z   0/1     Completed   0          68d
pod/soaedgdomain-soa-server1                         1/1     Running     0          2d2h
pod/soaedgdomain-soa-server2                         1/1     Running     0          2d2h
 
NAME                                                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                          AGE
service/soaedgdomain-adminserver                     ClusterIP   None             <none>        30012/TCP,7001/TCP               2d4h
service/soaedgdomain-adminserver-ext                 NodePort    10.104.20.22     <none>        30012:30012/TCP,7001:30701/TCP   31d
service/soaedgdomain-cluster-osb-cluster             ClusterIP   10.100.97.127    <none>        8002/TCP                         68d
service/soaedgdomain-cluster-soa-cluster             ClusterIP   10.101.101.113   <none>        7003/TCP                         68d
service/soaedgdomain-cluster-soa-cluster-node-port   NodePort    10.105.51.223    <none>        7003:30801/TCP                   68d
service/soaedgdomain-osb-server1                     ClusterIP   10.110.81.153    <none>        8002/TCP                         2d4h
service/soaedgdomain-osb-server2                     ClusterIP   10.103.220.112   <none>        8002/TCP                         2d4h
service/soaedgdomain-osb-server3                     ClusterIP   10.97.50.117     <none>        8002/TCP                         2d4h
service/soaedgdomain-osb-server4                     ClusterIP   10.98.48.247     <none>        8002/TCP                         2d4h
service/soaedgdomain-osb-server5                     ClusterIP   10.102.137.176   <none>        8002/TCP                         2d4h
service/soaedgdomain-soa-server1                     ClusterIP   None             <none>        7003/TCP                         2d4h
service/soaedgdomain-soa-server2                     ClusterIP   None             <none>        7003/TCP                         2d4h
service/soaedgdomain-soa-server3                     ClusterIP   10.105.108.74    <none>        7003/TCP                         2d4h
service/soaedgdomain-soa-server4                     ClusterIP   10.109.191.102   <none>        7003/TCP                         2d4h
service/soaedgdomain-soa-server5                     ClusterIP   10.107.2.99      <none>        7003/TCP                         2d4h
 
NAME                                                 COMPLETIONS   DURATION   AGE
job.batch/soaedgdomain-create-soa-infra-domain-job   1/1           4m24s      68d

Oracle SOA Suiteドメインのカスタム・キーストアの構成

${WORKDIR}/custom-keystoreにあるヘルパー・スクリプトcustom-keystore.shを実行して、Oracle SOA Suiteドメインのカスタム・キーストアを構成します。

「デモCA証明書のドメインCA署名証明書との置換」を参照してください。

Oracle HTTP Serverでのカスタム証明書の使用

trust.p12 (custom-keystore.shで作成)をOHSにコピーします。次のコマンドは、OHSでキーとウォレットを管理する場合に役立ちます。

Java KeyStore (JKS)またはPKCS12キーストア・ファイルから証明書をエクスポートします。

$ keytool -export -keystore trust.p12 -storepass trustKeyStorePassword -alias trustcert1 -file trust.crt
Certificate stored in file <trust.crt>

OHSのウォレットを作成するコマンド


$ orapki wallet create -wallet WLSSLWalletEDG -auto_login -pwd *****
Oracle PKI Tool Release 23.0.0.0.0 - Production
Version 23.0.0.0.0
Copyright (c) 2004, 2024, Oracle and/or its affiliates. All rights reserved.
 
Operation is successfully completed.

信頼できる証明書をウォレットに追加します


$ orapki wallet add -wallet WLSSLWalletEDG -trusted_cert -cert trust.crt -pwd *****
Oracle PKI Tool Release 23.0.0.0.0 - Production
Version 23.0.0.0.0
Copyright (c) 2004, 2024, Oracle and/or its affiliates. All rights reserved.
 
Operation is successfully completed.

$WEB_DOMAIN_HOME/config/fmwconfig/components/OHS/ohs1/mod_wl_ohs.confを変更して、次のように(SSLでのWLSバックエンドへのルーティングに必要とされる)適切なWLSSWalletファイルを含めます:


# NOTE : This is a template to configure mod_weblogic.
 
LoadModule weblogic_module   "${PRODUCT_HOME}/modules/mod_wl_ohs.so"
 
# This empty block is needed to save mod_wl related configuration from EM to this file when changes are made at the Base Virtual Host Level
<IfModule weblogic_module>
  
    WLIOTimeoutSecs 900
    KeepAliveSecs 290
    FileCaching OFF
    WLSocketTimeoutSecs 15
    ErrorPage http://www.oracle.com/splash/cloud/index.html
    WLRetryOnTimeout NONE
    WLForwardUriUnparsed On
    SecureProxy On
    WLSSLWallet "/u02/oracle/config/keystores/WLSSLWalletEDG"
</IfModule>

冗長永続ボリュームの構成

Oracle SOA SuiteまたはService BusのポッドをKubernetesクラスタ内で移動する柔軟性を高めるために、ノード・セレクタを使用します。奇数のサーバー・ポッド(soa_server1、soa_server3、soa_server5など)がノード・セレクタ1に割り当てられ、偶数のサーバー・ポッド(soa_server2、soa_server4、soa_server6など)がノード・セレクタ2に割り当てられます。結果として得られる構成は次のとおりです:

図10-2 冗長永続ボリュームの構成


冗長永続ボリュームの構成

この構成を使用するには、次のステップを実行します:

  • Oracle SOA Suiteドメインを停止します。ドメインを起動および停止するスクリプトを参照してください。

  • 上の図のように、すべての偶数ワーカー・ノードにNFS1を、すべての奇数ワーカー・ノードにNFS2をマウントします。例:

    MOUNT ON ODD NODE
    [opc@olk8-w1 ~]$ grep "k8nfs nfs"  /etc/fstab
    10.10.0.21:/k8nfs /k8nfs nfs rw,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=10.10.0.21,mountvers=3,mountport=2048,mountproto=udp,local_lock=none,addr=10.10.0.21
     
    MOUNT ON EVEN NODE
    [opc@olk8-w2 ~]$  grep "k8nfs nfs"  /etc/fstab
    10.10.0.27:/k8nfs2 /k8nfs nfs rw,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=10.10.0.27,mo  untvers=3,mountport=2048,mountproto=udp,local_lock=none,addr=10.10.0.27
     
    MOUNT ON ODD NODE
    [opc@olk8-w3 ~]$  grep "k8nfs nfs"  /etc/fstab
    10.10.0.21:/k8nfs /k8nfs nfs rw,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=10.10.0.21,mountvers=3,  mountport=2048,mountproto=udp,local_lock=none,addr=10.10.0.21
    
  • ドメイン・マウントをNFSレプリカNFS2にコピーします(これは、スナップショットまたは直接sftp/セキュア・コピーを介して実行できます)。

    たとえば、ドメインがNFS1によってホストされた/k8nfsにデプロイされている場合、ドメインを停止した後、NFS1の/k8nfsにあるデータをNFS2の/k8nfs2にセキュア・コピーします:

    $ cd /k8nfs
    $ scp -R * user@[NFS2]:/k8nfs2
  • NFS1の奇数ノードとNFS2の偶数ノードにラベルを付けます。

    たとえば、NFS1の場合はdiskgroup=dg1、NFS2の場合はdiskgroup=dg2というラベルを追加します:

    $ kubectl label nodes olk8-w1 diskgroup=dg1
    $ kubectl label nodes olk8-w2 diskgroup=dg2
    $ kubectl label nodes olk8-w3 diskgroup=dg1

    次のコマンドを使用して追加したラベルを検証します:

    $ kubectl get nodes --show-labels

    サンプル出力:

    NAME      STATUS   ROLES    AGE   VERSION   LABELS
    olk8-m1   Ready    master   10d   v1.XX.X   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=olk8-m1,kubernetes.io/os=linux,node-role.kubernetes.io/master=
    olk8-m2   Ready    master   10d   v1.XX.X   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=olk8-m2,kubernetes.io/os=linux,node-role.kubernetes.io/master=
    olk8-m3   Ready    master   10d   v1.XX.X   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=olk8-m3,kubernetes.io/os=linux,node-role.kubernetes.io/master=
    olk8-w1   Ready    <none>   10d   v1.XX.X   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,diskgroup=dg1,kubernetes.io/arch=amd64,kubernetes.io/hostname=olk8-w1,kubernetes.io/os=linux,name=admin
    olk8-w2   Ready    <none>   10d   v1.XX.X   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,diskgroup=dg2,kubernetes.io/arch=amd64,kubernetes.io/hostname=olk8-w2,kubernetes.io/os=linux,name=wls1
    olk8-w3   Ready    <none>   10d   v1.XX.X   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,diskgroup=dg1,kubernetes.io/arch=amd64,kubernetes.io/hostname=olk8-w3,kubernetes.io/os=linux,name=wls2
    
  • ドメイン内の適切なセレクタを割り当てるには:
    1. ドメイン(domain.yaml)を編集します。
    2. クラスタに構成されているすべての管理対象サーバーの管理対象サーバー・セクションを変更します(soa_server1およびsoa_server2の例を次に示します):
      
      managedServers:
         - serverName: soa_server1
           serverPod:
             nodeSelector:
               diskgroup: dg1
         - serverName: soa_server2
           serverPod:
             nodeSelector:
               diskgroup: dg2
    3. domain.yamlの変更を適用します:
      $ kubectl apply -f domain.yaml

      ノート:

      この冗長PV構成が使用されると、ドメイン内のconfigディレクトリの外部に存在するすべての変更は、セカンダリNASマウントに手動でコピー/同期する必要があります。上の図でNFS2を使用している管理対象サーバーは、$DOMAIN_HOME/configディレクトリでファイル/アーティファクトを変更する構成変更のみをレプリケートします。その他の変更は、WebLogicインフラストラクチャによって自動的にコピーされません。

      たとえば、earをデプロイし、configディレクトリの外部のアップロードまたはステージ・ディレクトリを指定した場合、earファイルはWebLogicによってコピーされません)。Fileadapter compositesは、ポッドからアクセス可能なマウントに出力ファイルを配置します。異なるOracle SOA Suiteサーバーのファイルの場所のマウント・ポイントとPV/PVCは同じである必要があるため、$DOMAIN_HOMEの場所に使用されるものとは異なります。

      アダプタ構成では、すべてのサーバー・ポッドからアクセス可能な別の共通共有場所を使用します。$DOMAIN_HOME以外の別の共有場所を使用してください。

      たとえば、新しいNFS共有を作成し、必要なPV/PVCを作成して、すべてのサーバー・ポッドで使用できるようにドメインyamlに更新します。

      serverPod:
            volumeMounts:
            - mountPath: /u01/oracle/user_projects
              name: weblogic-domain-storage-volume
            - mountPath: /u01/dev/testing/adapters
              name: soainfra-adapters-pv-volume
            volumes:
            - name: weblogic-domain-storage-volume
              persistentVolumeClaim:
                claimName: soainfra-pvc
            - name: soainfra-adapters-pv-volume
              persistentVolumeClaim:
                claimName: soainfra-adapters-pvc

フロントエンド・アドレスの設定

Oracle SOA Suite (soa_cluster)およびService Bus (osb_cluster)の各クラスタについて、適切なフロントエンド・アドレスを次のように設定します:

  1. WebLogicリモート・コンソールにサインインします。

  2. 「ツリーの編集」「環境」「クラスタ」に移動します。

  3. クラスタ名をクリックします。

  4. 「HTTP」タブをクリックします。

  5. 「フロントエンド・ホスト」およびフロントエンド・ポートの詳細を入力します。

ノート:

ノート: 各クラスタおよび管理サーバーのフロントエンドの詳細を設定します。

GridLinkデータ・ソースのFANの有効化

Kubernetes上のOracle SOA Suiteのデフォルト・デプロイメントのデータ・ソースは、汎用データ・ソースを使用します。12.2以降のデータベースのONS自動登録では、データ・ソースがGridLink (GLDS)に変換されるようにFANを有効にするだけで済みます。これを行うには、WebLogic管理コンソールまたは次のコマンドを使用し、管理サーバーおよび管理対象サーバーを再起動します:

grep -L fan-enabled $domain_home/config/jdbc/*.xml | xargs sed -i "s/<\/jdbc-data-source>/<jdbc-oracle-params><fan-enabled>true<\/fan-enabled><\/jdbc-oracle-params><\/jdbc-data-source>/g"

変更が適用されたら、すべてのデータ・ソースがWebLogicリモート・コンソールでGridLinkデータ・ソースとしてマークされていることを確認します。

ASMの構成

自動サービス移行を構成するステップは、オンプレミスの『エンタープライズ・デプロイメント・ガイド』を参照してください。

coredns割当ての構成

ノート:

このステップは、Oracle SOA Suiteデプロイメントに関係なく、corednsを使用するすべてのKubernetesシステムに適用されます。ただし、ワーカー・ノードの作成は設定で暗黙的に行われるため、このコンテキストで適用されます(Oracle SOA Suiteデプロイメント後)。

コントロール・プレーンとマスター・プレーンの両方を生成するように、corednsのレプリカを構成します。リストア操作をコントロール・プレーンで実行すると、ワーカー・ノードが正常に動作しなくなる可能性があります。corednsが完全にワーカー・ノードに配置されている場合、コントロール・プレーンがメンテナンスのために停止されると、コントロール・プレーンが正しく機能しない可能性があります。少なくとも2つのcorednsポッドをコントロール・プレーンに配置し、別の2つのポッドをワーカー・ノードに配置します。corednsフットプリントは低くなっています。

VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 
146268  41684  29088 S   0.3  0.1  25:44.04 coredns

CoreDNSのドキュメントによると、CoreDNSインスタンスに必要なメモリー量は、次の式で(デフォルト設定を使用して)見積もることができます:

MB required (default settings) = (Pods + Services) / 1000 + 54

したがって、まず、コントロール・プレーンとワーカー・プレーンの両方でノードにラベルを付けます。

$ kubectl label nodes olk8-m1 area=dnsarea
$ kubectl label nodes olk8-m2 area=dnsarea
$ kubectl label nodes olk8-m3 area=dnsarea
$ kubectl label nodes olk8-w1 area=dnsarea
$ kubectl label nodes olk8-w2 area=dnsarea
$ kubectl label nodes olk8-w3 area=dnsarea

次に、トポロジ分散制約を使用するようにcorednsデプロイメントを更新します

ノート:

トポロジ分散制約は、Kubernetes v1.18で開始されるベータ版です

最初に、kube-apiサーバーおよびkube-schedulerで機能ゲートを有効にします。次に、ワーカーおよびコントロール・プレーン・ノードにポッドが適切に分散されるように、corednsデプロイメントを変更します。

corednsトポロジ分散構成の詳細は次のとおりです:

更新されたcorednsデプロイメントyamlの例:

$ kubectl get deployment coredns -n kube-system -o yaml
  apiVersion: apps/v1
  kind: Deployment
  metadata:
    annotations:
      deployment.kubernetes.io/revision: "7"
    creationTimestamp: "2021-01-15T13:15:05Z"
    generation: 8
    labels:
      area: dnsarea
      k8s-app: kube-dns
    managedFields:
    - apiVersion: apps/v1
      fieldsType: FieldsV1
      fieldsV1:
        f:metadata:
          f:labels:
            .: {}
            f:k8s-app: {}
        f:spec:
          f:progressDeadlineSeconds: {}
          f:revisionHistoryLimit: {}
          f:selector:
            f:matchLabels:
              .: {}
              f:k8s-app: {}
          f:strategy:
            f:rollingUpdate:
              .: {}
              f:maxSurge: {}
              f:maxUnavailable: {}
            f:type: {}
          f:template:
            f:metadata:
              f:labels:
                .: {}
                f:k8s-app: {}
            f:spec:
              f:containers:
                k:{"name":"coredns"}:
                  .: {}
                  f:args: {}
                  f:image: {}
                  f:imagePullPolicy: {}
                  f:livenessProbe:
                    .: {}
                    f:failureThreshold: {}
                    f:httpGet:
                      .: {}
                      f:path: {}
                      f:port: {}
                      f:scheme: {}
                    f:initialDelaySeconds: {}
                    f:periodSeconds: {}
                    f:successThreshold: {}
                    f:timeoutSeconds: {}
                  f:name: {}
                  f:ports:
                    .: {}
                    k:{"containerPort":53,"protocol":"TCP"}:
                      .: {}
                      f:containerPort: {}
                      f:name: {}
                      f:protocol: {}
                    k:{"containerPort":53,"protocol":"UDP"}:
                      .: {}
                      f:containerPort: {}
                      f:name: {}
                      f:protocol: {}
                    k:{"containerPort":9153,"protocol":"TCP"}:
                      .: {}
                      f:containerPort: {}
                      f:name: {}
                      f:protocol: {}
                  f:readinessProbe:
                    .: {}
                    f:failureThreshold: {}
                    f:httpGet:
                      .: {}
                      f:path: {}
                      f:port: {}
                      f:scheme: {}
                    f:periodSeconds: {}
                    f:successThreshold: {}
                    f:timeoutSeconds: {}
                  f:resources:
                    .: {}
                    f:limits:
                      .: {}
                      f:memory: {}
                    f:requests:
                      .: {}
                      f:cpu: {}
                      f:memory: {}
                  f:securityContext:
                    .: {}
                    f:allowPrivilegeEscalation: {}
                    f:capabilities:
                      .: {}
                      f:add: {}
                      f:drop: {}
                    f:readOnlyRootFilesystem: {}
                  f:terminationMessagePath: {}
                  f:terminationMessagePolicy: {}
                  f:volumeMounts:
                    .: {}
                    k:{"mountPath":"/etc/coredns"}:
                      .: {}
                      f:mountPath: {}
                      f:name: {}
                      f:readOnly: {}
              f:dnsPolicy: {}
              f:nodeSelector:
                .: {}
                f:kubernetes.io/os: {}
              f:priorityClassName: {}
              f:restartPolicy: {}
              f:schedulerName: {}
              f:securityContext: {}
              f:serviceAccount: {}
              f:serviceAccountName: {}
              f:terminationGracePeriodSeconds: {}
              f:tolerations: {}
              f:volumes:
                .: {}
                k:{"name":"config-volume"}:
                  .: {}
                  f:configMap:
                    .: {}
                    f:defaultMode: {}
                    f:items: {}
                    f:name: {}
                  f:name: {}
      manager: kubeadm
      operation: Update
      time: "2021-01-15T13:15:05Z"
    - apiVersion: apps/v1
      fieldsType: FieldsV1
      fieldsV1:
        f:metadata:
          f:labels:
            f:area: {}
        f:spec:
          f:replicas: {}
          f:template:
            f:metadata:
              f:annotations:
                .: {}
                f:kubectl.kubernetes.io/restartedAt: {}
              f:labels:
                f:foo: {}
            f:spec:
              f:topologySpreadConstraints:
                .: {}
                k:{"topologyKey":"area","whenUnsatisfiable":"DoNotSchedule"}:
                  .: {}
                  f:labelSelector:
                    .: {}
                    f:matchLabels:
                      .: {}
                      f:foo: {}
                  f:maxSkew: {}
                  f:topologyKey: {}
                  f:whenUnsatisfiable: {}
      manager: kubectl
      operation: Update
      time: "2021-01-28T16:00:21Z"
    - apiVersion: apps/v1
      fieldsType: FieldsV1
      fieldsV1:
        f:metadata:
          f:annotations:
            .: {}
            f:deployment.kubernetes.io/revision: {}
        f:status:
          f:availableReplicas: {}
          f:conditions:
            .: {}
            k:{"type":"Available"}:
              .: {}
              f:lastTransitionTime: {}
              f:lastUpdateTime: {}
              f:message: {}
              f:reason: {}
              f:status: {}
              f:type: {}
            k:{"type":"Progressing"}:
              .: {}
              f:lastTransitionTime: {}
              f:lastUpdateTime: {}
              f:message: {}
              f:reason: {}
              f:status: {}
              f:type: {}
          f:observedGeneration: {}
          f:readyReplicas: {}
          f:replicas: {}
          f:updatedReplicas: {}
      manager: kube-controller-manager
      operation: Update
      time: "2021-01-28T16:00:39Z"
    name: coredns
    namespace: kube-system
    resourceVersion: "2520507"
    selfLink: /apis/apps/v1/namespaces/kube-system/deployments/coredns
    uid: 79d24e61-98f4-434f-b682-132625b04c49
  spec:
    progressDeadlineSeconds: 600
    replicas: 4
    revisionHistoryLimit: 10
    selector:
      matchLabels:
        k8s-app: kube-dns
    strategy:
      rollingUpdate:
        maxSurge: 25%
        maxUnavailable: 1
      type: RollingUpdate
    template:
      metadata:
        annotations:
          kubectl.kubernetes.io/restartedAt: "2021-01-28T15:29:48Z"
        creationTimestamp: null
        labels:
          foo: bar
          k8s-app: kube-dns
      spec:
        containers:
        - args:
          - -conf
          - /etc/coredns/Corefile
          image: k8s.gcr.io/coredns:1.6.7
          imagePullPolicy: IfNotPresent
          livenessProbe:
            failureThreshold: 5
            httpGet:
              path: /health
              port: 8080
              scheme: HTTP
            initialDelaySeconds: 60
            periodSeconds: 10
            successThreshold: 1
            timeoutSeconds: 5
          name: coredns
          ports:
          - containerPort: 53
            name: dns
            protocol: UDP
          - containerPort: 53
            name: dns-tcp
            protocol: TCP
          - containerPort: 9153
            name: metrics
            protocol: TCP
          readinessProbe:
            failureThreshold: 3
            httpGet:
              path: /ready
              port: 8181
              scheme: HTTP
            periodSeconds: 10
            successThreshold: 1
            timeoutSeconds: 1
          resources:
            limits:
              memory: 170Mi
            requests:
              cpu: 100m
              memory: 70Mi
          securityContext:
            allowPrivilegeEscalation: false
            capabilities:
              add:
              - NET_BIND_SERVICE
              drop:
              - all
            readOnlyRootFilesystem: true
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          volumeMounts:
          - mountPath: /etc/coredns
            name: config-volume
            readOnly: true
        dnsPolicy: Default
        nodeSelector:
          kubernetes.io/os: linux
        priorityClassName: system-cluster-critical
        restartPolicy: Always
        schedulerName: default-scheduler
        securityContext: {}
        serviceAccount: coredns
        serviceAccountName: coredns
        terminationGracePeriodSeconds: 30
        tolerations:
        - key: CriticalAddonsOnly
          operator: Exists
        - effect: NoSchedule
          key: node-role.kubernetes.io/master
        topologySpreadConstraints:
        - labelSelector:
            matchLabels:
              foo: bar
          maxSkew: 1
          topologyKey: area
          whenUnsatisfiable: DoNotSchedule
        volumes:
        - configMap:
            defaultMode: 420
            items:
            - key: Corefile
              path: Corefile
            name: coredns
          name: config-volume
  status:
    availableReplicas: 4
    conditions:
    - lastTransitionTime: "2021-01-21T19:08:12Z"
      lastUpdateTime: "2021-01-21T19:08:12Z"
      message: Deployment has minimum availability.
      reason: MinimumReplicasAvailable
      status: "True"
      type: Available
    - lastTransitionTime: "2021-01-28T15:29:48Z"
      lastUpdateTime: "2021-01-28T16:00:39Z"
      message: ReplicaSet "coredns-84b49c57fd" has successfully progressed.
      reason: NewReplicaSetAvailable
      status: "True"
      type: Progressing
    observedGeneration: 8
    readyReplicas: 4
    replicas: 4
    updatedReplicas: 4

ラベルおよび分散トポロジの変更は次のとおりです:

labels:
        foo: bar
        k8s-app: kube-dns
topologySpreadConstraints:
  - labelSelector:
      matchLabels:
        foo: bar
    maxSkew: 1
    topologyKey: area
    whenUnsatisfiable: DoNotSchedule

これにより、マスター・ノードとワーカー・ノード間での均等分散が保証されるため、コントロール・プレーンがリストアされると、ワーカー・ポッドは問題なく続行され、その逆も同様です。

結果として得られるcoredns分散の例:

$ kubectl get pods -A -o wide | grep coredns
kube-system   coredns-84b49c57fd-4fz4g                         1/1     Running     0          166m    10.244.1.20   olk8-m2   <none>           <none>
kube-system   coredns-84b49c57fd-5mrkw                         1/1     Running     0          165m    10.244.4.76   olk8-w2   <none>           <none>
kube-system   coredns-84b49c57fd-5zm88                         1/1     Running     0          165m    10.244.2.17   olk8-m3   <none>           <none>
kube-system   coredns-84b49c57fd-nqlwb                         1/1     Running     0          166m    10.244.4.75   olk8-w2   <none>           <none>

サーバーのポッドの有効性プローブの調整

デフォルトでは、有効性プローブは45秒ごとに有効性を確認するように構成されており、停止シナリオでは使用できなくなったバックエンド・ポッドにリクエストがルーティングされる可能性があります。ハード・ノードの障害時にポッドがより迅速に停止とマークされるように、有効性プローブの値を調整することをお勧めします。プローブをより頻繁に実行するよう構成するには、ドメインを編集して、serverPods.livenessProbeの値を次のように変更します:

livenessProbe:
   failureThreshold: 1
   initialDelaySeconds: 60
   periodSeconds: 40
   successThreshold: 1
   timeoutSeconds: 5

有効性プローブのカスタマイズ方法の詳細は、WebLogic Kubernetes Operatorのドキュメントを参照してください。