すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:アノテーションを使用したELBインスタンスの設定

最終更新日:Oct 29, 2024

サービスのYAMLファイルにアノテーションを追加して、負荷分散を設定できます。 このトピックでは、アノテーションを使用してEdge Load Balancer (ELB) インスタンス、リスナー、バックエンドサーバーグループ、およびエッジelastic IPアドレス (エッジEIP) を設定する方法について説明します。

注意事項

  • 注釈の内容は大文字と小文字を区別します。 小文字を使用します。

  • サービスタイプをtype: LoadBalancerに設定します。

  • ELBインスタンスを使用するには、ロードバランサタイプをloadBalancerClass: alibabacloud.com/elbに設定します。

ELB

重要

ELBインスタンスタイプと課金方法の詳細については、「CreateLoadBalancer」をご参照ください。 ロードバランサーの作成後は、ロードバランサーの設定を更新することはできません。

EdgeControllerManager (ECM) で管理されるELBインスタンスの作成

  • NodePoolSelectorは、次のいずれかの方法で指定する必要があります。

    • key1=val1,key2=val2: ELBインスタンスは、key1=val1条件とkey2=val2条件の両方を満たすエッジノードサービス (ENS) ノードプール用に作成されます。 複数のラベル間の論理的関係はANDである。

    • key in (val1,val2): key=val1またはkey=val2の条件を満たすENSノードプール用にELBインスタンスが作成されます。 複数の値の間の論理関係はORである。

  • openyurt.io/topologyKeys: openyurt.io/nodepoolは、ノードプールのサービストポロジを指定します。 これにより、トラフィックは指定されたノードプール内のアプリケーションポッドにのみ転送されます。

    YAMLコンテンツ:

    apiVersion: v1
    kind: Service
    metadata:
      name: nginx
      namespace: default
      annotations:
        openyurt.io/topologyKeys: openyurt.io/nodepool           #Enable the Service topology feature.
        service.openyurt.io/nodepool-labelselector: key1=val1    #Select ENS node pools. 
    spec:
      ports:
      - name: nginx-80
        port: 80
        protocol: TCP
        targetPort: 80
      selector:
        app: nginx
      type: LoadBalancer
      loadBalancerClass: alibabacloud.com/elb

ELBインスタンスタイプと課金方法の指定

注釈

説明

デフォルト値

service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec

ELBインスタンスタイプの詳細については、「インスタンスタイプと課金」をご参照ください。 このパラメーターを設定して、ELBインスタンスタイプを指定できます。

elb.s2.small

service.beta.kubernetes.io/alibaba-cloud-loadbalancer-pay-type

ELBインスタンスの課金方法。 従量課金 (PostPaid) の課金方法のみがサポートされています。 課金ルールの詳細については、「料金」をご参照ください。

PostPaid

YAMLコンテンツ:

apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: default
  annotations:
    openyurt.io/topologyKeys: openyurt.io/nodepool          
    service.openyurt.io/nodepool-labelselector: key1=val1   
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec: elb.s1.small
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-pay-type: PostPaid    
spec:
  ports:
  - name: nginx-80
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
  type: LoadBalancer
  loadBalancerClass: alibabacloud.com/elb

サービス公開モードの指定

注釈

説明

デフォルト値

service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type

ELBインスタンスがサービスを公開するモード:

  • インターネット: サービスはインターネットに公開されています。 このモードでは、内部対応のELBインスタンスを購入し、ELBインスタンスにEIPを割り当てる必要があります。

  • イントラネット: サービスはプライベートネットワークに公開されます。 このモードでは、内部対応のELBインスタンスを購入するだけで済みます。

インターネット

YAMLコンテンツ:

apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: default
  annotations:
    openyurt.io/topologyKeys: openyurt.io/nodepool          
    service.openyurt.io/nodepool-labelselector: key1=val1
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: internet 
spec:
  ports:
  - name: nginx-80
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
  type: LoadBalancer
  loadBalancerClass: alibabacloud.com/elb

サービスがインターネットに公開されている場合のEIP仕様の指定

サービスをインターネットに公開するには、内部対応のELBインスタンスとEIPを購入する必要があります。

注釈

説明

デフォルト値

service.beta.kubernetes.io/alibaba-cloud-loadbalancer-eip-bandwidth

インターネット帯域幅は、EIPの最大帯域幅を示します。 単位は、Mbit/s です。

10

service.beta.kubernetes.io/alibaba-cloud-loadbalancer-eip-isp

ISP情報:

  • cmcc: チャイナモバイル。

  • unicom: 中国ユニコム。

  • elecom: チャイナテレコム。

なし

service.beta.kubernetes.io/alibaba-cloud-loadbalancer-eip-instance-charge-type

EIP の課金方法。 従量課金 (PostPaid) の課金方法のみがサポートされています。

PostPaid

service.beta.kubernetes.io/alibaba-cloud-loadbalancer-eip-internet-charge-type

インターネット帯域幅の課金方法。 pay-by-monthly-95th-percentile (95BandwidthByMonth) の課金方法のみがサポートされています。

95BandwidthByMonth

YAMLコンテンツ:

apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: default
  annotations:
    openyurt.io/topologyKeys: openyurt.io/nodepool           #Enable the Service topology feature.
    service.openyurt.io/nodepool-labelselector: key1=val1    #Select ENS node pools.
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: internet     
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-eip-bandwidth: "10"
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-eip-isp: cmcc
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-eip-instance-charge-type: "PostPaid"
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-eip-internet-charge-type: "95BandwidthByMonth"
spec:
  ports:
  - name: nginx-80
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
  type: LoadBalancer
  loadBalancerClass: alibabacloud.com/elb

バックエンドサーバーグループ

  • ローカルモードでは、外部トラフィックポリシーは、アプリケーションポッドをホストするノード (バックエンドサーバー) にのみトラフィックを分散します。 複数のサービスが1つのELBインスタンスを共有する場合、外部トラフィックポリシーをローカルモードに設定することはできません。

  • 外部トラフィックポリシーをクラスターモードに設定する必要があります。 このモードでは、ポリシーは仮想プライベートクラウド (VPC) 内のすべてのENSノード (バックエンドサーバー) にトラフィックを分散します。

YAMLコンテンツ:

apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: default
  annotations:
    openyurt.io/topologyKeys: openyurt.io/nodepool           #Enable the Service topology feature.
    service.openyurt.io/nodepool-labelselector: key1=val1    #Select ENS node pools.
spec:
  ports:
  - name: nginx-80
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
  type: LoadBalancer
  loadBalancerClass: alibabacloud.com/elb
  externalTrafficPolicy: Local

指定されたラベルを持つエッジノードをバックエンドサーバーとして追加する

注釈

説明

デフォルト値

service.beta.kubernetes.io/alibaba-cloud-loadbalancer-backend-label

バックエンドサーバーとして追加するワーカーノードのラベルを指定します。 複数のラベルはコンマ (,) で区切ります (例: k1=v1,k2=v2) 。 複数のラベル間の論理的関係はANDである。

非該当

バックエンドサーバーを追加するときにエッジノードを除外するには、node.kubernetes.io/exclude-from-external-load-balancers=trueラベルをエッジノードに追加します。

YAMLコンテンツ:

apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: default
  annotations:
    openyurt.io/topologyKeys: openyurt.io/nodepool
    service.openyurt.io/nodepool-labelselector: key1=val1
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-backend-label: key2=val2
spec:
  ports:
  - name: nginx-80
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
  type: LoadBalancer
  loadBalancerClass: alibabacloud.com/elb
  externalTrafficPolicy: Local

バックエンドサーバーの重みの設定

注釈

説明

デフォルト値

service.beta.kubernetes.io/alibaba-cloud-loadbalancer-backend-weight

リスナーが重みラウンドロビン (WRR) 方式を使用する場合、リクエストはバックエンドサーバーの重みに基づいてバックエンドサーバーに配信されます。 複数のノードと重みのペアをコンマ (,) で区切る必要があります。

たとえば、base=50、node1=80、node2=90の場合、baseはデフォルトですべてのバックエンドサーバーに割り当てられている重みを示します。 ノード1およびノード2には、指定された重みが割り当てられる。

base=100

YAMLコンテンツ:

apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: default
  annotations:
    openyurt.io/topologyKeys: openyurt.io/nodepool
    service.openyurt.io/nodepool-labelselector: key1=val1,key2=val2
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-backend-weight: base=50,node1=80,node2=90
spec:
  ports:
  - name: nginx-80
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
  type: LoadBalancer
  loadBalancerClass: alibabacloud.com/elb

リスナー

ECMは、サービスのSpec.portsに基づいてリスナーを自動的に作成します。 リスナーがリッスンするバックエンドサーバーポートは、クラスターによって割り当てられます。 特定のバックエンドサーバーポートでリッスンするには、nodePort: ${YOUR_SPEC_PORT} を指定します。 YAMLコンテンツ:

apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: default
  annotations:
    openyurt.io/topologyKeys: openyurt.io/nodepool
    service.openyurt.io/nodepool-labelselector: key1=val1
  ports:
  - name: nginx-80
    port: 80
    protocol: TCP
    nodePort: 30080
    targetPort: 80
  selector:
    app: nginx
  type: LoadBalancer
  loadBalancerClass: alibabacloud.com/elb

リスナーのスケジューリングアルゴリズムの構成

注釈

説明

デフォルト値

service.beta.kubernetes.io/alibaba-cloud-loadbalancer-scheduler

リスナーは、次のスケジューリングアルゴリズムをサポートします。

  • wrr: 重みの大きいバックエンドサーバーは、より多くのリクエストを受信します。

  • rr: リクエストはすべてのバックエンドサーバーに均等に分散されます。

  • wlc: リクエストは、各バックエンドサーバーの重みと負荷に基づいて分散されます。 負荷とは、バックエンドサーバーへの接続数を指します。

  • sch: ソースIPアドレスに基づく一貫したハッシュ。 同じ送信元IPアドレスからのリクエストは、同じバックエンドサーバーに配信されます。

  • qch: クイックUDPインターネット接続 (QUIC) IDに基づく一貫したハッシュ。 同じQUIC IDを含むリクエストは、同じバックエンドサーバーにスケジュールされます。

  • iqch: iQUIC CIDの3つの特定のバイトに基づく一貫したハッシュ。 同じ2番目、3番目、および4番目のバイトを持つリクエストは、同じバックエンドサーバーにスケジュールされます。

rr

YAMLコンテンツ:

apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: default
  annotations:
    openyurt.io/topologyKeys: openyurt.io/nodepool
    service.openyurt.io/nodepool-labelselector: key1=val1
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-scheduler: "wrr"
spec:
  ports:
  - name: nginx-80
    port: 80
    protocol: TCP
    nodePort: 30080
    targetPort: 80
  selector:
    app: nginx
  type: LoadBalancer
  loadBalancerClass: alibabacloud.com/elb

TCPリスナーのセッション持続期間の設定

注釈

説明

デフォルト値

service.beta.kubernetes.io/alibaba-cloud-loadbalancer-persistence-timeout

セッションの持続期間。 このアノテーションは、TCP リスナーにのみ適用されます。 ELBインスタンスに複数のTCPリスナーがある場合、設定はデフォルトですべてのTCPリスナーに適用されます。

単位は秒です。 有効な値: 0 ~ 3600 値0は、セッション維持が無効であることを示します。

0

TCPリスナーの接続タイムアウト期間の設定

注釈

説明

デフォルト値

service.beta.kubernetes.io/alibaba-cloud-loadbalancer-established-timeout

接続タイムアウト期間。 単位は秒です。 有効な値: 10 ~ 900

500

YAMLコンテンツ:

apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: default
  annotations:
    openyurt.io/topologyKeys: openyurt.io/nodepool
    service.openyurt.io/nodepool-labelselector: key1=val1,key2=val2
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-established-timeout: "900"
spec:
  ports:
  - name: nginx-80
    port: 80
    protocol: TCP
    nodePort: 30080
    targetPort: 80
  selector:
    app: nginx
  type: LoadBalancer
  loadBalancerClass: alibabacloud.com/elb

リスナーのヘルスチェックの構成

注釈

説明

デフォルト値

service.beta.kubernetes.io/alibaba-cloud-loadbalancer-healthy-threshold

バックエンドサーバーのステータスが失敗 (利用不可) から成功 (利用可能) に変わるまでに、バックエンドサーバーが連続してヘルスチェックに合格する必要がある回数。 有効な値: 210

3

service.beta.kubernetes.io/alibaba-cloud-loadbalancer-unhealthy-threshold

バックエンドサーバーのステータスが成功 (利用可能) から失敗 (利用不可) に変わるまでに、バックエンドサーバーが連続してヘルスチェックに失敗する必要がある回数。 有効な値: 210

3

service.beta.kubernetes.io/alibaba-cloud-loadbalancer-check-interval

連続した 2 回のヘルスチェックの時間間隔を設定します 有効な値: 210。 単位は秒です。

2

service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-connect-timeout

ヘルスチェック応答のタイムアウト期間。 バックエンドサーバーが指定されたタイムアウト期間内に応答しない場合、サーバーはヘルスチェックに合格しません。 有効な値: 1300。 単位は秒です。

5

YAMLコンテンツ:

apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: default
  annotations:
   openyurt.io/topologyKeys: openyurt.io/nodepool
   service.openyurt.io/nodepool-labelselector: key1=val1,key2=val2
   service.beta.kubernetes.io/alibaba-cloud-loadbalancer-healthy-threshold: "5"
   service.beta.kubernetes.io/alibaba-cloud-loadbalancer-unhealthy-threshold: "5"
   service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-interval: "2"
   service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-connect-timeout: "5"
spec:
  ports:
  - name: nginx-80
    port: 80
    protocol: TCP
    nodePort: 30080
    targetPort: 80
  selector:
    app: nginx
  type: LoadBalancer
  loadBalancerClass: alibabacloud.com/elb

高度な設定

このセクションでは、ELBの高度な設定について説明します。

  1. さまざまなシナリオでサービスを作成します。

    既存のELBインスタンスの指定

    既存のELBインスタンスを指定するには、ネットワークIDとELBインスタンスIDを指定する必要があります。

    • 次のYAMLコンテンツに基づいてサービスを作成します。

      apiVersion: v1
      kind: Service
      metadata:
        name: nginx
        namespace: default
        annotations:
          openyurt.io/topologyKeys: openyurt.io/nodepool           #Enable the Service topology feature.
          service.openyurt.io/nodepool-labelselector: key1=val1
          service.beta.kubernetes.io/alibaba-cloud-loadbalancer-managed-by-user: "true"
      spec:
        ports:
        - name: nginx-80
          port: 80
          protocol: TCP
          targetPort: 80
        selector:
          app: nginx
        type: LoadBalancer
        loadBalancerClass: alibabacloud.com/elb

    1つのELBインスタンスを共有する複数のサービスを作成する

    • 外部トラフィックポリシーをクラスターモードに設定する必要があります。

    • 自己管理ELBインスタンスを使用し、ELBインスタンスを指定する必要があります。

    • EIPを使用してインターネットアクセスを有効にするには、EIPを手動で作成および管理する必要があります。

    • 対応するパラメーターをtrueに設定して、リスナーを強制的に上書きする必要があります。

    YAMLコンテンツ:

    apiVersion: v1
    kind: Service
    metadata:
      name: nginx
      namespace: default
      annotations:
        openyurt.io/topologyKeys: openyurt.io/nodepool           #Enable the Service topology feature.
        service.openyurt.io/nodepool-labelselector: key1=val1
        service.openyurt.io/elb-force-override-listeners: "true"
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-managed-by-user: "true"
    spec:
      ports:
      - name: nginx-80
        port: 80
        protocol: TCP
        targetPort: 80
      selector:
        app: nginx
      type: LoadBalancer
      loadBalancerClass: alibabacloud.com/elb
  2. ノードプール (ENS VPC) に対応するPoolServiceを見つけ、次のコマンドを実行して負荷分散を設定します。

    kubectl annotate ps {<SERVICENAME>-NodePoolID} service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id=<lb_ID>
    説明

    上記のコマンドの <SERVICENAME> をノードプール (ENS VPC) のPoolServiceの名前に置き換えます。

    <lb_ID> をELBインスタンスのIDに置き換えます。