ロード・バランサおよびネットワーク・ロード・バランサの構成

Container Engine for Kubernetes (OKE)がLoadBalancerタイプのKubernetesサービスにプロビジョニングするOracle Cloud Infrastructureロード・バランサおよびネットワーク・ロード・バランサを定義する方法をご紹介します。

内部ロード・バランサの作成

Oracle Cloud Infrastructureロード・バランサおよびネットワーク・ロード・バランサを作成して、クラスタ上で実行されているサービスへのアクセスを制御できます:

  • カスタム作成ワークフローでクラスタを作成する場合、新しいクラスタで使用するネットワーク・リソースを含む既存のVCNを選択します。ロード・バランサまたはネットワーク・ロード・バランサを使用してVCN内のトラフィックを制御する場合は、そのVCN内の既存のパブリック・サブネットまたはプライベート・サブネットを選択してそれをホストします。
  • クイック作成ワークフローでクラスタを作成する場合、自動的に作成されるVCNには、ロード・バランサまたはネットワーク・ロード・バランサをホストするためのパブリック・リージョン・サブネットが含まれます。ロード・バランサまたはネットワーク・ロード・バランサをプライベート・サブネットでホストする場合は、後でプライベート・サブネットをVCNに追加できます。

または、クラスタ内でLoadBalancerタイプの内部Kubernetesサービス(通常は単に「内部ロード・バランサ」と呼ばれます)を定義して、クラスタと同じVCNで実行されている他のプログラムがクラスタ内のサービスにアクセスできるようにすることもできます。内部ロード・バランサをプロビジョニングできます。

  • ロード・バランサとして、またはネットワーク・ロード・バランサとして
  • パブリックIPアドレス、またはプライベートIPアドレス(Load BalancerサービスまたはNetwork Load Balancerサービスによって割り当てられます)
  • パブリック・サブネット内またはプライベート・サブネット内

パブリックIPアドレスを持つロード・バランサまたはネットワーク・ロード・バランサは、パブリックと呼ばれます。パブリック・ロード・バランサまたはネットワーク・ロード・バランサは、パブリック・サブネットまたはプライベート・サブネットでホストできます。

プライベートIPアドレスを持つロード・バランサまたはネットワーク・ロード・バランサは、プライベートと呼ばれます。プライベート・ロード・バランサまたはネットワーク・ロード・バランサは、パブリック・サブネットまたはプライベート・サブネットでホストできます。

デフォルトでは、内部ロード・バランサはパブリックIPアドレスでプロビジョニングされ、パブリック・サブネットでホストされます。

詳細は次を参照してください。

  • Oracle Cloud Infrastructureパブリックおよびプライベートのロード・バランサについては、Load Balancerのタイプを参照してください。
  • Oracle Cloud Infrastructureパブリックおよびプライベートのネットワーク・ロード・バランサについて、ネットワークLoad Balancerのタイプを参照してください
OCIロード・バランサとしての内部ロード・バランサの作成

クラスタの作成時にロード・バランサ用に指定されたサブネットでホストされるプライベートIPアドレスを持つOCIロード・バランサとして内部ロード・バランサを作成するには、マニフェスト・ファイルのメタデータ・セクションに次の注釈を追加します:

service.beta.kubernetes.io/oci-load-balancer-internal: "true"

クラスタの作成時にロード・バランサ用に指定された代替サブネットにホストされたプライベートIPアドレスでホストされる、OCIロード・バランサとして内部ロード・バランサを作成するには、マニフェスト・ファイルのメタデータ・セクションに次の両方の注釈を追加します:

service.beta.kubernetes.io/oci-load-balancer-internal: "true"
service.beta.kubernetes.io/oci-load-balancer-subnet1: "ocid1.subnet.oc1..aaaaaa....vdfw"

ocid1.subnet.oc1..aaaaaa....vdfwは、代替サブネットのOCIDです。代替サブネットは、プライベート・サブネットまたはパブリック・サブネットにすることができます。

例:


apiVersion: v1
kind: Service
metadata:
  name: my-nginx-svc
  labels:
    app: nginx
  annotations:
    oci.oraclecloud.com/load-balancer-type: "lb"
    service.beta.kubernetes.io/oci-load-balancer-internal: "true"
    service.beta.kubernetes.io/oci-load-balancer-subnet1: "ocid1.subnet.oc1..aaaaaa....vdfw"
spec:
  type: LoadBalancer
  ports:
  - port: 8100
  selector:
    app: nginx
内部ネットワーク・ロード・バランサをOCIネットワーク・ロード・バランサとして作成します

クラスタの作成時にロード・バランサ用に指定されたサブネットでホストされるプライベートIPアドレスを持つOCIネットワーク・ロード・バランサとして内部ネットワーク・ロード・バランサを作成するには、マニフェスト・ファイルのメタデータ・セクションに次の注釈を追加します:

oci-network-load-balancer.oraclecloud.com/internal: "true"

クラスタの作成時にロード・バランサ用に指定された代替サブネットにホストされるプライベートIPアドレスを持つOCIネットワーク・ロード・バランサとして内部ネットワーク・ロード・バランサを作成するには、マニフェスト・ファイルのメタデータ・セクションに次の注釈の両方を追加します:

oci-network-load-balancer.oraclecloud.com/internal: "true"
oci-network-load-balancer.oraclecloud.com/subnet: "ocid1.subnet.oc1..aaaaaa....vdfw"

ocid1.subnet.oc1..aaaaaa....vdfwは、プライベート・サブネットのOCIDです。代替サブネットは、プライベート・サブネットまたはパブリック・サブネットにすることができます。

例:


apiVersion: v1
kind: Service
metadata:
  name: my-nginx-svc
  labels:
    app: nginx
  annotations:
    oci.oraclecloud.com/load-balancer-type: "nlb"
    oci-network-load-balancer.oraclecloud.com/internal: "true"
    oci-network-load-balancer.oraclecloud.com/subnet: "ocid1.subnet.oc1..aaaaaa....vdfw"
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx

予約済パブリックIPアドレスの指定

LoadBalancerタイプのKubernetesサービスがクラスタにデプロイされると、Container Engine for Kubernetesは、クラスタへのトラフィックを受け入れるOracle Cloud Infrastructureパブリック・ロード・バランサまたはネットワーク・ロード・バランサを作成します。デフォルトでは、Oracle Cloud Infrastructureパブリック・ロード・バランサまたはネットワーク・ロード・バランサにはエフェメラル・パブリックIPアドレスが割り当てられます。ただし、一時的パブリックIPアドレスは一時的であり、パブリック・ロード・バランサまたはネットワーク・ロード・バランサの存続期間中のみ続きます。

Container Engine for Kubernetesが作成するOracle Cloud Infrastructureパブリック・ロード・バランサまたはネットワーク・ロード・バランサを、デプロイメント後に同じパブリックIPアドレス・デプロイメントにする場合は、予約済パブリックIPアドレスのプールから予約済パブリックIPアドレスを割り当てることができます。予約済パブリックIPアドレスの作成および表示の詳細は、パブリックIPアドレスに関する項を参照してください。

Container Engine for Kubernetesが作成するOracle Cloud Infrastructureパブリック・ロード・バランサまたはネットワーク・ロード・バランサに予約済パブリックIPアドレスを割り当てるには、LoadBalancerタイプのサービスを定義するマニフェスト・ファイルのspecセクションにLoadBalancerIPプロパティを追加し、予約済パブリックIPアドレスを指定します。

予約済パブリックIPアドレスをパブリック・ロード・バランサに割り当てます

例:

apiVersion: v1
kind: Service
metadata:
  name: my-nginx-svc
  labels:
    app: nginx
  annotations:
    oci.oraclecloud.com/load-balancer-type: "lb"
spec:
  loadBalancerIP: 144.25.97.173
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx
予約済パブリックIPアドレスをパブリック・ネットワーク・ロード・バランサに割り当てます

例:

apiVersion: v1
kind: Service
metadata:
  name: my-nginx-svc
  labels:
    app: nginx
  annotations:
    oci.oraclecloud.com/load-balancer-type: "nlb"
spec:
  loadBalancerIP: 144.25.97.173
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx

次の点に注意してください:

  • LoadBalancerサービスのloadBalancerIPプロパティを設定した場合、Container Engine for Kubernetesが作成するOracle Cloud Infrastructureパブリック・ロード・バランサまたはネットワーク・ロード・バランサのIPアドレスを後で直接変更することはできません。IPアドレスを変更する場合は、LoadBalancerサービスを削除し、マニフェスト・ファイルで別の予約済パブリックIPアドレスを指定して、LoadBalancerサービスを再度デプロイします。
  • LoadBalancerサービスのloadBalancerIPプロパティを設定しない場合、Container Engine for Kubernetesが作成するOracle Cloud Infrastructureパブリック・ロード・バランサまたはネットワーク・ロード・バランサのIPアドレスをエフェメラルIPアドレスから予約済パブリックIPアドレスに後で直接切り替えることはできません。一時的なIPアドレスを予約済パブリックIPアドレスに切り替える場合は、LoadBalancerタイプのサービスを削除し、loadBalancerIPプロパティをマニフェスト・ファイルの予約済パブリックIPアドレスに設定して、LoadBalancerタイプのサービスを再度デプロイします。
  • LoadBalancerタイプのサービスを削除し、他の用途のために予約済パブリックIPアドレスを解放できます(たとえば、LoadBalancerタイプの別のサービスに割り当てることができます)。
  • 同じIPアドレスが別のリソース(コンピュート・インスタンスやLoadBalancerタイプの別のサービスなど)にすでに割り当てられている場合、LoadBalancerタイプのサービスの予約済パブリックIPアドレスは指定できません。
  • 内部ロード・バランサ・サービスのマニフェスト・ファイル(つまり、service.beta.kubernetes.io/oci-load-balancer-internal: "true"またはoci-network-load-balancer.oraclecloud.com/internal: "true"注釈を含むマニフェスト・ファイル)にloadBalancerIPプロパティを追加することはできません。
  • デフォルトでは、マニフェスト・ファイル内でタイプLoadBalancerのサービスのloadBalancerIPプロパティとして指定した予約済パブリックIPアドレスは、クラスタと同じコンパートメントのリソースであることが想定されます。別のコンパートメントに予約済パブリックIPアドレスを指定する場合:

    • パブリック・ロード・バランサの場合、テナンシに次のポリシーを追加します:
      ALLOW any-user to read public-ips in tenancy where request.principal.type = 'cluster'
      ALLOW any-user to manage floating-ips in tenancy where request.principal.type = 'cluster'
    • ネットワーク・ロード・バランサの場合、テナンシに次のポリシーを追加します:
      ALLOW any-user to use private-ips in TENANCY where ALL {request.principal.type = 'cluster', request.principal.compartment.id=target.compartment.id}
      ALLOW any-user to manage public-ips in TENANCY where ALL {request.principal.type = 'cluster', request.principal.compartment.id=target.compartment.id}

ネットワーク・セキュリティ・グループの指定(推奨)

Oracle Cloud Infrastructureネットワーク・セキュリティ・グループ(NSG)を使用すると、リソースとの間で、およびリソース間のトラフィックを制御できます。NSGに定義されたセキュリティ・ルールにより、そのNSG内のすべてのリソースが同じセキュリティ・ポスチャを持つことが保証されます。詳細は、ネットワーク・セキュリティ・グループを参照してください。

NSGを使用して、Container Engine for KubernetesがタイプLoadBalancerのKubernetesサービスに対してプロビジョニングするOracle Cloud Infrastructureロード・バランサまたはネットワーク・ロード・バランサへのアクセスを制御できます。

NSGを使用してアクセスを制御する場合は、ロード・バランサまたはネットワーク・ロード・バランサのサブネットとの間でインバウンドおよびアウトバウンド・トラフィックを許可するための適切なセキュリティ・ルールが存在する必要があります。ロード・バランサおよびネットワーク・ロード・バランサのセキュリティ・ルールを参照してください。

NSGを使用してロード・バランサまたはネットワーク・ロード・バランサへのアクセスを制御する場合:

管理するNSGを使用してアクセスを制御するには、マニフェスト・ファイルに注釈を含めて、ロード・バランサまたはネットワーク・ロード・バランサを追加するNSGを指定します。

既存のNSGへのロード・バランサの追加

Container Engine for Kubernetesによって作成されたOracle Cloud Infrastructureロード・バランサを管理しているNSGに追加するには、マニフェスト・ファイルのメタデータ・セクションに次の注釈を追加します:

oci.oraclecloud.com/oci-network-security-groups: "<nsg-ocid>"

ここで、<nsg-ocid>は既存のNSGのOCIDです。

例:


apiVersion: v1
kind: Service
metadata:
  name: my-nginx-svc
  labels:
    app: nginx
  annotations:
    oci.oraclecloud.com/load-balancer-type: "lb"
    oci.oraclecloud.com/oci-network-security-groups: "ocid1.networksecuritygroup.oc1.phx.aaaaaa....vdfw"
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx
既存のNSGへのネットワーク・ロード・バランサの追加

Container Engine for Kubernetesによって作成されたOracle Cloud Infrastructureネットワーク・ロード・バランサを管理しているNSGに追加するには、マニフェスト・ファイルのメタデータ・セクションに次の注釈を追加します:

oci-network-load-balancer.oraclecloud.com/oci-network-security-groups: "<nsg-ocid>"

ここで、<nsg-ocid>は既存のNSGのOCIDです。

例:


apiVersion: v1
kind: Service
metadata:
  name: my-nginx-svc
  labels:
    app: nginx
  annotations:
    oci.oraclecloud.com/load-balancer-type: "nlb"
    oci-network-load-balancer.oraclecloud.com/oci-network-security-groups: "ocid1.networksecuritygroup.oc1.phx.aaaaaa....vdfw"
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx

次の点に注意してください:

  • 指定するNSGは、Oracle Cloud Infrastructureロード・バランサまたはネットワーク・ロード・バランサと同じVCN内にある必要があります。
  • 指定したNSGがクラスタの別のコンパートメントに属している場合は、IAMポリシーに次のようなポリシー・ステートメントを含める必要があります:
    ALLOW any-user to use network-security-groups in TENANCY where ALL { request.principal.type = 'cluster' }

    このポリシー・ステートメントが許容しすぎると考えられる場合は、NSGが属するコンパートメントを明示的に指定したり、クラスタを明示的に指定したりする権限を制限できます。例:

    Allow any-user to use network-security-groups in compartment <compartment-ocid> where all { request.principal.id = '<cluster-ocid>' }
  • 次の形式で、最大5つのNSGをカンマ区切りリストで指定できます。
    oci.oraclecloud.com/oci-network-security-groups: "<nsg1-ocid>,<nsg2-ocid>,<nsg3-ocid>,<nsg4-ocid>,<nsg5-ocid>"
  • NSGからロード・バランサまたはネットワーク・ロード・バランサを削除したり、ロード・バランサまたはネットワーク・ロード・バランサが存在するNSGを変更するには、注釈を更新してマニフェストを再適用します。
  • 管理するNSGを使用してOracle Cloud Infrastructureロード・バランサまたはネットワーク・ロード・バランサへのアクセスを制御する場合、Oracleでは、ロード・バランサまたはネットワーク・ロード・バランサのマニフェスト・ファイルのメタデータ・セクションに次の注釈のいずれかをそれぞれ追加して、Kubernetesセキュリティ・リスト管理を無効にすることをお薦めします:

    service.beta.kubernetes.io/oci-load-balancer-security-list-management-mode: "None"
    oci-network-load-balancer.oraclecloud.com/security-list-management-mode:  "None"

    または、次の同等の注釈を追加できます。

    oci.oraclecloud.com/security-rule-management-mode: "None" 

    推奨事項に従って注釈を追加した場合、Kubernetesセキュリティ・リスト管理は有効になりません。ノード・プールおよびKubernetes APIエンドポイントのイングレス・セキュリティ・ルールおよびエグレス・セキュリティ・ルールを使用してNSGを設定する必要があります(詳細は、ネットワーク・セキュリティ・グループまたはセキュリティ・リスト(あるいはその両方)のセキュリティ・ルール構成およびネットワーク・リソース構成の例を参照してください)。また、kube-proxyヘルス・ポート、ヘルス・チェック・ポート範囲およびロード・バランサのイングレスおよびエグレス・セキュリティ・ルールを使用してNSGを設定する必要があります。

ロード・バランサおよびネットワーク・ロード・バランサのセキュリティ・ルール管理オプションの指定

セキュリティ・ルールは、LoadBalancerタイプのKubernetesサービスにプロビジョニングされるOracle Cloud Infrastructureロード・バランサおよびネットワーク・ロード・バランサへのアクセスを制御します。セキュリティ・ルールは、次の方法で管理(作成、更新および削除)できます。

  • ネットワーク・セキュリティ・グループまたはNSG (推奨) NSGのセキュリティ・ルールは、NSGに追加されたKubernetesリソースに適用されます。そのため、NSGは個々のリソースにきめ細かいアクセス制御を提供できます。
  • セキュリティ・リスト内。セキュリティ・リスト内のセキュリティ・ルールは、サブネット内のすべてのKubernetesリソースに適用されます。セキュリティ・リストは、サブネット内の個々のリソースに対するファイングレイン・アクセス制御を提供しません。

セキュリティ・ルールの仕組みに関する重要な情報、およびセキュリティ・リストとネットワーク・セキュリティ・グループの一般的な比較については、セキュリティ・ルールを参照してください。

ノート

セキュリティ・ルールがセキュリティ・リストで管理されている場合、インフラストラクチャが複雑で、Terraformなどのツールを使用すると、セキュリティの構成と管理が複雑になる可能性があります。また、セキュリティ・リストを使用してセキュリティ・ルールを管理する機能は、将来のリリースで非推奨になることに注意してください。このような理由から、Oracleでは、セキュリティ・ルールの管理にネットワーク・セキュリティ・グループ(NSG)およびoci.oraclecloud.com/security-rule-management-mode注釈を使用することをお薦めします。

必要に応じて、セキュリティ・ルールを自分で管理し、ルールを作成、更新および削除できます。または、oci-cloud-controller-manager (クラスタ・コントロール・プレーン上で実行)が、セキュリティ・ルールの一部またはすべてを管理することを指定することもできます。Container Engine for Kubernetesでは、oci-cloud-controller-managerを使用して、タイプLoadBalancerのKubernetesサービスのロード・バランサおよびネットワーク・ロード・バランサをプロビジョニングします。

oci-cloud-controller-managerがNSGまたはセキュリティ・リストのロード・バランサまたはネットワーク・ロード・バランサのセキュリティ・ルールを管理するかどうかを指定するには、次のように様々な注釈を使用します。

使用する注釈に関係なく、また、ユーザーまたはoci-cloud-controller-managerがセキュリティ・リストまたはNSGのセキュリティ・ルールを管理しているかどうかに関係なく、oci-cloud-controller-managerがロード・バランサまたはネットワーク・ロード・バランサを追加する1つ以上の追加NSGのOCIDを指定することもできます。この場合、oci.oraclecloud.com/oci-network-security-groupsまたはoci-network-load-balancer.oraclecloud.com/oci-network-security-groups注釈を使用します。oci-cloud-controller-managerは、これらの注釈で指定された追加のNSGのセキュリティ・ルールを管理しないため、セキュリティ・ルールの管理はユーザーの責任です。oci.oraclecloud.com/oci-network-security-groupsまたはoci-network-load-balancer.oraclecloud.com/oci-network-security-groupsアノテーションの使用の詳細は、ネットワーク・セキュリティ・グループの指定(推奨)を参照してください。

oci.oraclecloud.com/security-rule-management-mode注釈を使用したNSGおよびセキュリティ・リストのセキュリティ・ルールの管理

NSGのセキュリティ・ルールを管理するために必要なIAMポリシー

oci-cloud-controller-managerがNSGでクラスタのロード・バランサのセキュリティ・ルールを管理できるようにするには、NSGを管理する権限をクラスタに付与する必要があります。たとえば、特定のコンパートメントでこの権限を付与するには:

ALLOW any-user to manage network-security-groups in compartment <compartment-name> where request.principal.type = 'cluster' 

また、oci-cloud-controller-managerでネットワーク・セキュリティ・グループを作成できるようにするには、VCNを管理したり、仮想ネットワーク・ファミリを管理するための権限もクラスタに付与する必要があります。たとえば、次のいずれかのポリシー・ステートメントを指定します。

  • ALLOW any-user to manage vcns in compartment <compartment-name> where request.principal.type = 'cluster'
  • ALLOW any-user to manage virtual-network-family in compartment <compartment-name> where request.principal.type = 'cluster'

oci.oraclecloud.com/security-rule-management-mode注釈の使用

oci-cloud-controller-managerがNSG内のロード・バランサまたはネットワーク・ロード・バランサのセキュリティ・ルールを管理すること(Oracleで推奨)を指定するには、まず必要なIAMポリシーを設定する必要があります。NSGでセキュリティ・ルールを管理するために必要なIAMポリシーを参照してください。前提条件のIAMポリシーを設定したら、マニフェスト・ファイルのメタデータ・セクションに次の注釈を追加できます:

oci.oraclecloud.com/security-rule-management-mode: "NSG"

oci-cloud-controller-managerは、ロード・バランサまたはネットワーク・ロード・バランサ・サービスへのイングレスに必要なすべてのセキュリティ・ルールを、oci-cloud-controller-managerがその目的のために作成するNSGで管理します。このNSGはフロントエンドNSGと呼ばれ、0.0.0.0/0またはソースCIDRブロック(およびソース・ポート範囲)からのロード・バランサまたはネットワーク・ロード・バランサへのインバウンド・トラフィック(マニフェスト・ファイルで指定されている場合)を許可します。oci-cloud-controller-managerは、フロントエンドNSGに次のセキュリティ・ルールを作成します。

方向 ソース プロトコル/宛先ポート 説明
イングレス 0.0.0.0/0 (またはマニフェスト・ファイルに指定されている場合はソースCIDRブロック) マニフェストファイルに指定されたポート。 OCIロード・バランサへのインバウンド・トラフィックを許可します。
エグレス バックエンドNSG (バックエンドNSGのOCIDがマニフェスト・ファイルで指定されている場合) ALL/(サービスのノードポート) ワーカー・ノードへのトラフィックを許可します。
エグレス バックエンドNSG (バックエンドNSGのOCIDがマニフェスト・ファイルで指定されている場合) TCP/ヘルス・チェック・ポート(10256)

ソースIPアドレスが保持されている場合、ヘルス・チェック・ポートはサービスによって自動的に選択されます。

OCIロード・バランサまたはネットワーク・ロード・バランサが、ヘルス・チェック・ポート用にワーカー・ノードでkube-proxyと通信できるようにします。

oci-cloud-controller-managerで、バックエンド・セットのワーカー・ノードへのイングレス・トラフィックのセキュリティ・ルールを、ロード・バランサまたはネットワーク・ロード・バランサ・サービスからのエグレス・トラフィックとともに管理する場合は、その目的で使用する既存のNSGのOCIDを指定する必要があります。このNSGはバックエンドNSGと呼ばれます。oci-cloud-controller-managerは、バックエンドNSGを指定した場合にのみ、フロントエンドNSGにエグレス・ルールを追加します。バックエンドNSGとして使用するNSGを指定するには、マニフェスト・ファイルのメタデータ・セクションに次の注釈を追加します:

oci.oraclecloud.com/oci-backend-network-security-group: "<nsg-ocid>"

ここで、<NSG-OCID>は、クラスタと同じVCNにある既存のNSGのOCIDであり、ワーカー・ノードをホストするコンピュート・インスタンスがすでに追加されているNSGでもあります。例:

oci.oraclecloud.com/oci-backend-network-security-group: "ocid1.networksecuritygroup.oc1.phx.aaaaaa....cwex"

複数のバックエンドNSGのOCIDsをカンマ区切りリストで指定できます。例:

oci.oraclecloud.com/oci-backend-network-security-group: "ocid1.networksecuritygroup.oc1.phx.aaaaaa....cwex,ocid1.networksecuritygroup.oc1.phx.aaaaaa....jfle,ocid1.networksecuritygroup.oc1.phx.aaaaaa....pkrj"

バックエンド・セット内のワーカー・ノードをホストするコンピュート・インスタンスは、oci.oraclecloud.com/oci-backend-network-security-group注釈の値として指定するバックエンドNSGにすでに追加されている必要があります。次のいずれかの方法で、コンピュート・インスタンスをバックエンドNSGに追加できます:

  • ノード・プールの作成時にNSGを指定する方法(管理対象ノードおよび仮想ノードの場合)。
  • コンピュート・サービス(管理対象ノードの場合)を使用して、ワーカー・ノードをホストするコンピュート・インスタンスのプライマリVNICをNSGに手動で追加します。たとえば、コンピュート・サービスのコンソール・ページ(またはコンピュート・サービスのCLIまたはAPI)を使用します。

oci-cloud-controller-managerは、バックエンドNSGに次のセキュリティ・ルールを作成します:

方向 ソース プロトコル/宛先ポート 説明
イングレス フロントエンドNSG OCID TCP/ヘルス・チェック・ポート(10256)

ソースIPアドレスが保持されている場合、ヘルス・チェック・ポートはサービスによって自動的に選択されます。

OCIロード・バランサまたはネットワーク・ロード・バランサが、ヘルス・チェックのためにワーカー・ノードでkube-proxyと通信できるようにします。
イングレス フロントエンドNSG OCID ALL/(サービスのノードポート) OCIロード・バランサまたはネットワーク・ロード・バランサがワーカー・ノードと通信できるようにします。

バックエンドNSGにOCIDを指定しない場合、oci-cloud-controller-managerは、バックエンド・セット内のワーカー・ノードへのイングレス・トラフィックのセキュリティ・ルール、またはロード・バランサまたはネットワーク・ロード・バランサからのエグレス・トラフィックのセキュリティ・ルールを管理しません。

oci.oraclecloud.com/security-rule-management-mode注釈を他の値に設定して、セキュリティ・ルールを自分で管理するか、oci-cloud-controller-managerでセキュリティ・リスト内のセキュリティ・ルールを管理するように指定することもできます。注釈の完全な構文は次のとおりです。

oci.oraclecloud.com/security-rule-management-mode: <value>

<value>は次のいずれかです:

  • "NSG": (推奨) oci-cloud-controller-managerは、ロード・バランサまたはネットワーク・ロード・バランサ・サービスへのイングレスに必要なすべてのセキュリティ・ルールを、その目的のために作成するネットワーク・セキュリティ・グループ(NSG)で管理します。
  • "None": (ネットワーク・ロード・バランサのデフォルト)セキュリティ・リスト管理は有効化されず、oci-cloud-controller-managerはセキュリティ・ルールを管理しません。セキュリティ・ルールを設定して、ノード・ポート範囲、kube-proxyヘルス・ポートおよびヘルス・チェック・ポート範囲の適切なポートへのインバウンド・トラフィックを許可する必要があります。また、インバウンド・トラフィックがロード・バランサおよびネットワーク・ロード・バランサに許可されるようにセキュリティ・ルールを設定する必要があります(ロード・バランサおよびネットワーク・ロード・バランサのセキュリティ・ルールを参照)。これは、service.beta.kubernetes.io/oci-load-balancer-security-list-management-modeまたはoci-network-load-balancer.oraclecloud.com/security-list-management-mode"None"に設定することと同じです。
  • "SL-All": (ロード・バランサのデフォルト) oci-cloud-controller-managerは、ロード・バランサまたはネットワーク・ロード・バランサ・サービスとの間で送受信するために必要なすべてのセキュリティ・ルールをセキュリティ・リスト内で管理します。これは、service.beta.kubernetes.io/oci-load-balancer-security-list-management-modeまたはoci-network-load-balancer.oraclecloud.com/security-list-management-mode"All"に設定することと同じです。
  • "SL-Frontend": oci-cloud-controller-managerは、セキュリティ・リスト内のロード・バランサおよびネットワーク・ロード・バランサ・サービスへのイングレスのセキュリティ・ルールのみを管理します。セキュリティ・ルールを設定して、ノード・ポート範囲、kube-proxyヘルス・ポートおよびヘルス・チェック・ポート範囲の適切なポートへのインバウンド・トラフィックを許可する必要があります。これは、service.beta.kubernetes.io/oci-load-balancer-security-list-management-modeまたはoci-network-load-balancer.oraclecloud.com/security-list-management-mode"Frontend"に設定することと同じです。

管理対象ノードがあるクラスタで、管理モードを明示的に指定しない場合、または無効な値を指定した場合、oci-cloud-controller-managerは、ロード・バランサまたはネットワーク・ロード・バランサ・サービスとの間のイングレスおよびエグレスに必要なすべてのセキュリティ・ルールをセキュリティ・リスト("SL-All"と同等)で管理します。この場合、oci-cloud-controller-managerは、0.0.0.0/0 (またはマニフェスト・ファイルに指定されたソース・ポート範囲)からリスナー・ポートへのインバウンド・トラフィックを許可するセキュリティ・ルールを作成することに注意してください。仮想ノードを持つクラスタでは、セキュリティ・リスト管理は有効化されず、セキュリティ・ルールを常に手動で構成する必要があります("None"と同等)。

次の点に注意してください:

  • oci.oraclecloud.com/security-rule-management-mode注釈とservice.beta.kubernetes.io/oci-load-balancer-security-list-management-modeまたはoci-network-load-balancer.oraclecloud.com/security-list-management-mode注釈の両方をマニフェストに含めると、oci-cloud-controller-managerは常にoci.oraclecloud.com/security-rule-management-modeを使用し、他の注釈は無視されます。
  • セキュリティ・リストとネットワーク・セキュリティ・グループの両方で許可されるイングレス・ルールおよびエグレス・ルールの数に制限があります(それぞれ、セキュリティ・リストの制限およびネットワーク・セキュリティ・グループの制限を参照)。イングレス・ルールまたはエグレス・ルールの数が制限を超えると、ロード・バランサまたはネットワーク・セキュリティ・グループの作成または更新が失敗します。
  • ロード・バランサまたはネットワーク・ロード・バランサは、最大5つのNSGに追加できます。NSGの数が制限を超えると、エラーが返されます。
  • タイプLoadBalancerのKubernetesサービスを削除すると、OCI-cloud-controller-managerによって作成されたOCIリソース(フロントエンドNSGおよびフロントエンドNSGまたはバックエンドNSGで作成されたセキュリティ・ルール)が削除されます。バックエンドNSGおよびoci-cloud-controller-managerで作成されなかったセキュリティ・ルールは削除されません。
  • LoadBalancerタイプのKubernetesサービスのネットワーク・ロード・バランサをプロビジョニングする場合、is-preserve-source: "true"注釈を使用して、IPパケットのヘッダーにクライアントIPアドレスの保持を指定できます(externalTrafficPolicy注釈が"Local"に設定されている場合にのみ有効です)。この場合、oci-cloud-controller-managerはバックエンドNSGにセキュリティ・ルールを作成し、LoadBalancerサービス・マニフェストでloadBalancerSourceRangesで指定されたCIDRブロックからバックエンド・セット内のワーカー・ノードへのアクセスを許可します。loadBalancerSourceRangesでCIDRブロックが指定されていない場合、oci-cloud-controller-managerは、nodePortで指定されたポート番号でインターネット(0.0.0.0/0)からのアクセスを許可するセキュリティ・ルールを作成します。
  • oci.oraclecloud.com/oci-backend-network-security-group注釈の値として指定するバックエンドNSGは、クラスタと同じVCNに存在する必要があります。
  • バックエンド・セット内のワーカー・ノードをホストするコンピュート・インスタンスは、oci.oraclecloud.com/oci-backend-network-security-group注釈の値として指定するバックエンドNSGにすでに追加されている必要があります。

セキュリティ・ルール管理注釈の例

例1: 管理対象セキュリティ・ルールを使用して新しいフロントエンドNSGを作成し、既存のバックエンドNSGでセキュリティ・ルールを管理

この例では:

  • oci-cloud-controller-managerで、ロード・バランサのフロントエンドNSGを作成し、そのNSGのセキュリティ・ルールを管理する必要があります。
  • oci-cloud-controller-managerで既存のバックエンドNSGを使用し、そのNSGでセキュリティ・ルールを管理する場合。

oci.oraclecloud.com/security-rule-management-mode注釈の値として"NSG"を指定し、oci.oraclecloud.com/oci-backend-network-security-group注釈の値として既存のNSGのOCIDを指定します。

apiVersion: v1
kind: Service
metadata:
  name: my-nginx-svc
  labels:
    app: nginx
  annotations:
    oci.oraclecloud.com/load-balancer-type: "lb"    
    oci.oraclecloud.com/security-rule-management-mode: "NSG"
    oci.oraclecloud.com/oci-backend-network-security-group: <nsg_ocid> 
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx

この場合は次のようになります。

  • oci-cloud-controller-managerは、ロード・バランサのフロントエンドNSGを作成し、そのセキュリティ・ルールを管理します。
  • oci-cloud-controller-managerは、oci-backend-network-security-group注釈で指定されたOCIDを持つバックエンドNSGのセキュリティ・ルールを管理します。

次の点に注意してください:

  • oci.oraclecloud.com/oci-backend-network-security-group注釈の値として指定するバックエンドNSGは、クラスタと同じVCNに存在する必要があります。
  • バックエンド・セット内のワーカー・ノードをホストするコンピュート・インスタンスは、oci.oraclecloud.com/oci-backend-network-security-group注釈の値として指定するバックエンドNSGにすでに追加されている必要があります。

例2: 管理対象セキュリティ・ルールを使用して新しいフロントエンドNSGを作成し、既存のバックエンドNSGでセキュリティ・ルールを手動で管理します

この例では:

  • oci-cloud-controller-managerで、ロード・バランサのフロントエンドNSGを作成し、そのNSGのセキュリティ・ルールを管理する必要があります。
  • セキュリティ・ルールを手動で定義して、作成および管理するNSGのロード・バランサのフロント・エンドからバックエンドへのトラフィックを制御する必要があります。たとえば、トラフィックがLBからワーカー・ノードにルーティングされないようにするセキュリティ・ルールを作成できます。

oci.oraclecloud.com/security-rule-management-mode注釈の値として"NSG"を指定します。

apiVersion: v1
kind: Service
metadata:
  name: my-nginx-svc
  labels:
    app: nginx
  annotations:
    oci.oraclecloud.com/load-balancer-type: "lb"    
    oci.oraclecloud.com/security-rule-management-mode: "NSG"
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx

この場合は次のようになります。

  • oci-cloud-controller-managerは、ロード・バランサのフロントエンドNSGを作成し、そのセキュリティ・ルールを管理します。
  • バックエンドNSGでセキュリティ・ルールを作成および管理して、フロントエンドNSGからバックエンドNSGへのトラフィックを制御する責任があります。

例3: 管理されたセキュリティ・ルールを使用して新しいフロントエンドNSGを作成し、既存のバックエンドNSGでセキュリティ・ルールを管理(ただし、注釈が正しく使用されない)

この例では:

  • oci-cloud-controller-managerで、ロード・バランサのフロントエンドNSGを作成し、そのNSGのセキュリティ・ルールを管理する必要があります。
  • oci-cloud-controller-managerで既存のバックエンドNSGを使用し、そのNSGでセキュリティ・ルールを管理する場合。ただし、注釈を誤って指定します。

oci.oraclecloud.com/security-rule-management-mode注釈の値として"NSG"を正しく指定します。ただし、service.beta.kubernetes.io/oci-load-balancer-security-list-management-mode注釈を誤って含めて、oci.oraclecloud.com/oci-backend-network-security-group注釈を省略するとします。

apiVersion: v1
kind: Service
metadata:
  name: my-nginx-svc
  labels:
    app: nginx
  annotations:
    oci.oraclecloud.com/load-balancer-type: "lb"    
    oci.oraclecloud.com/security-rule-management-mode: "NSG"
    service.beta.kubernetes.io/oci-load-balancer-security-list-management-mode: "All"
  spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx

この場合は次のようになります。

  • oci-cloud-controller-managerは、ロード・バランサのフロントエンドNSGを作成し、そのセキュリティ・ルールを管理します。
  • oci-cloud-controller-managerは、service.beta.kubernetes.io/oci-load-balancer-security-list-management-mode注釈を無視します(oci.oraclecloud.com/security-rule-management-mode注釈が存在するため)。
  • バックエンドNSGでセキュリティ・ルールを作成および管理して、フロントエンドNSGからバックエンドNSGへのトラフィックを制御します(oci.oraclecloud.com/oci-backend-network-security-groupアノテーションが存在しないため)。

例4: 管理対象セキュリティ・ルールを使用して新しいフロントエンドNSGを作成し、既存のバックエンドNSGでセキュリティ・ルールを管理し、既存のNSGにロード・バランサを追加します

この例では:

  • oci-cloud-controller-managerで、ロード・バランサのフロントエンドNSGを作成し、そのNSGのセキュリティ・ルールを管理する必要があります。
  • oci-cloud-controller-managerで既存のバックエンドNSGを使用し、そのNSGでセキュリティ・ルールを管理する場合。
  • あなたは、oci-cloud-controller-managerで、管理するセキュリティ・ルールを持つ既存のNSGにロード・バランサを追加しようと考えています。

次のように指定します。

  • oci.oraclecloud.com/security-rule-management-mode注釈の値として"NSG"を指定します。
  • oci-cloud-controller-managerで使用する既存のNSGのOCIDをoci.oraclecloud.com/oci-backend-network-security-group注釈の値として使用します。
  • oci-cloud-controller-managerでロード・バランサを追加する既存のNSGのOCID。

マニフェストは次のとおりです。

apiVersion: v1
kind: Service
metadata:
  name: my-nginx-svc
  labels:
    app: nginx
  annotations:
    oci.oraclecloud.com/load-balancer-type: "lb"    
    oci.oraclecloud.com/security-rule-management-mode: "NSG"
    oci.oraclecloud.com/oci-backend-network-security-group: <nsg_ocid>
    oci.oraclecloud.com/oci-network-security-groups: "<nsg-ocid>"
  spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx

この場合は次のようになります。

  • oci-cloud-controller-managerは、ロード・バランサのフロントエンドNSGを作成し、そのセキュリティ・ルールを管理します。
  • oci-cloud-controller-managerは、oci.oraclecloud.com/oci-backend-network-security-group注釈で指定されたOCIDを持つバックエンドNSGのセキュリティ・ルールを管理します。
  • oci-cloud-controller-managerは、oci.oraclecloud.com/oci-network-security-groups注釈で指定されたNSGにロード・バランサを追加します。

ヘルス・チェック・パラメータの指定

Oracle Cloud Infrastructureロード・バランサおよびネットワーク・ロード・バランサは、ヘルス・チェック・ポリシーを適用してバックエンド・サーバーを継続的に監視します。ヘルス・チェックは、バックエンド・サーバーの可用性を確認するためのテストで、リクエストまたは接続の試行である場合があります。サーバーがヘルス・チェックに失敗すると、ロード・バランサまたはネットワーク・ロード・バランサは一時的にそのサーバーをローテーションから除外します。その後、サーバーがヘルス・チェックに合格すると、ロード・バランサまたはネットワーク・ロード・バランサはそれをローテーションに戻します。

ヘルス・チェック・ポリシーには多数のパラメータが含まれ、それぞれにデフォルト値があります。Container Engine for KubernetesがLoadBalancerタイプのKubernetesサービスのOCIロード・バランサまたはネットワーク・ロード・バランサをプロビジョニングする場合、マニフェスト・ファイルのメタデータ・セクションに注釈を含めることで、ヘルス・チェック・パラメータのデフォルト値をオーバーライドできます。これらの注釈は、後で追加、変更および削除できます。ヘルス・チェック・パラメータの値を指定した注釈を削除すると、ロード・バランサまたはネットワーク・ロード・バランサはかわりにパラメータのデフォルト値を使用します。

ロード・バランサのヘルス・チェック・パラメータの構成

Container Engine for KubernetesがタイプLoadBalancerのKubernetesサービスのロード・バランサをプロビジョニングするときにヘルス・チェック・パラメータを構成するには、マニフェスト・ファイルのメタデータ・セクションに次の注釈を追加します:

  • ヘルス・チェック・リクエストの試行が何回失敗したら、バックエンド・サーバーが異常とみなされるかを指定するには、マニフェスト・ファイルのメタデータ・セクションに次の注釈を追加します:

    service.beta.kubernetes.io/oci-load-balancer-health-check-retries: "<value>"

    ここで、<value>は、失敗したヘルス・チェック・リクエストの数です。

  • ヘルス・チェック・リクエストの間隔を指定するには、マニフェスト・ファイルのメタデータ・セクションに次の注釈を追加します:

    service.beta.kubernetes.io/oci-load-balancer-health-check-interval: "<value>"

    ここで、<value>はミリ秒単位の数値です。最小値は1000です。

  • ヘルス・チェック・リクエストへのレスポンスを待機する最大時間を指定するには、マニフェスト・ファイルのメタデータ・セクションに次の注釈を追加します:

    service.beta.kubernetes.io/oci-load-balancer-health-check-timeout: "<value>"

    ここで、<value>はミリ秒単位の数値です。ヘルス・チェックが成功するのは、ロード・バランサがこのタイムアウト期間内にレスポンスを受信した場合のみです。

例:


apiVersion: v1
kind: Service
metadata:
  name: my-nginx-svc
  labels:
    app: nginx
  annotations:
    oci.oraclecloud.com/load-balancer-type: "lb"
    service.beta.kubernetes.io/oci-load-balancer-health-check-retries: "5"
    service.beta.kubernetes.io/oci-load-balancer-health-check-interval: "15000"
    service.beta.kubernetes.io/oci-load-balancer-health-check-timeout: "4000"
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx
ネットワーク・ロード・バランサのヘルス・チェック・パラメータの構成

Container Engine for KubernetesがLoadBalancerタイプのKubernetesサービスのネットワーク・ロード・バランサをプロビジョニングするときにヘルス・チェック・パラメータを構成するには、マニフェスト・ファイルのメタデータ・セクションに次の注釈を追加します:

  • ヘルス・チェック・リクエストの試行が何回失敗したら、バックエンド・サーバーが異常とみなされるかを指定するには、マニフェスト・ファイルのメタデータ・セクションに次の注釈を追加します:

    oci-network-load-balancer.oraclecloud.com/health-check-retries: "<value>"

    ここで、<value>は、失敗したヘルス・チェック・リクエストの数です。

  • ヘルス・チェック・リクエストの間隔を指定するには、マニフェスト・ファイルのメタデータ・セクションに次の注釈を追加します:

    oci-network-load-balancer.oraclecloud.com/health-check-interval: "<value>"

    ここで、<value>はミリ秒単位の数値です。最小値は1000です。

  • ヘルス・チェック・リクエストへのレスポンスを待機する最大時間を指定するには、マニフェスト・ファイルのメタデータ・セクションに次の注釈を追加します:

    oci-network-load-balancer.oraclecloud.com/health-check-timeout: "<value>"

    ここで、<value>はミリ秒単位の数値です。ヘルス・チェックが成功するのは、ネットワーク・ロード・バランサがこのタイムアウト期間内にレスポンスを受信した場合のみです。

例:


apiVersion: v1
kind: Service
metadata:
  name: my-nginx-svc
  labels:
    app: nginx
  annotations:
    oci.oraclecloud.com/load-balancer-type: "nlb"
    oci-network-load-balancer.oraclecloud.com/health-check-retries: "5"
    oci-network-load-balancer.oraclecloud.com/health-check-interval: "15000"
    oci-network-load-balancer.oraclecloud.com/health-check-timeout: "4000"
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx

マニフェスト・ファイルのメタデータ・セクションに注釈を含めてヘルス・チェック・パラメータ値を明示的に指定しない場合は、次のデフォルトが使用されます:

Load Balancerの注釈 ネットワークLoad Balancerの注釈

使用されるデフォルト値

service.beta.kubernetes.io/oci-load-balancer-health-check-retries oci-network-load-balancer.oraclecloud.com/health-check-retries "3"
service.beta.kubernetes.io/oci-load-balancer-health-check-interval oci-network-load-balancer.oraclecloud.com/health-check-interval "10000"
service.beta.kubernetes.io/oci-load-balancer-health-check-timeout oci-network-load-balancer.oraclecloud.com/health-check-timeout "3000"

Oracle Cloud Infrastructureロード・バランサおよびネットワーク・ロード・バランサのヘルス・チェック・ポリシーの詳細は、次を参照してください:

バックエンド・セットに含めるワーカー・ノードの選択

Oracle Cloud Infrastructureロード・バランサまたはネットワーク・ロード・バランサへの受信トラフィックは、バックエンド・セット内のバックエンド・サーバー間で分散されます。デフォルトでは、Container Engine for KubernetesがLoadBalancerタイプのKubernetesサービスに対してOracle Cloud Infrastructureロード・バランサまたはネットワーク・ロード・バランサをプロビジョニングする場合、クラスタ内のすべてのワーカー・ノードがバックエンド・セットに含まれます。

ただし、特定のロード・バランサまたはネットワーク・ロード・バランサのバックエンド・セットに含めるクラスタ内のワーカー・ノードのサブセットのみを選択するオプションがあります。異なるロード・バランサおよびネットワーク・ロード・バランサのバックエンド・セットにクラスタのワーカー・ノードのサブセットを含めることで、単一のKubernetesクラスタを複数の論理クラスタ(サービス)として表示できます。

ロード・バランサ・バックエンド・セットに含めるワーカー・ノードを選択します

Container Engine for KubernetesがLoadBalancerタイプのKubernetesサービスのロード・バランサをプロビジョニングするときにバックエンド・セットに含めるワーカー・ノードを選択するには、マニフェスト・ファイルのメタデータ・セクションに次の注釈を追加します:

oci.oraclecloud.com/node-label-selector: <label>

<label>は、標準のKubernetesラベル・セレクタ表記を使用して識別される1つ以上のラベル・キーおよび値です。たとえば、lbset=set1です。

例:


apiVersion: v1
kind: Service
metadata:
  name: my-nginx-svc
  labels:
    app: nginx
  annotations:
    oci.oraclecloud.com/load-balancer-type: "lb"
    oci.oraclecloud.com/node-label-selector: lbset=set1
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx

ネットワーク・ロード・バランサ・バックエンド・セットに含めるワーカー・ノードを選択します

Container Engine for KubernetesがLoadBalancerタイプのKubernetesサービスのネットワーク・ロード・バランサをプロビジョニングするときにバックエンド・セットに含めるワーカー・ノードを選択するには、マニフェスト・ファイルのメタデータ・セクションに次の注釈を追加します:

oci-network-load-balancer.oraclecloud.com/node-label-selector: <label>

<label>は、標準のKubernetesラベル・セレクタ表記を使用して識別される1つ以上のラベル・キーおよび値です。たとえば、lbset=set1です。

例:


apiVersion: v1
kind: Service
metadata:
  name: my-nginx-svc
  labels:
    app: nginx
  annotations:
    oci.oraclecloud.com/load-balancer-type: "nlb"
    oci-network-load-balancer.oraclecloud.com/node-label-selector: lbset=set1
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx

標準のKubernetesラベル・セレクタ表記を使用して、マニフェスト・ファイルのメタデータ・セクションの注釈にラベル・キーおよび値を指定します。標準のKubernetesラベル・セレクタ表記の詳細は、Kubernetesドキュメントのラベル・セレクタを参照してください。

この表は、標準のKubernetesラベル・セレクタ表記の例を示しています。

Load Balancerの注釈 ネットワークLoad Balancerの注釈

バックエンド・セットに含める:

oci.oraclecloud.com/node-label-selector: lbset=set1 oci-network-load-balancer.oraclecloud.com/node-label-selector: lbset=set1

set1を持つラベル・キーlbsetを持つすべてのワーカー・ノード

oci.oraclecloud.com/node-label-selector: lbset in (set1, set3) oci-network-load-balancer.oraclecloud.com/node-label-selector: lbset in (set1, set3)

set1またはset3を持つラベル・キーlbsetを持つすべてのワーカー・ノード

oci.oraclecloud.com/node-label-selector: lbset oci-network-load-balancer.oraclecloud.com/node-label-selector: lbset 値に関係なく、ラベル・キーがlbsetのすべてのワーカー・ノード。
oci.oraclecloud.com/node-label-selector: env=prod,lbset in (set1, set3) oci-network-load-balancer.oraclecloud.com/node-label-selector: env=prod,lbset in (set1, set3)

prodを持つラベル・キーenvと、値set1または値set3を持つラベル・キーlbsetを持つすべてのワーカー・ノード

oci.oraclecloud.com/node-label-selector: env!=test oci-network-load-balancer.oraclecloud.com/node-label-selector: env!=test

testを持たないラベル・キーenvを持つすべてのワーカー・ノード

ポッド準備ゲートの指定

ノート

仮想ノードを持つクラスタにはポッド準備ゲートを指定できますが、管理対象ノードを持つクラスタには指定できません。

Container Engine for KubernetesがタイプLoadBalancerのKubernetesサービスに対してOracle Cloud Infrastructureロード・バランサまたはネットワーク・ロード・バランサをプロビジョニングする場合、ポッド・レディネス・ゲートを使用して、両方ともバックエンド・セットに正常に追加され、トラフィックを受信する準備ができているポッドにのみトラフィックがルーティングされるようにできます。仮想ノードで実行されているポッドにはポッド準備ゲートを指定できますが、管理対象ノードで実行されているポッドには指定できません。管理対象ノードで実行されているポッドのポッド準備ゲートを定義しないでください。

ポッド準備ゲートは、ポッドがトラフィックを受信する準備ができていることを示す追加の条件です。ポッド・レディネス・ゲートを使用すると、複雑なカスタム・レディネス・チェックを実装でき、ローリング・デプロイメント中にゼロ・ダウンタイムを実現できます。詳細は、Kubernetesドキュメントのポッド・レディネス詳細を参照してください。

ロード・バランサまたはネットワーク・ロード・バランサをプロビジョニングする場合、バックエンド・セットは、Readyという条件を持つデプロイメントのポッド・レプリカのIPアドレスで構成されます。デプロイメントを更新すると(たとえば、新しいイメージを使用するには)、既存のポッド・レプリカが新しいポッド・レプリカに置き換えられます。ただし、次の理由により、すべてのポッド・レプリカを置き換えるには時間がかかり、バックエンドが使用できなくなる可能性があります:

  • 既存のポッド・レプリカは、バックエンド・セットが新しいポッド・レプリカのIPアドレスで更新される前に終了する場合があります。
  • バックエンド・セットは、新しいポッド・レプリカがトラフィックを受信する準備が整う前に、新しいポッド・レプリカのIPアドレスで更新される場合があります。

ポッド・レディネス・ゲートの使用を指定すると、バックエンドがロード・バランサまたはネットワーク・ロード・バランサで常に使用可能になります。既存のポッドは、新しいポッドがバックエンド・セットに追加され、新しいポッドがトラフィックを受信する準備が整うまで終了しません。

Container Engine for Kubernetesが、特定のネームスペースで作成されたすべてのポッドのポッド仕様にポッド準備ゲートを注入することを指定するには、次のように入力してloadbalancer.oci.oraclecloud.com/pod-readiness-gate-inject=enabledラベルをネームスペースに追加します:

kubectl label ns <namespace> loadbalancer.oci.oraclecloud.com/pod-readiness-gate-inject=enabled

次の例は、ポッド準備ゲートを使用してロード・バランサを作成する方法を示しています。

まず、次のように入力して、pdrネームスペースにラベルを付けて、ネームスペースのポッド準備ゲートを指定します:

kubectl label ns pdr loadbalancer.oci.oraclecloud.com/pod-readiness-gate-inject=enabled

コマンドの出力により、ネームスペースにラベルが付けられていることが確認されます。

namespace/pdr labeled

次に、次のように入力して、Nginxをpdrネームスペースにデプロイします。

kubectl apply -f https://raw.githubusercontent.com/oracle-devrel/oci-oke-virtual-nodes/main/nginx-svc/nginx.yaml -n pdr

次のように入力して、pdrネームスペース内のポッドをリストします:

kubectl get pods -n pdr

これで、Nginxマニフェストのイメージ・バージョンを更新し、既存のポッドが新しいポッドに置き換えられるように、マニフェストを再適用することで、ポッド・レディネス・ゲートの使用をデモンストレーションできます。

次に示すように、Nginxマニフェストをhttps://raw.githubusercontent.com/oracle-devrel/oci-oke-virtual-nodes/main/nginx-svc/nginx.yamlからダウンロードし、イメージ・バージョンをnginx:1.25.1に変更します。
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.25.1
...

次のように入力してマニフェストを再適用してください:

kubectl apply -f ./nginx.yaml -n pdr

次のように入力して、ロールアウトされる新しいポッドを確認します。

kubectl get pods -o wide -n pdr

例:

NAME                     READY   STATUS    RESTARTS   AGE   IP            NODE          NOMINATED NODE   READINESS GATES
nginx-678976847c-8bqs7   1/1     Running   0          44m   10.0.10.153   10.0.10.253   <none>           1/1
nginx-678976847c-ttqms   1/1     Running   0          47m   10.0.10.201   10.0.10.253   <none>           1/1

次のように入力して、新しいポッドのステータスを確認します:

kubectl describe pod <pod-name> -n pdr

例:

kubectl describe pod nginx-678976847c-ttqms  -n pdr

コマンドの出力によって、podreadiness.loadbalancer.oraclecloud.com準備ゲートのステータスが確認されます。例:

...
Readiness Gates:
  Type                                                             Status
  podreadiness.loadbalancer.oraclecloud.com/f913fe603a9be9b5d51f   True 
Conditions:
  Type                                                             Status
  podreadiness.loadbalancer.oraclecloud.com/f913fe603a9be9b5d51f   True 
  PodScheduled                                                     True 
  Initialized                                                      True 
  Ready                                                            True 
  ContainersReady                                                  True 

ノードがトラフィックを処理できないようにする

Oracle Cloud Infrastructureロード・バランサまたはネットワーク・ロード・バランサのバックエンド・セットのバックエンド・サーバーのリストから特定のワーカー・ノードを除外できます。詳細は、node.kubernetes.io/exclude-from-external-load-balancersを参照してください。

ロード・バランサおよびネットワーク・ロード・バランサのタグ付け

Container Engine for KubernetesがタイプLoadBalancerのKubernetesサービスにプロビジョニングするタグをロード・バランサまたはネットワーク・ロード・バランサに追加できます。タグ付けを使用すると、コンパートメント間で異なるリソースをグループ化でき、独自のメタデータでリソースに注釈を付けることもできます。「ロード・バランサへのタグの適用」を参照してください。