ロード・バランサおよびネットワーク・ロード・バランサの構成
Kubernetes Engine (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のタイプを参照してください
クラスタの作成時にロード・バランサ用に指定されたサブネットでホストされるプライベート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クラスタの作成時にロード・バランサ用に指定されたサブネットでホストされるプライベート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サービスがクラスタにデプロイされると、Kubernetes Engineは、クラスタへのトラフィックを受け入れるOracle Cloud Infrastructureパブリック・ロード・バランサまたはネットワーク・ロード・バランサを作成します。デフォルトでは、Oracle Cloud Infrastructureのパブリック・ロード・バランサまたはネットワーク・ロード・バランサにエフェメラル・パブリックIPアドレスが割り当てられます。ただし、一時的パブリックIPアドレスは一時的であり、パブリック・ロード・バランサまたはネットワーク・ロード・バランサの存続期間中のみ続きます。
デプロイメント後にKubernetes Engineによって作成されるOracle Cloud Infrastructureパブリック・ロード・バランサまたはネットワーク・ロード・バランサに同じパブリックIPアドレス・デプロイメントを持たせる場合は、予約済パブリックIPv4アドレスのプールから予約済パブリックIPv4アドレスを割り当てることができます。予約済パブリックIPv4アドレスの作成および表示の詳細は、パブリックIPアドレスを参照してください。
予約済パブリックIPv4アドレスは、Kubernetes Engineによって作成されるOracle Cloud Infrastructureパブリック・ロード・バランサまたはネットワーク・ロード・バランサに、次のいずれかの方法で割り当てることができます:
以前のリリースのKubernetesエンジン(バージョン1.30より前のKubernetesバージョンを実行しているクラスタをサポート)では、spec.loadBalancerIPフィールドを使用して、IPv4予約済パブリックIPアドレスを指定できます。spec.loadBalancerIPフィールドは、Kubernetesバージョン1.30以降を実行しているクラスタでは引き続きサポートされますが、将来のリリースでは非推奨になります。このため、Oracleでは、oci.oraclecloud.com/reserved-ips注釈を使用して、spec.loadBalancerIPフィールドではなく、新しい構成で予約済パブリックIPv4アドレスを指定することをお薦めします。
方法1: oci.oraclecloud.com/reserved-ips注釈の使用(推奨)
予約済パブリックIPv4アドレスを割り当てるには、サービス・マニフェストのメタデータ・セクションに次の注釈を追加します。
oci.oraclecloud.com/reserved-ips: "<reserved_ipv4_address>"
"<reserved_ipv4_address>"は、予約済パブリックIPv4アドレスの文字列値です(たとえば、"10.0.0.1")。
apiVersion: v1
kind: Service
metadata:
name: my-lb-service
annotations:
oci.oraclecloud.com/reserved-ips: "10.0.0.1"
oci.oraclecloud.com/load-balancer-type: "lb"
spec:
type: LoadBalancer
ports:
- port: 80
targetPort: 80
selector:
app: my-appapiVersion: v1
kind: Service
metadata:
name: my-nlb-service
annotations:
oci.oraclecloud.com/reserved-ips: "10.0.0.1"
oci.oraclecloud.com/load-balancer-type: "nlb"
spec:
type: LoadBalancer
ports:
- port: 80
targetPort: 80
selector:
app: my-app方法2: spec.loadBalancerIPフィールドの使用
予約済パブリックIPv4アドレスを割り当てるには、サービス・マニフェストのspecセクションにloadBalancerIPプロパティを追加し、予約済パブリック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: nginxapiVersion: 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ノート
- 注釈が優先されます:同じマニフェストで
oci.oraclecloud.com/reserved-ips注釈とspec.loadBalancerIPプロパティの両方を指定した場合、注釈が優先されます。 - IPv4のみ:両方のメソッドでは、予約済パブリックIPv4アドレスのみがサポートされています。IPv6アドレスまたは予約されていないIPv4アドレスを指定すると、HTTP 400 Bad Request InvalidParameterエラーが発生します。
- 単一割当て:どちらの方法でも、単一の予約済パブリックIPv4アドレスのみを指定できます。複数の予約済パブリックIPv4アドレス、または無効な形式でIPv4アドレスを指定した場合、ロード・バランサまたはネットワーク・ロード・バランサの作成または更新が失敗する可能性があります。
- アドレスの変更:どちらの方法でも、後でKubernetesエンジンが作成するロード・バランサまたはネットワーク・ロード・バランサのIPアドレスを直接変更することはできません。IPアドレスを変更するには、LoadBalancerタイプのサービスを削除し、新しいアドレスでマニフェストを更新して再デプロイします。
- エフェメラルから予約への切替え:どちらの方法でも、予約済パブリックIPv4アドレスを最初に設定しない場合、LoadBalancerタイプのサービスを削除して再作成せずに、後でエフェメラルから予約済IPアドレスに切り替えることはできません。
- 排他性:どちらの方法でも、別のリソース(コンピュート・インスタンスやLoadBalancerタイプの別のサービスなど)ですでに使用されている予約済パブリックIPv4アドレスを割り当てることはできません。
- 内部サービス:両方の方法では、内部ロード・バランサ・サービス(つまり、
service.beta.kubernetes.io/oci-load-balancer-internal: "true"またはoci-network-load-balancer.oraclecloud.com/internal: "true"注釈を含むマニフェスト・ファイルを含むサービス)のIPアドレスを指定できません。 -
コンパートメント:どちらの方法でも、デフォルトでは、予約済パブリックIPv4アドレスはクラスタと同じコンパートメントのリソースであることが想定されます。別のコンパートメントに予約済パブリックIPv4アドレスを指定する場合:
- パブリック・ロード・バランサの場合は、テナンシに次のポリシーを追加します:
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を使用して、KubernetesエンジンがタイプLoadBalancerのKubernetesサービスにプロビジョニングするOracle Cloud Infrastructureロード・バランサまたはネットワーク・ロード・バランサへのアクセスを制御できます。
NSGを使用してアクセスを制御する場合は、ロード・バランサまたはネットワーク・ロード・バランサのサブネットとの間でインバウンドおよびアウトバウンド・トラフィックを許可するための適切なセキュリティ・ルールが存在する必要があります。ロード・バランサおよびネットワーク・ロード・バランサのセキュリティ・ルールを参照してください。
NSGを使用してロード・バランサまたはネットワーク・ロード・バランサへのアクセスを制御する場合:
- NSGおよびセキュリティ・ルールは、oci-cloud-controller-managerによって完全に管理できます(ロード・バランサおよびネットワーク・ロード・バランサのセキュリティ・ルール管理オプションの指定を参照)。
- NSGおよびセキュリティ・ルールを自分で管理し、ロード・バランサまたはネットワーク・ロード・バランサを既存のNSGに追加できます(この項を参照)。
- oci-cloud-controller-managerは、あるNSGで一部のセキュリティ・ルールを管理し、別のNSGで他のセキュリティ・ルールを管理するようにできます。
管理するNSGを使用してアクセスを制御するには、マニフェスト・ファイルに注釈を含めて、ロード・バランサまたはネットワーク・ロード・バランサを追加するNSGを指定します。
Kubernetes Engineによって作成された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: nginxKubernetes Engineによって作成された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 (クラスタ・コントロール・プレーン上で実行)が、セキュリティ・ルールの一部またはすべてを管理することを指定することもできます。Kubernetes Engineは、oci-cloud-controller-managerを使用して、タイプLoadBalancerのKubernetesサービスのロード・バランサおよびネットワーク・ロード・バランサをプロビジョニングします。
oci-cloud-controller-managerがNSGまたはセキュリティ・リストのロード・バランサまたはネットワーク・ロード・バランサのセキュリティ・ルールを管理するかどうかを指定するには、次のように様々な注釈を使用します。
-
NSGでセキュリティ・ルールを管理するには、
oci.oraclecloud.com/security-rule-management-mode: "NSG"注釈を使用します(推奨)。oci-cloud-controller-managerでNSGのセキュリティ・ルールを管理する場合は(Oracleで推奨)、
oci.oraclecloud.com/security-rule-management-mode: "NSG"注釈を使用する必要があります。この注釈の使用の詳細は、oci.oraclecloud.com/security-rule-management-mode注釈を使用したNSGおよびセキュリティ・リストのセキュリティ・ルールの管理を参照してください。 -
セキュリティ・リスト内のセキュリティ・ルールを管理するには、
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で、ロード・バランサまたはネットワーク・ロード・バランサのサブネットのセキュリティ・リストのセキュリティ・ルールを管理する場合は、次のいずれかを実行します:
"SL-All"または"SL-Frontend"に設定されたoci.oraclecloud.com/security-rule-management-mode注釈を使用します。この注釈の使用の詳細は、oci.oraclecloud.com/security-rule-management-mode注釈を使用したNSGおよびセキュリティ・リストのセキュリティ・ルールの管理を参照してください。"All"または"Frontend"に設定されたservice.beta.kubernetes.io/oci-load-balancer-security-list-management-modeおよびoci-network-load-balancer.oraclecloud.com/security-list-management-mode注釈をそれぞれ使用します。これらの2つの注釈の使用の詳細は、OCI Load Balancerのプロビジョニング時のセキュリティ・リスト管理オプションの指定およびOCI Network Load Balancerのプロビジョニング時のセキュリティ・リスト管理オプションの指定をそれぞれ参照してください。
使用する注釈に関係なく、また、ユーザーまたは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が(Oracleの推奨に従って)NSGのロード・バランサまたはネットワーク・ロード・バランサのセキュリティ・ルールを管理することを指定するには、まず必要な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にすでに追加されている必要があります。 -
大規模または標準化された環境のルール管理を簡素化するために、クラスタの作成または更新時に(たとえば、OCI API、SDKまたはCLIを使用して)1つ以上のデフォルト・バックエンドNSGをオプションで指定できます。デフォルトのバックエンドNSGを指定するには、CreateCluster操作およびクラスタの更新操作の使用時に、
ServiceLbConfigDetailsオブジェクトのbackendNsgIds属性を設定します。たとえば、クラスタの作成に使用できるJSONファイルの次のセクションでは、2つのデフォルトのバックエンドNSGを指定します。{ "name": "sales", "compartmentId": "oocid1.compartment.oc1..aaaaaaaa______n5q", "vcnId": "ocid1.vcn.oc1.phx.aaaaaaaa______lhq", "kubernetesVersion": "v1.27.2", "clusterOptions": { "serviceLbConfig": { "backendNsgIds": [ "ocid1.networksecuritygroup.oc1.phx.aaaaaa....vdfw", "ocid1.networksecuritygroup.oc1.phx.aaaaaa....cwex" ] } }...LoadBalancerタイプのサービスの
oci.oraclecloud.com/security-rule-management-mode注釈の値として"NSG"を指定すると、個々のサービス・レベルでデフォルトをオーバーライドしないかぎり、クラスタ・レベルでデフォルトとして指定したNSGがそのサービスのバックエンドNSGとして使用されます。デフォルトをオーバーライドし、LoadBalancerタイプの特定のサービスに対して代替バックエンドNSGを指定するには、マニフェスト・ファイルのメタデータ・セクションに
oci.oraclecloud.com/oci-backend-network-security-group注釈を追加します。注釈を使用して、デフォルトのバックエンドNSGのかわりに、使用する既存のNSGのOCIDを指定します。
セキュリティ・ルール管理注釈の例
例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のロード・バランサとネットワーク・ロード・バランサは、ヘルス・チェック・ポリシーを適用してバックエンド・サーバーを継続的に監視します。ヘルス・チェックは、バックエンド・サーバーの可用性を確認するためのテストで、リクエストまたは接続の試行である場合があります。サーバーがヘルス・チェックに失敗すると、ロード・バランサまたはネットワーク・ロード・バランサは一時的にそのサーバーをローテーションから除外します。その後、サーバーがヘルス・チェックに合格すると、ロード・バランサまたはネットワーク・ロード・バランサはそれをローテーションに戻します。
ヘルス・チェック・ポリシーには多数のパラメータが含まれ、それぞれにデフォルト値があります。Kubernetes EngineがOCIロード・バランサまたはネットワーク・ロード・バランサをLoadBalancerタイプのKubernetesサービスにプロビジョニングする場合、マニフェスト・ファイルのメタデータ・セクションに注釈を含めることで、ヘルス・チェック・パラメータのデフォルト値をオーバーライドできます。これらの注釈は、後で追加、変更および削除できます。ヘルス・チェック・パラメータの値を指定した注釈を削除すると、ロード・バランサまたはネットワーク・ロード・バランサはかわりにパラメータのデフォルト値を使用します。
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: nginxKubernetesエンジンが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" |
また、ノードをバックエンドとして使用する場合は、表に示すヘルス・チェックの注釈が適用されます。具体的には、ノードをバックエンドとして使用する場合、oci-load-balancer.oraclecloud.com/health-checkまたはoci-network-load-balancer.oraclecloud.com/health-check注釈を設定しないでください。これらの2つの注釈は、ポッドをバックエンドとして使用する場合にのみ適用されるためです(「バックエンドとしてのポッドの指定」を参照)。
Oracle Cloud Infrastructureロード・バランサおよびネットワーク・ロード・バランサのヘルス・チェック・ポリシーの詳細は、次を参照してください:
バックエンド・セットに含めるワーカー・ノードの選択
Oracle Cloud Infrastructureロード・バランサまたはネットワーク・ロード・バランサへの受信トラフィックは、バックエンド・セット内のバックエンド・サーバー間で分散されます。デフォルトでは、Kubernetes EngineがOracle Cloud Infrastructureロード・バランサまたはネットワーク・ロード・バランサをタイプLoadBalancerのKubernetesサービスにプロビジョニングすると、クラスタ内のすべてのワーカー・ノードがバックエンド・セットに含まれます。
ただし、特定のロード・バランサまたはネットワーク・ロード・バランサのバックエンド・セットに含めるクラスタ内のワーカー・ノードのサブセットのみを選択するオプションがあります。異なるロード・バランサおよびネットワーク・ロード・バランサのバックエンド・セットにクラスタのワーカー・ノードのサブセットを含めることで、単一のKubernetesクラスタを複数の論理クラスタ(サービス)として表示できます。
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: nginxKubernetesエンジンが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
|
値 |
oci.oraclecloud.com/node-label-selector: lbset in (set1, set3)
|
oci-network-load-balancer.oraclecloud.com/node-label-selector: lbset in (set1, set3)
|
値 |
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)
|
値 |
oci.oraclecloud.com/node-label-selector: env!=test
|
oci-network-load-balancer.oraclecloud.com/node-label-selector: env!=test
|
値 |
バックエンド・セット・ポリシーの指定
Kubernetes EngineがLoadBalancerタイプのKubernetesサービスのロード・バランサまたはネットワーク・ロード・バランサをプロビジョニングする場合、バックエンド・セットのポリシーを定義して、受信トラフィックをバックエンド・サーバーに分散する方法を指定できます。
詳細は次を参照してください。
- ロード・バランサおよびバックエンド・セット・ポリシーについては、ロード・バランサ・ポリシーを参照してください。
- ネットワーク・ロード・バランサおよびバックエンド・セット・ポリシーについては、ネットワーク・ロード・バランサ・ポリシーを参照してください
KubernetesエンジンがLoadBalancerタイプのKubernetesサービスのロード・バランサをプロビジョニングするときにバックエンド・セットのポリシーを指定するには、マニフェスト・ファイルのメタデータ・セクションに次の注釈を追加します:
oci.oraclecloud.com/loadbalancer-policy: <value><value>は次のいずれかです:
-
"ROUND_ROBIN": 受信トラフィックをバックエンド・セット・リストの各サーバーに順番にルーティングします。 -
"LEAST_CONNECTIONS": 着信非スティッキー・リクエスト・トラフィックを、最も少ないアクティブ接続でバックエンド・サーバーにルーティングします。 -
"IP_HASH": 受信リクエストのソースIPアドレスをハッシュ・キーとして使用して、同じクライアントからの受信非スティッキー・リクエスト・トラフィックを、そのサーバーが使用可能であるかぎり同じバックエンド・サーバーにルーティングします。
例:
apiVersion: v1
kind: Service
metadata:
name: my-nginx-svc
labels:
app: nginx
annotations:
oci.oraclecloud.com/load-balancer-type: "lb"
oci.oraclecloud.com/loadbalancer-policy: "LEAST_CONNECTIONS"
spec:
type: LoadBalancer
ports:
- port: 80
selector:
app: nginxバックエンド・セットのポリシーを明示的に指定しない場合、「ROUND_ROBIN」がデフォルト値として使用されることに注意してください。
KubernetesエンジンがLoadBalancerタイプのKubernetesサービスのネットワーク・ロード・バランサをプロビジョニングするときにバックエンド・セットのポリシーを指定するには、マニフェスト・ファイルのメタデータ・セクションに次の注釈を追加します:
oci-network-load-balancer.oraclecloud.com/backend-policy: <value><value>は次のいずれかです:
-
"TWO_TUPLE": 受信トラフィックが2タプル(ソースIP、宛先IP)のハッシュに基づいてルーティングされます。 -
"THREE_TUPLE": 受信トラフィックが3タプル(ソースIP、宛先IP、プロトコル)のハッシュに基づいてルーティングされます。 -
"FIVE_TUPLE": 受信トラフィックが5タプル(ソースIPおよびポート、宛先IPおよびポート、プロトコル)のハッシュに基づいてルーティングされます。
例:
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/backend-policy: "THREE_TUPLE"
spec:
type: LoadBalancer
ports:
- port: 80
selector:
app: nginxバックエンド・セットのポリシーを明示的に指定しない場合、「FIVE_TUPLE」がデフォルト値として使用されることに注意してください。
ポッド準備ゲートの指定
マニフェスト・ファイルでexternalTrafficPolicyがLocalに設定されている場合、ポッド準備状況ゲートは指定しないでください。
また、Kubernetesエンジンは、ネームスペース内の各ポッドのポッド仕様にポッド・レディネス・ゲートを注入します。このポッドのラベルは、そのネームスペースのLoadBalancerタイプのサービスのセレクタと一致します。LoadBalancerサービスのセレクタと一致しないポッドは影響を受けません。
KubernetesエンジンがLoadBalancerタイプのKubernetesサービスに対してOracle Cloud Infrastructureロード・バランサまたはネットワーク・ロード・バランサをプロビジョニングする場合、ポッド・レディネス・ゲートを使用して、トラフィックがバックエンド・セットに正常に追加され、トラフィックを受信する準備ができているポッドにのみルーティングされるようにできます。
ポッド準備ゲートは、ポッドがトラフィックを受信する準備ができていることを示す追加の条件です。ポッド・レディネス・ゲートを使用すると、複雑なカスタム・レディネス・チェックを実装でき、ローリング・デプロイメント中にゼロ・ダウンタイムを実現できます。詳細は、Kubernetesドキュメントのポッド・レディネス詳細を参照してください。
ロード・バランサまたはネットワーク・ロード・バランサをプロビジョニングする場合、バックエンド・セットは、Readyという条件を持つデプロイメントのポッド・レプリカのIPアドレスで構成されます。デプロイメントを更新すると(たとえば、新しいイメージを使用するには)、既存のポッド・レプリカが新しいポッド・レプリカに置き換えられます。ただし、次の理由により、すべてのポッド・レプリカを置き換えるには時間がかかり、バックエンドが使用できなくなる可能性があります:
- 既存のポッド・レプリカは、バックエンド・セットが新しいポッド・レプリカのIPアドレスで更新される前に終了する場合があります。
- バックエンド・セットは、新しいポッド・レプリカがトラフィックを受信する準備が整う前に、新しいポッド・レプリカのIPアドレスで更新される場合があります。
ポッド・レディネス・ゲートの使用を指定すると、バックエンドがロード・バランサまたはネットワーク・ロード・バランサで常に使用可能になります。既存のポッドは、新しいポッドがバックエンド・セットに追加され、新しいポッドがトラフィックを受信する準備が整うまで終了しません。
Kubernetesエンジンが、LoadBalancerタイプのサービスのセレクタに一致するラベルを持つ特定のネームスペース内のポッドのポッド仕様にポッド準備ゲートを注入することを指定するには、次のように入力して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: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
トラフィック・ルーティングを調整するためのIPModeの指定
Kubernetes EngineがLoadBalancerタイプのKubernetesサービス用にOracle Cloud Infrastructureロード・バランサまたはネットワーク・ロード・バランサをプロビジョニングする場合、クラスタ内から発信するトラフィックをロード・バランサまたはネットワーク・ロード・バランサのIPアドレスにルーティングする方法を指定できます。
Kubernetesバージョン1.30以降を実行しているクラスタでは、LoadBalancerIPMode Kubernetes機能ゲートが有効になり、LoadBalancerタイプのサービスのipModeフィールドにはデフォルト値がVIPになります。ipModeの値がVIPの場合、クラスタ内のポッドからLoadBalancerタイプのサービスのIPアドレスに送信されるトラフィックは、LoadBalancerサービスをバイパスしてパフォーマンスを最適化するために、アプリケーション・ポッドに直接ルーティングされます。詳細は、Kubernetesドキュメントのロード・バランサ・ステータスのIPModeの指定を参照してください。
ただし、状況によっては、トラフィックをアプリケーション・ポッドに直接ルーティングすることが適切でない場合があります。たとえば、クラスタ内で発生したトラフィックがアプリケーション・ポッドに直接ルーティングされる場合、ロード・バランサ・レベルでSSL終了を実装することはできません。
クラスタ内からロード・バランサまたはネットワーク・ロード・バランサのIPアドレスに送信されるトラフィックをルーティングする方法を指定するには、マニフェスト・ファイルのメタデータ・セクションに次の注釈を追加します:
oci.oraclecloud.com/ingress-ip-mode: <value><value>は次のいずれかです:
-
"VIP": クラスタ内から発生し、LoadBalancerタイプのサービスのIPアドレスに送信されるすべてのトラフィックは、LoadBalancerサービスをバイパスしてパフォーマンスを最適化するために、アプリケーション・ポッドに直接ルーティングされます。 -
"proxy": クラスタ内から発信され、LoadBalancerタイプのサービスのIPアドレスに送信されるすべてのトラフィックは、LoadBalancerサービス用にプロビジョニングされたOracle Cloud Infrastructureロード・バランサまたはネットワーク・ロード・バランサにルーティングされます。ロード・バランサまたはネットワーク・ロード・バランサは、トラフィックをアプリケーション・ポッドに転送します。
例:
apiVersion: v1
kind: Service
metadata:
name: my-nginx-svc
labels:
app: nginx
annotations:
oci.oraclecloud.com/load-balancer-type: "lb"
oci.oraclecloud.com/ingress-ip-mode: "proxy"
spec:
type: LoadBalancer
ports:
- port: 80
selector:
app: nginxoci.oraclecloud.com/ingress-ip-mode注釈を指定しない場合、またはその後注釈を削除した場合、LoadBalancer型のサービスのipModeプロパティのデフォルト値は"VIP"になります。
また、oci-network-load-balancer.oraclecloud.com/is-preserve-source注釈をtrueに設定してプライベート・ネットワーク・ロード・バランサを使用する場合、ネットワーク・ロード・バランサには、ソース・ノードと宛先バックエンド・ノードが同じノードであるトラフィックを許可しない既知の制限があります。この制限により、次の条件がすべて満たされている場合に、ネットワーク・ロード・バランサを介して同じノード上のポッド間の通信が防止されます。
oci.oraclecloud.com/ingress-ip-mode注釈はproxyに設定されています。oci-network-load-balancer.oraclecloud.com/is-preserve-source注釈はtrueに設定されています。- ネットワーク・ロード・バランサはプライベートです。
ロード・バランサおよびネットワーク・ロード・バランサのIPアドレス・ファミリの指定
Kubernetesエンジンが、タイプLoadBalancerのKubernetesサービス用にOracle Cloud Infrastructureロード・バランサまたはネットワーク・ロード・バランサをプロビジョニングすると、ロード・バランサ・サブネットによって、ロード・バランサまたはネットワーク・ロード・バランサがトラフィックを受信するIPアドレスのIPアドレス・ファミリを介した制御が決定されます。
- サブネットがIPv4シングル・スタック・サブネットの場合、サブネットはIPv4アドレス指定のみ用に構成されます。ロード・バランサまたはネットワーク・ロード・バランサには、外部トラフィックを受信するIPv4アドレスのみが割り当てられます。ロード・バランサまたはネットワーク・ロード・バランサが外部トラフィックを受信するIPアドレスのIPアドレス・ファミリは変更できません。
- サブネットがIPv4/IPv6デュアル・スタック・サブネットの場合、サブネットはIPv4とIPv6の両方のアドレス指定用に構成されます。ロード・バランサまたはネットワーク・ロード・バランサには、外部トラフィックを受信するIPv4アドレスとIPv6アドレスのいずれかまたは両方を割り当てることができます。この状況では、サービス・マニフェストのKubernetes
spec.ipFamilyPolicyおよびspec.ipFamiliesフィールドを使用して、ロード・バランサまたはネットワーク・ロード・バランサがIPv4アドレスのみで外部トラフィックを受信するか、IPv6アドレスのみで外部トラフィックを受信するか、IPv4アドレスとIPv6アドレスの両方で受信するかを指定できます。
リスナーとバックエンド・セット間のトラフィックに使用されるIPアドレス・ファミリは、ロード・バランサとネットワーク・ロード・バランサで異なる方法で決定されます。
- ロード・バランサ:ロード・バランサ・リスナーとバックエンド・セット間のトラフィックでは、常にIPv4アドレスが使用されます。
- ネットワーク・ロード・バランサ:ネットワーク・ロード・バランサ・リスナーとバックエンド・セット間のトラフィックは、ネットワーク・ロード・バランサ・リスナーが外部トラフィックを受信するIPアドレスと同じIPアドレス・ファミリを使用します。
この表は、ロード・バランサ・サブネットのIPアドレス・ファミリ間の相互作用、spec.ipFamilyPolicyとspec.ipFamiliesの設定、IPアドレスがロード・バランサまたはネットワーク・ロード・バランサに割り当てられるIPアドレス・ファミリ、およびリスナーとバックエンド・セット間のIPプロトコルを示しています。有効な組合せのみが表示されます。
| サブネットIPアドレス・ファミリ |
ipFamilyPolicyは次のように設定されます。 |
ipFamiliesは次のように設定されます。 |
ネットワーク・ロード・バランサ・エンドポイントのIPアドレス・ファミリ | ロード・バランサのIPアドレス・ファミリ | ネットワーク・ロード・バランサ・リスナーからバックエンド・セット・トラフィック | ロード・バランサ・リスナーからバックエンド・セット・トラフィック |
|---|---|---|---|---|---|---|
| IPv4 |
SingleStack
|
IPv4
|
IPv4 | IPv4 | IPv4 | IPv4 |
| IPv4/IPv6 |
SingleStack
|
IPv4
|
IPv4 | IPv4 | IPv4 | IPv4 |
| IPv4/IPv6 |
SingleStack
|
IPv6
|
IPv6 | サポートされていない | IPv6 | サポートされていない |
| IPv4 |
PreferDualStack
|
IPv4
|
IPv4 | IPv4 | IPv4 | IPv4 |
| IPv4 |
PreferDualStack
|
IPv6
|
IPv4 | IPv4 | IPv4 | IPv4 |
| IPv4 |
PreferDualStack
|
IPv4,IPv6
|
IPv4 | IPv4 | IPv4 | IPv4 |
| IPv4 |
PreferDualStack
|
IPv6,IPv4
|
IPv4 | IPv4 | IPv4 | IPv4 |
| IPv4/IPv6 |
PreferDualStack
|
IPv4
|
IPv4(プライマリ)およびIPv6 | IPv4(プライマリ)およびIPv6 | IPv4(プライマリ)およびIPv6 | IPv4 |
| IPv4/IPv6 |
PreferDualStack
|
IPv6
|
IPv6(プライマリ)およびIPv4 | IPv6(プライマリ)およびIPv4 | IPv6(プライマリ)およびIPv4 | IPv4 |
| IPv4/IPv6 |
PreferDualStack
|
IPv4,IPv6
|
IPv4(プライマリ)およびIPv6 | IPv4(プライマリ)およびIPv6 | IPv4(プライマリ)およびIPv6 | IPv4 |
| IPv4/IPv6 |
PreferDualStack
|
IPv6,IPv4
|
IPv6(プライマリ)およびIPv4 | IPv6(プライマリ)およびIPv4 | IPv6(プライマリ)およびIPv4 | IPv4 |
| IPv4/IPv6 |
RequireDualStack
|
IPv4,IPv6
|
IPv4(プライマリ)およびIPv6 | IPv4(プライマリ)およびIPv6 | IPv4(プライマリ)およびIPv6 | IPv4 |
| IPv4/IPv6 |
RequireDualStack
|
IPv6,IPv4
|
IPv6(プライマリ)およびIPv4 | IPv6(プライマリ)およびIPv4 | IPv6(プライマリ)およびIPv4 | IPv4 |
service.beta.kubernetes.io/oci-load-balancer-subnet1注釈を使用して、クラスタの作成時にロード・バランサに指定されたサブネットの代替サブネットを指定する場合は、代替サブネットのアドレス・ファミリがサービス・マニフェストのspec.ipFamilyPolicyおよびspec.ipFamiliesフィールドと互換性があることを確認してください。
KubernetesでのIPv4およびIPv6のサポートの詳細は、KubernetesドキュメントのIPv4/IPv6デュアルスタックを参照してください。
例1:
この例では:
- クラスタの作成時にロード・バランサに指定されたサブネットを使用します。
- LoadBalancerタイプのサービスをデプロイするのは、IPv4アドレスとIPv6アドレスの両方を割り当てることができる場合のみで、
ipFamilyPolicy: RequireDualStackを設定します。 - ロード・バランサのプライマリIPアドレスをIPv6アドレス(およびセカンダリ・アドレスをIPv4アドレス)にするため、
spec.ipFamilies: IPv6,IPv4を設定します。
apiVersion: v1
kind: Service
metadata:
name: nginx-lb
labels:
app: nginx
annotations:
oci.oraclecloud.com/load-balancer-type: "lb"
spec:
type: LoadBalancer
ipFamilyPolicy: RequireDualStack
ipFamilies:
- IPv6
- IPv4
ports:
- name: http
port: 80
targetPort: 80
selector:
app: nginxこの例では、クラスタのロード・バランサ・サブネットはデュアル・スタックIPv4/IPv6サブネットであるため、デプロイメントは成功します。ロード・バランサには、プライマリ・アドレスとしてIPv6アドレスが割り当てられ、セカンダリ・アドレスとしてIPv4アドレスが割り当てられます。
例2:
この例では:
- LoadBalancerタイプのサービスを、クラスタの作成時にロード・バランサに指定されたものに代替サブネットでホストするため、
service.beta.kubernetes.io/oci-load-balancer-subnet1注釈を使用して代替サブネットのOCIDを指定します。 - サービスがデュアル・スタックIPv4/IPv6サブネットでホストされている場合、IPv4アドレスとIPv6アドレスの両方をLoadBalancerタイプのサービスに割り当てます。それ以外の場合、サービスが単一のスタックIPv4サブネットでホストされている場合は、そのIPアドレス・ファミリからサービスに割り当てられたIPアドレスが必要になります。そのため、
ipFamilyPolicy: PreferDualStackを設定します。 - ロード・バランサのプライマリIPアドレスをIPv4アドレス(およびそのセカンダリ・アドレスがサブネットでサポートされている場合はIPv6アドレス)にするため、
spec.ipFamilies: IPv4,IPv6を設定します。
apiVersion: v1
kind: Service
metadata:
name: nginx-lb
labels:
app: nginx
annotations:
oci.oraclecloud.com/load-balancer-type: "lb"
service.beta.kubernetes.io/oci-load-balancer-subnet1: "ocid1.subnet.oc1..aaaaaa....vdfw"
spec:
type: LoadBalancer
ipFamilyPolicy: PreferDualStack
ipFamilies:
- IPv4
- IPv6
ports:
- name: http
port: 80
targetPort: 80
selector:
app: nginxこの例では、代替サブネットはデュアル・スタックIPv4/IPv6サブネットであるため、デプロイメントは成功します。ロード・バランサには、プライマリ・アドレスとしてIPv4アドレスが割り当てられ、セカンダリ・アドレスとしてIPv6アドレスが割り当てられます。
ネットワーク・ロード・バランサへの特定のIPv4およびIPv6アドレスの割当て
KubernetesエンジンがLoadBalancerタイプのKubernetesサービスに対してOracle Cloud Infrastructureネットワーク・ロード・バランサをプロビジョニングすると、ネットワーク・ロード・バランサ・サービスは1つ以上のIPアドレスをネットワーク・ロード・バランサに割り当てます。
ネットワーク・ロード・バランサ・サービスは、プライベートIPv4アドレスを割り当て、外部ネットワーク・ロード・バランサの場合は追加のパブリックIPv4アドレスも割り当てます。ネットワーク・ロード・バランサのサブネットに互換性がある場合は、ネットワーク・ロード・バランサ・サービスでIPv6アドレスを割り当てることもできます(「ロード・バランサおよびネットワーク・ロード・バランサに対するIPアドレス・ファミリの指定」を参照)。
Kubernetesバージョン1.29以降を実行しているクラスタでは、ネットワーク・ロード・バランサ・サービスで割り当てるIPアドレスを選択するのではなく、ネットワーク・ロード・バランサに割り当てるIPアドレスを指定できます。割り当てることができるIPアドレスは、次のように、ネットワーク・ロード・バランサ・サブネットのIPアドレス・ファミリによって異なります:
- IPv4:ネットワーク・ロード・バランサのサブネットがIPv4単一スタック・サブネットまたはIPv4/IPv6デュアル・スタック・サブネットの場合、プライベートIPv4アドレスをネットワーク・ロード・バランサに割り当てることができます。
- IPv4およびIPv6:ネットワーク・ロード・バランサのサブネットがIPv4/IPv6デュアル・スタック・サブネットの場合、プライベートのIPv4アドレスとIPv6アドレスのいずれかまたは両方をネットワーク・ロード・バランサに割り当てることができます。
ネットワーク・ロード・バランサに割り当てるプライベートIPv4アドレスを指定するには、マニフェスト・ファイルのメタデータ・セクションに次の注釈を追加します。
oci-network-load-balancer.oraclecloud.com/assigned-private-ipv4: "<ipv4-address>"
ここで、<ipv4-address>は、ネットワーク・ロード・バランサのサブネットに指定されたIPv4 CIDRブロックからの有効なIPv4アドレスです。例:
oci-network-load-balancer.oraclecloud.com/assigned-private-ipv4: "10.0.0.1"
ネットワーク・ロード・バランサに割り当てるIPv6アドレスを指定するには、マニフェスト・ファイルのメタデータ・セクションに次の注釈を追加します。
oci-network-load-balancer.oraclecloud.com/assigned-ipv6: "<ipv6-address>"
ここで、<ipv6-address>は、ネットワーク・ロード・バランサのサブネットに指定されたIPv6 CIDRブロックからの有効なIPv6 ULAまたはGUAアドレスです。例:
-
oci-network-load-balancer.oraclecloud.com/assigned-ipv6: "fd8a:4b3c:7d91:abcd::1" -
oci-network-load-balancer.oraclecloud.com/assigned-ipv6: "2607:9b80:9a0a:9a7e:abcd:ef01:2345:6789"
例:
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/assigned-private-ipv4: "10.0.0.1"
oci-network-load-balancer.oraclecloud.com/assigned-ipv6: "fd8a:4b3c:7d91:abcd::1"
spec:
type: LoadBalancer
ipFamilyPolicy: RequireDualStack
ipFamilies:
- IPv6
- IPv4
ports:
- port: 80
selector:
app: nginx有効なIPアドレスを指定する責任があります。IPアドレスを有効にするには、次の条件を満たす必要があります。
- IPアドレスは、使用する注釈の正しい形式(IPv4またはIPv6)である必要があります。
- IPアドレスは、ネットワーク・ロード・バランサのサブネットに指定された適切なCIDRブロックからのものである必要があります。
- IPアドレスは、別のリソースによってまだ使用されていない必要があります。
次の点に注意してください:
- IPアドレスが正しい形式でない場合、または適切なCIDRブロックからでない場合、ネットワーク・ロード・バランサの作成リクエストは受け入れられません。
- IPアドレスが正しい形式であり、適切なCIDRブロックにあるが、IPアドレスが別のリソースによってすでに使用されている場合、ネットワーク・ロード・バランサの作成リクエストが受け入れられます。ただし、関連付けられた作業リクエストは失敗し、コンパートメントには「失敗」状態のネットワーク・ロード・バランサが含まれます。
- IPアドレスが有効な場合、ネットワーク・ロード・バランサは、指定されたIPアドレスが割り当てられて作成されます。
ネットワーク・ロード・バランサのプライベートIPアドレスの隠蔽
Kubernetesエンジンが、タイプがLoadBalancerのKubernetesサービスに対してパブリックOracle Cloud Infrastructureネットワーク・ロード・バランサをプロビジョニングすると、ネットワーク・ロード・バランサ・サービスは、パブリックIPアドレスとプライベートIPアドレスの両方をネットワーク・ロード・バランサに割り当てます。プライベートIPアドレスは、ヘルス・チェックおよびポート・アドレス変換(PAT)に使用されますが、VCN外部からの外部トラフィック(パブリック・インターネットからのものを含む)を受信することはできません。
ネットワーク・ロード・バランサ・サービスがネットワーク・ロード・バランサに割り当てたパブリックIPアドレスおよびプライベートIPアドレスを表示するには、kubectl get serviceコマンド(または同様)を入力します。例:
kubectl get service my-nginx-svc -o json | jq .status
{
"loadBalancer": {
"ingress": [
{
"ip": "203.0.113.2"
},
{
"ip": "10.30.3.24"
}
]
}
}
状況によっては、ネットワーク・ロード・バランサのパブリックIPアドレスのみを公開し、プライベートIPアドレスを非表示にする場合があります。例:
- ExternalDNSアドオンを使用するときに、LoadBalancerタイプのKubernetesサービスのマニフェストに
external-dns.alpha.kubernetes.io/hostname注釈を含めることで、ネットワーク・ロード・バランサのわかりやすいDNS名を指定できます。ExternalDNSは、クラスタ用に構成した外部DNSプロバイダにネットワーク・ロード・バランサのDNSレコードを作成します。DNSレコードは、DNS名をパブリックIPアドレスとプライベートIPアドレスの両方にマップします。その結果、外部トラフィックがDNS名を使用する場合、プライベートIPアドレスが外部トラフィックを受信できない場合でも、トラフィックがネットワーク・ロード・バランサのプライベートIPアドレスにルーティングされる可能性があります。 kubectl get serviceコマンド(または類似)を使用してネットワーク・ロード・バランサのIPアドレスを取得する自動化を設定できます。外部トラフィックのルーティングが含まれている場合は、ネットワーク・ロード・バランサのパブリックIPアドレスのみが必要です。ただし、デフォルトでは、kubectl get serviceコマンドはネットワーク・ロード・バランサのパブリックIPアドレスとプライベートIPアドレスの両方を返します。
kubectl get serviceコマンド(または類似コマンド)がネットワーク・ロード・バランサのパブリックIPアドレスのみを返すように指定するには、マニフェスト・ファイルのメタデータ・セクションに次の注釈を追加します:
oci-network-load-balancer.oraclecloud.com/external-ip-only: "true""false"は、oci-network-load-balancer.oraclecloud.com/external-ip-only注釈のデフォルト値です。サービス定義にアノテーションを明示的に含めない場合、kubectl get serviceコマンドはネットワーク・ロード・バランサのパブリックIPアドレスとプライベートIPアドレスの両方を返します。
例:
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/external-ip-only: "true"
spec:
type: LoadBalancer
ports:
- port: 80
selector:
app: nginxマニフェストにoci-network-load-balancer.oraclecloud.com/external-ip-only: "true"注釈を含めると、kubectl get serviceコマンド(または類似コマンド)を入力したときに、パブリックIPアドレスのみが返されます。例:
kubectl get service my-nginx-svc -o json | jq .status
{
"loadBalancer": {
"ingress": [
{
"ip": "203.0.113.2"
}
]
}
}
ノードがトラフィックを処理できないようにする
Oracle Cloud Infrastructureロード・バランサまたはネットワーク・ロード・バランサのバックエンド・セット内のバックエンド・サーバーのリストから特定のワーカー・ノードを除外できます。詳細は、node.kubernetes.io/exclude-from-external-load-balancersを参照してください。
ロード・バランサおよびネットワーク・ロード・バランサのタグ付け
Kubernetes EngineがLoadBalancerタイプのKubernetesサービスにプロビジョニングするロード・バランサまたはネットワーク・ロード・バランサにタグを追加できます。タグ付けにより、コンパートメント間で異なるリソースをグループ化でき、独自のメタデータを使用してリソースに注釈を付けることもできます。ロード・バランサへのタグの適用を参照してください。
プロキシ・プロトコルの有効化
Kubernetes EngineがOracle Cloud Infrastructureロード・バランサまたはネットワーク・ロード・バランサをLoadBalancerタイプのKubernetesサービスにプロビジョニングする場合、TCPベースのリスナーでプロキシ・プロトコル機能を有効にするかどうかを指定できます。プロキシ・プロトコルを有効にすると、クライアントのIPアドレスなどのトランスポート接続情報を複数のプロキシ・レイヤーにわたってバックエンド・サーバーに安全に転送できます。次のプロキシ・プロトコル・バージョンを使用できます。
- バージョン1は、テキストベースのヘッダーを使用してプロキシ間で情報を渡し、小規模の実装に最適です。
- バージョン2。生成および解析の効率を高めるためにテキストベースおよびバイナリ・ヘッダーを使用し、大規模な実装に最適です。
Kubernetes Engineによってプロビジョニングされたロード・バランサは、プロキシ・プロトコル・バージョン1およびバージョン2をサポートします。Kubernetes Engineによってプロビジョニングされるネットワーク・ロード・バランサは、プロキシ・プロトコル・バージョン2をサポートします。
詳細は次を参照してください。
- ロード・バランサおよびプロキシ・プロトコル機能については、ロード・バランサのプロキシ・プロトコルを参照してください。
- ネットワーク・ロード・バランサおよびプロキシ・プロトコル機能については、ネットワーク・ロード・バランサのプロキシ・プロトコルを参照してください。
Kubernetes Engineによってプロビジョニングされたロード・バランサのプロキシ・プロトコルを有効にするには、マニフェスト・ファイルのメタデータ・セクションに次の注釈を追加します:
service.beta.kubernetes.io/oci-load-balancer-connection-proxy-protocol-version: "<value>""<value>"は次のいずれかです:
-
"1": ロード・バランサのすべてのリスナーでプロキシ・プロトコル・バージョン1を有効にすることを指定します。 -
"2": ロード・バランサのすべてのリスナーでプロキシ・プロトコル・バージョン2を有効にすることを指定します。
ロード・バランサのプロキシ・プロトコル機能を有効にしたら、次の点に注意してください:
- ロード・バランサ・リスナーでプロキシ・プロトコル機能を無効にすることはできません。
- 注釈を更新することで、プロキシ・プロトコル・バージョン1とプロキシ・プロトコル・バージョン2を切り替えることができます。
- その後、マニフェストから注釈を削除するか、(
"<value>"を""に設定して)注釈を設定解除した場合、"<value>"に最後に正常に適用された設定は、すべてのリスナーに保持されます。
Kubernetes Engineによってプロビジョニングされたネットワーク・ロード・バランサに対してプロキシ・プロトコルを有効にするには、マニフェスト・ファイルのメタデータ・セクションに次の注釈を追加します:
oci-network-load-balancer.oraclecloud.com/is-ppv2-enabled: "<value>""<value>"は次のいずれかです:
-
"true": ネットワーク・ロード・バランサのすべてのリスナーでプロキシ・プロトコル・バージョン2を有効にすることを指定します。 -
"false": ネットワーク・ロード・バランサのすべてのリスナーでプロキシ・プロトコル・バージョン2を無効にすることを指定します。
ネットワーク・ロード・バランサのプロキシ・プロトコル機能を有効にしたら、次の点に注意してください:
- ネットワーク・ロード・バランサ・リスナーでプロキシ・プロトコル機能を無効にするには、
"<value>"を"false"に設定します。 - その後、マニフェストから注釈を削除するか、(
"<value>"を""に設定して)注釈を設定解除するか、注釈に無効な値("enable"など)を指定すると、"<value>"に最後に正常に適用された設定はすべてのリスナーに保持されます。
バックエンドとしてのポッドの指定
Oracle Cloud Infrastructureロード・バランサまたはネットワーク・ロード・バランサへの受信トラフィックは、バックエンド・セットのバックエンド間で分散されます。デフォルトでは、KubernetesエンジンがLoadBalancerタイプのKubernetesサービスにOracle Cloud Infrastructureロード・バランサまたはネットワーク・ロード・バランサをプロビジョニングすると、クラスタ内のワーカー・ノードがバックエンド・セットのバックエンドになります。このデフォルト構成では、ロード・バランサまたはネットワーク・ロード・バランサは外部トラフィックをワーカー・ノードにルーティングし、その後、クラスタ内のアプリケーションを実行している適切なポッドにトラフィックを転送します。
ただし、バックエンド・セットのバックエンドとしてポッドを直接使用する代替構成を指定するオプションもあります。この「バックエンドとしてのポッド」構成では、ロード・バランサまたはネットワーク・ロード・バランサは、ノードを完全にバイパスして、トラフィックをポッドIPに直接転送します。Kubernetesエンジンは、構成されたヘルス・チェックのバックエンドとしてポッドIPを使用して、サービス・ポートごとに1つのリスナーとバックエンド・セットのペアを作成します。トラフィックは次のように処理されます。
- クライアントは、ロード・バランサにリクエストを送信します。
- ロード・バランサはリクエストとバックエンド・セットを照合し、正常なポッドIPを選択します。
- リクエストはポッドのIPに直接ルーティングされます。
- ポッドはリクエストを処理して応答します。
- レスポンスは、ロード・バランサを介してクライアントに返されます。
バックエンドとして(ノードではなく)ポッドを使用すると、次の利点があります:
- ネットワーク効率の向上:中間ノード・ルーティングを排除することで、ネットワークの輻輳とオーバーヘッドが軽減されます。
- リソース使用率の最適化:正常なポッドのみがバックエンドとして登録され、バックエンド管理が簡素化され、スケーラビリティが改善される可能性があります。
- ヘルス・チェックの簡略化:ロード・バランサは各アプリケーション・ポッドを直接プローブするため、より正確なヘルス監視を実現します。
- ノードへの負荷の低減:ノードからトラフィックをオフロードすると、処理負荷が軽減され、アプリケーション・パフォーマンスがより予測可能になります。
(ノードではなく)ポッドをバックエンドとして使用する場合は、次の点に注意してください:
- OCIロード・バランサとネットワーク・ロード・バランサは、バックエンド・セットごとまたはロード・バランサごとに最大512個のバックエンドをサポートします。LoadBalancerタイプのサービスがこれよりも多くのポッドを選択した場合、最初の512のみがバックエンドとして登録されます。
- ポッドをバックエンドとして使用することは、ポッド・ネットワーキングにOCI VCNネイティブ・ポッド・ネットワーキングCNIプラグインを使用するクラスタでのみサポートされます。
- LoadBalanceタイプのサービスのバックエンドとしてのポッドの使用は、サービスのノード・ポートが無効になっている場合にのみサポートされます。
- 現在バックエンドとしてノードを使用しているLoadBalancerタイプの既存のサービスを移行して、かわりにポッドをバックエンドとして使用できます(LoadBalancerタイプのサービスのバックエンドとしてのノードの使用からバックエンドとしてのポッドの使用およびVice Versaを参照)。
ポッドをバックエンドとして使用するための前提条件
ポッドをバックエンドとして使用するには、クラスタが次の前提条件を満たしている必要があります:
- クラスタでは、Kubernetesバージョン1.30以降が実行されている必要があります。
- クラスタでは、ポッド・ネットワークにOCI VCNネイティブ・ポッド・ネットワークCNIプラグインを使用する必要があります。
バックエンドとしてのポッドの使用
ポッドをKubernetes Engineによってプロビジョニングされたロード・バランサまたはネットワーク・ロード・バランサのバックエンドとして使用するには:
- マニフェスト・ファイルのspecセクションに
allocateLoadBalancerNodePortsフィールドを追加し、フィールドをfalseに設定します。 - LoadBalancerタイプのサービスを定義するマニフェスト・ファイルに、
oci-load-balancer.oraclecloud.com/health-check注釈(ロード・バランサの場合)またはoci-network-load-balancer.oraclecloud.com/health-check注釈(ネットワーク・ロード・バランサの場合)を追加します。JSONオブジェクトを指定して、有効なヘルス・チェック構成を注釈の値として定義します。詳細は、バックエンドとしてのポッドのヘルス・チェック構成を参照してください。 - oci-cloud-controller-managerでバックエンド・セットのセキュリティ・リスト内のセキュリティ・ルールを管理するように指定しないでください。詳細は、バックエンドとしてのポッドの有効なセキュリティ・ルール管理オプションを参照してください。
例:
apiVersion: v1
kind: Service
metadata:
name: my-nginx-svc
labels:
app: nginx
annotations:
oci.oraclecloud.com/load-balancer-type: "lb"
oci-load-balancer.oraclecloud.com/health-check: '{"protocol": "HTTP", "port": 8080, "urlPath": "/healthz", "returnCode": 200, "retries": 2, "timeoutInMillis": 5000}'
oci.oraclecloud.com/security-rule-management-mode: "NSG"
oci.oraclecloud.com/oci-backend-network-security-group: "<nsg-ocid>"
spec:
type: LoadBalancer
selector:
app: nginx
ports:
- name: http
port: 80
targetPort: 8080
allocateLoadBalancerNodePorts: false例:
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: '{"protocol": "TCP", "port": 8081, "retries": 3, "timeoutInMillis": 4000}'
oci.oraclecloud.com/security-rule-management-mode: "NSG"
oci.oraclecloud.com/oci-backend-network-security-group: "<nsg-ocid>"
spec:
type: LoadBalancer
selector:
app: nginx
ports:
- name: tcp
port: 81
targetPort: 8081
allocateLoadBalancerNodePorts: falseバックエンドとしてのポッドのヘルス・チェック構成
ロード・バランサまたはネットワーク・ロード・バランサのバックエンドとしてポッドを使用する場合、次の注釈を使用して、バックエンド・セット内の各ポッドのヘルスをチェックするヘルス・チェックを定義します:
oci-load-balancer.oraclecloud.com/health-check注釈(ロード・バランサ用)oci-network-load-balancer.oraclecloud.com/health-check注釈(ネットワーク・ロード・バランサ用)
ヘルス・チェックに合格したポッドのみが正常とみなされ、ロード・バランサからのトラフィックを受信できます。
ヘルス・チェックを定義するには、oci-load-balancer.oraclecloud.com/health-checkまたはoci-network-load-balancer.oraclecloud.com/health-check注釈の値としてJSONオブジェクトを指定します。JSONオブジェクトには次のフィールドを含めることができます。
-
protocol: (必須)ヘルス・チェックに使用するプロトコル(HTTP、TCP、UDP、HTTPSなど)。 -
port: ヘルス・チェックに使用するポート番号。 -
urlPath: ヘルス・チェックに使用するURLパス(HTTPプロトコルにのみ適用可能)。 -
returnCode: ヘルス・チェックの予期されるリターン・コード。 -
retries: ヘルス・チェックの再試行回数。 -
timeoutInMillis: ヘルス・チェックのタイムアウト(ミリ秒)。 -
responseBodyRegex: レスポンス本文と照合する正規表現(HTTPプロトコルにのみ適用可能)。
アノテーションおよび関連するJSONオブジェクトを使用すると、ロード・バランサおよびネットワーク・ロード・バランサでサポートされているすべてのヘルス・チェック構成を定義できます。JSONオブジェクトで許可されるすべてのフィールドの詳細は、次のとおりです。
- ロード・バランサについては、ロード・バランサのヘルス・チェック・ポリシーの編集を参照してください。
- ネットワーク・ロード・バランサについては、ネットワーク・ロード・バランサのヘルス・チェック・ポリシーの編集を参照してください。
すべてのバックエンド・セットに対して単一のヘルス・チェック構成を定義できます。例:
oci-load-balancer.oraclecloud.com/health-check: '{"protocol": "HTTP", "port": 8080, "urlPath": "/", "returnCode": 200, "retries": 2, "timeoutInMillis": 5000}'
oci-network-load-balancer.oraclecloud.com/health-check: '{"protocol": "HTTP", "port": 8080, "urlPath": "/", "returnCode": 200, "retries": 2, "timeoutInMillis": 5000}'
oci-load-balancer.oraclecloud.com/health-checkアノテーションまたはoci-network-load-balancer.oraclecloud.com/health-checkアノテーションを使用して定義したヘルス・チェック構成は、ポッドをバックエンドとして使用する場合にのみ適用されます。oci-load-balancer.oraclecloud.com/health-checkおよびoci-network-load-balancer.oraclecloud.com/health-check注釈は、ノードをバックエンドとして使用する場合に適用される注釈を置き換えます。具体的には、ポッドをバックエンドとして使用する場合、次の注釈は有効になりません。
-
ロード・バランサの場合、ポッドをバックエンドとして使用する場合、次の注釈は有効になりません。
-
service.beta.kubernetes.io/oci-load-balancer-health-check-retries -
service.beta.kubernetes.io/oci-load-balancer-health-check-timeout -
service.beta.kubernetes.io/oci-load-balancer-health-check-interval
-
-
ネットワーク・ロード・バランサの場合、ポッドをバックエンドとして使用する場合、次の注釈は有効にならないようにします。
-
oci-network-load-balancer.oraclecloud.com/health-check-retries -
oci-network-load-balancer.oraclecloud.com/health-check-timeout -
oci-network-load-balancer.oraclecloud.com/health-check-interval
-
すでに説明したように、これらの注釈は、ポッドをバックエンドとして使用する場合には有効になりませんが、oci-load-balancer.oraclecloud.com/health-checkまたはoci-network-load-balancer.oraclecloud.com/health-check注釈および関連するJSONオブジェクトを使用して、対応するヘルス・チェック構成設定の値を指定できます。
バックエンドとしてのポッドの有効なセキュリティ・ルール管理オプション
ロード・バランサまたはネットワーク・ロード・バランサのバックエンドとして(ノードではなく)ポッドを使用する場合、次のセキュリティ・ルール管理オプションのいずれかを指定できます。
- oci-cloud-controller-managerでセキュリティ・リストを使用して、フロントエンド・ロード・バランサまたはネットワーク・ロード・バランサへのイングレスのセキュリティ・ルールを管理するように指定できます。バックエンド・ポッドへのインバウンド・トラフィックを許可するようにセキュリティ・ルールを設定するのはユーザーの責任です。
この場合、次の注釈を使用できます。
-
oci.oraclecloud.com/security-rule-management-mode: "SL-Frontend" -
service.beta.kubernetes.io/oci-load-balancer-security-list-management-mode: "Frontend" -
oci-network-load-balancer.oraclecloud.com/security-list-management-mode: "Frontend"
oci-cloud-controller-managerでセキュリティ・リストを使用してバックエンド・ポッドのセキュリティ・ルールを管理することを指定できないことに注意してください。
-
- oci-cloud-controller-managerでネットワーク・セキュリティ・グループ(NSG)を使用して次のセキュリティ・ルールを管理するように指定できます。
- この目的のために作成されたNSGでのフロントエンド・ロード・バランサまたはネットワーク・ロード・バランサへのイングレス(フロントエンドNSGと呼ばれます)
- OCID (バックエンドNSGと呼ばれる)を指定する既存のNSGでのバックエンド・ポッドへのイングレス
この場合、次の注釈および値を使用できます。
-
oci.oraclecloud.com/security-rule-management-mode: NSG -
oci.oraclecloud.com/oci-backend-network-security-group:: クラスタと同じVCNにある既存のNSGのOCID、およびワーカー・ノードをホストするコンピュート・インスタンスがすでに追加されているNSGを指定します。
- oci-cloud-controller-managerがシークレット・ルールを管理しないように指定できます。ロード・バランサとネットワーク・ロード・バランサ、およびバックエンド・ポッドへのインバウンド・トラフィックを許可するには、セキュリティ・ルールを設定する必要があります。
この場合、次の注釈および値を使用できます。
-
oci.oraclecloud.com/security-rule-management-mode: "None" -
service.beta.kubernetes.io/oci-load-balancer-security-list-management-mode: "None" -
oci-network-load-balancer.oraclecloud.com/security-list-management-mode: "None"
-
oci-cloud-controller-managerで、バックエンド・ポッドのセキュリティ・ルールを管理するためにセキュリティ・リストを使用することを指定しないでください。つまり、次の注釈および値を指定しないでください。
-
oci.oraclecloud.com/security-rule-management-mode: "SL-All" -
service.beta.kubernetes.io/oci-load-balancer-security-list-management-mode: "All" -
oci-network-load-balancer.oraclecloud.com/security-list-management-mode: "All"
セキュリティ・ルール管理(NSGを使用してセキュリティ・ルールを管理するために必要なIAMポリシーを含む)の詳細は、ロード・バランサおよびネットワーク・ロード・バランサのセキュリティ・ルール管理オプションの指定を参照してください。
ポッドをバックエンドとして使用する場合のポッド・レディネス・ゲートおよびレディネス・プローブのサポート
マニフェスト・ファイルでexternalTrafficPolicyがLocalに設定されている場合、ポッド準備状況ゲートは指定しないでください。
また、Kubernetesエンジンは、ネームスペース内の各ポッドのポッド仕様にポッド・レディネス・ゲートを注入します。このポッドのラベルは、そのネームスペースのLoadBalancerタイプのサービスのセレクタと一致します。LoadBalancerサービスのセレクタと一致しないポッドは影響を受けません。
ポッドをKubernetes Engineによってプロビジョニングされたロード・バランサまたはネットワーク・ロード・バランサのバックエンドとして使用する場合、ポッド・レディネス・ゲートを使用して、ポッドがトラフィックを受信する準備ができていることを示すことができます。ポッド・レディネス・ゲートを使用すると、複雑なカスタム・レディネス・チェックを実装でき、ローリング・デプロイメント中のダウンタイムをゼロにするのに役立ちます。
Kubernetesエンジンが、LoadBalancerタイプのサービスのセレクタに一致するラベルを持つ特定のネームスペース内のポッドのポッド仕様にポッド準備ゲートを注入することを指定するには、次のように入力してloadbalancer.oci.oraclecloud.com/pod-readiness-gate-inject=enabledラベルをネームスペースに追加します:
kubectl label ns <namespace> loadbalancer.oci.oraclecloud.com/pod-readiness-gate-inject=enabled
詳細は、「ポッド準備ゲートの指定」を参照してください。Kubernetesドキュメントのポッド・レディネスの詳細も参照してください。
準備状況プローブは、ポッドをKubernetes Engineによってプロビジョニングされたロード・バランサまたはネットワーク・ロード・バランサのバックエンドとして使用する場合にもサポートされます。準備状況プローブの詳細は、Kubernetesドキュメントの「稼働状況、準備状況および起動プローブの構成」を参照してください。
タイプLoadBalancerのサービスのバックエンドとしてのノードの使用からバックエンドとしてのポッドの使用、およびその逆の移行
ノードをバックエンドとして使用することからポッドをバックエンドとして使用することまで、LoadBalancerタイプのサービスを移行すると、トラフィックの中断が予想されます。
「バックエンドとしてのポッドの使用」の説明に従ってサービス・マニフェストを更新し、次のように要約すると、現在ノードをバックエンドとして使用しているLoadBalancerタイプの既存のサービスをバックエンドとして移行できます。
allocateLoadBalancerNodePortsフィールドをfalseに設定します。oci-load-balancer.oraclecloud.com/health-check注釈(ロード・バランサの場合)またはoci-network-load-balancer.oraclecloud.com/health-checkを有効なヘルス・チェック構成に設定しますoci.oraclecloud.com/security-rule-management-mode注釈を「なし」、「SL-Frontend」または「NSG」に設定します。
また、ノードをバックエンドとして使用することからポッドをバックエンドとして使用することまで、LoadBalancerタイプの既存のサービスを移行するには、既存のサービスにNodePortsが割り当てられていないことを確認します。NodePortsが既存のサービスに割り当てられている場合は、それらを削除する必要があります。
サービス・マニフェストを次のように更新することで、現在ポッドをバックエンドとして使用しているLoadBalancerタイプの既存のサービスをバックエンドとして移行し、ノードの使用を開始できます:
allocateLoadBalancerNodePortsフィールドをtrueに設定します。
ロード・バランサおよびネットワーク・ロード・バランサのコンパートメントの指定
Kubernetes EngineがタイプLoadBalancerのKubernetesサービスに対してOracle Cloud Infrastructureロード・バランサまたはネットワーク・ロード・バランサをプロビジョニングする場合、ロード・バランサまたはネットワーク・ロード・バランサが作成されるコンパートメントを指定できます。デフォルトでは、Kubernetes Engineは、クラスタと同じコンパートメントにロード・バランサまたはネットワーク・ロード・バランサを作成します。
ロード・バランサまたはネットワーク・ロード・バランサを作成する代替コンパートメントを指定するには、マニフェスト・ファイルのメタデータ・セクションに次の注釈を追加します:
oci.oraclecloud.com/compartment-id: <compartment-ocid>
<compartment-ocid>は、ロード・バランサまたはネットワーク・ロード・バランサを作成するコンパートメント のOCIDです。
たとえば、ロード・バランサを作成する代替コンパートメントを指定するには:
apiVersion: v1
kind: Service
metadata:
name: my-nginx-svc
labels:
app: nginx
annotations:
oci.oraclecloud.com/load-balancer-type: "lb"
oci.oraclecloud.com/compartment-id: ocid1.compartment.oc1..aaaaaaaay______t6q
spec:
type: LoadBalancer
ports:
- port: 80
selector:
app: nginx
このマニフェストでは、OCID ocid1.compartment.oc1..aaaaaaaay______t6qを使用してロード・バランサをコンパートメントに作成することを指定します。
Kubernetes Engineは、作成後のコンパートメント間でのロード・バランサまたはネットワーク・ロード・バランサの移動をサポートしていないことに注意してください。次の推奨事項を検討してください:
- ベスト・プラクティスとして、LoadBalancerタイプのサービスをデプロイする前に、コンパートメント割当てを慎重に計画することをお薦めします。
- Kubernetes Engineによって作成されたロード・バランサまたはネットワーク・ロード・バランサが現在存在するコンパートメントを変更する場合は、LoadBalancerタイプのサービスを削除することをお薦めします。次に、サービス・マニフェストの
oci.oraclecloud.com/compartment-idアノテーションを更新して必要なコンパートメントを指定してから、サービスを再デプロイできます。 - ロード・バランサ・サービスおよびネットワーク・ロード・バランサ・サービスでは可能ですが、Kubernetes Engineが作成したロード・バランサまたはネットワーク・ロード・バランサをコンパートメント間で移動しないことを強くお薦めします。ロード・バランサまたはネットワーク・ロード・バランサをコンパートメント間で移動すると、元のコンパートメントに「孤立」ロード・バランサまたはネットワーク・ロード・バランサが作成される可能性があります。孤立したロード・バランサまたはネットワーク・ロード・バランサは、Kubernetes Engineによって管理されず、ライフサイクルおよびガバナンスの問題を引き起こす可能性があります。
ロード・バランサおよびネットワーク・ロード・バランサ・コンパートメントを指定するために必要なIAMポリシー
ロード・バランサまたはネットワーク・ロード・バランサを作成する代替コンパートメントを指定するには、次のようなポリシー・ステートメントを指定して、クラスタに他のリソースを検査、管理および使用する権限を付与する必要があります:
Allow any-user to manage load-balancers in compartment <compartment-ocid> where all { request.principal.type = 'cluster' }
Allow any-user to manage network-load-balancers in compartment <compartment-ocid> where all { request.principal.type = 'cluster' }ここで、<compartment-ocid>は、ロード・バランサまたはネットワーク・ロード・バランサを作成するコンパートメント(OCID)です。
これらのポリシー・ステートメントが許容しすぎると考える場合は、次のいずれかの方法または両方の方法で権限を制限できます。
-
ロード・バランサまたはネットワーク・ロード・バランサを作成するクラスタのコンパートメントOCIDを明示的に指定する方法。例:
Allow any-user to manage load-balancers in compartment <compartment-ocid> where all { request.principal.type = 'cluster' and request.principal.compartment.id = '<cluster-compartment-ocid>' } -
ロード・バランサまたはネットワーク・ロード・バランサを作成するクラスタのOCIDを明示的に指定します。例:
Allow any-user to manage load-balancers in compartment <compartment-ocid> where all { request.principal.id = '<cluster-ocid>' }
ロード・バランサまたはネットワーク・ロード・バランサの作成を開始するのはKubernetes Engineですが、IAMポリシーは、OCI APIリクエストを作成するリソース・プリンシパルとしてクラスタを参照します。
ロード・バランサのCookieベースのセッション永続性の構成
Kubernetes EngineがLoadBalancerタイプのKubernetesサービスに対してOCIロード・バランサをプロビジョニングする場合、セッション永続性(「スティッキー・セッション」)を構成して、同じクライアントからのリクエストが一貫して同じバックエンド・サーバーにルーティングされるようにできます。
セッション永続性は、バックエンド・サーバーでクライアント状態を維持するアプリケーションで役立ちます。
OCIロード・バランサは、次の2種類のCookieベースのセッション永続性をサポートします。
- アプリケーションCookieの永続性: バックエンド・アプリケーションがCookieを設定および管理します。
- ロード・バランサCookieの永続性: ロード・バランサはCookieを設定および管理します。
Cookieベースのセッション永続性のOCIロード・バランサ・サポートの詳細は、ロード・バランサ・セッション永続性を参照してください。
セッション永続性を構成するには、サービス・マニフェストのメタデータ・セクションに2つの永続性注釈の1つを追加します。
次の点に注意してください:
- セッション永続性は、ロード・バランサ(
oci.oraclecloud.com/load-balancer-type: "lb")でサポートされています。 - セッション永続性は、ネットワーク・ロード・バランサ(
oci.oraclecloud.com/load-balancer-type: "nlb")ではサポートされていません。ネットワーク・ロード・バランサにセッション永続性注釈が指定されている場合、その注釈は無視されます。 - 2つの永続性注釈は相互に排他的です。両方を指定した場合、サービスの調整は失敗します。
- 永続性アノテーションが指定されていない場合、セッション永続性は無効になります。
アプリケーションCookieの永続性の構成
アプリケーションCookieの永続性を構成するには、マニフェスト・ファイルのメタデータ・セクションに次の注釈を追加します。
oci-load-balancer.oraclecloud.com/session-persistence-config: "<json>"
ここで、<json>はアプリケーションCookieの永続性構成を定義します。
例:
apiVersion: v1
kind: Service
metadata:
name: my-app-svc
annotations:
oci.oraclecloud.com/load-balancer-type: "lb"
oci-load-balancer.oraclecloud.com/session-persistence-config:
{
"cookieName": "APPSESS",
"disableFallback": true
}
spec:
type: LoadBalancer
selector:
app: my-app
ports:
- name: http
port: 80
targetPort: 8080
Cookieの動作を制御するために含めることができるオプション・フィールドは次のとおりです。
cookieName: アプリケーションによって設定されるCookieの名前を指定します。disableFallback: Cookieが存在しない場合にフォールバック動作を無効にするかどうかを指定します。
アプリケーションCookie永続性のOCIロード・バランサ・サポートの詳細は、アプリケーションCookieスティッキネスを参照してください。
ロード・バランサCookie永続性の構成
ロード・バランサCookieの永続性を構成するには、マニフェスト・ファイルのメタデータ・セクションに次の注釈を追加します。
oci-load-balancer.oraclecloud.com/lb-cookie-session-persistence-config: "<json>"
ここで、<json>は、ロード・バランサのCookie永続性構成を定義します。
例:
apiVersion: v1
kind: Service
metadata:
name: my-app-svc
annotations:
oci.oraclecloud.com/load-balancer-type: "lb"
oci-load-balancer.oraclecloud.com/lb-cookie-session-persistence-config:
{
"cookieName": "X-Oracle-OCI-Route",
"disableFallback": true,
"domain": "example.com",
"path": "/",
"maxAgeInSeconds": 120,
"isSecure": true,
"isHttpOnly": true
}
spec:
type: LoadBalancer
selector:
app: my-app
ports:
- name: http
port: 80
targetPort: 8080
この例では、ロード・バランサは、セッション永続性を維持するために使用されるCookieを管理します。
Cookieの動作を制御するために含めることができるオプション・フィールドは次のとおりです。
cookieNamedisableFallbackdomainpathmaxAgeInSecondsisSecureisHttpOnly
ロード・バランサCookie永続性のOCIロード・バランサ・サポートの詳細は、ロード・バランサCookieスティッキネスを参照してください。
検証のルール
セッション永続性を構成する場合は、次の検証ルールに注意してください。
- 両方の永続性注釈が指定されている場合、構成は失敗します。
- 注釈のJSON値が不正な形式の場合、構成は失敗します。
- 永続性アノテーションが指定されていない場合、セッション永続性は有効になりません。