Alibaba Cloud Server Load Balancer (SLB) を使用して各種のサービスにアクセスできます。

このタスクについて

ご利用中のクラスターにバージョン 1.9.3 以降の Cloud Controller Manager (CCM) を使用して作成した既存の SLB インスタンスを指定した場合、SLB インスタンス用のリスナーが設定されません。 SLB インスタンス用のリスナーを設定するには、service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners: "true" を設定します。 SLB インスタンス用のリスナーは、手作業で設定することもできます。

次のコマンドを実行して、CCM のバージョンを照会します。
root@master # kubectl get pod -n kube-system -o yaml|grep image:|grep cloud-con|uniq

  image: registry-vpc.cn-hangzhou.aliyuncs.com/acs/cloud-controller-manager-amd64:v1.9.3

注意事項

  • サービスのタイプが LoadBalancer の場合、CCM はサービスの SLB インスタンス ( SLB インスタンスリスナー、および VServer グループなどのリソースを含む) を作成または設定します。
  • サービスのタイプが LoadBalancer 以外の場合、CCM はサービスの SLB インスタンスを設定しません。 サービスのタイプ設定をType = LoadBalancer から Type! = LoadBalancerに変更した場合、CCM はサービスに対して作成された SLB インスタンスを削除します。 SLB インスタンスがservice.beta.kubernetes.io/alibaba-cloud-loadbalancer-id アノテーションで指定された既存の SLB インスタンスである場合、CCM は SLB インスタンスを削除しません。
  • 自動設定更新:CCM は宣言型 API を使用し、特定条件下のサービス設定に従って SLB インスタンスの設定を自動的に更新します。 SLB コンソールで SLB インスタンスの設定を変更した場合、CCM が設定を更新した際に変更が上書きされる場合があります。 お客様によって指定された既存の SLB インスタンスで、かつ service.beta.kubernetes.io/alicloud-loadbalancer-force-override-listeners アノテーションが false に指定されている場合、設定変更は上書きされません。 CCM によって作成され、保守されている SLB インスタンスは設定を変更しないでください。
  • サービスに既存の SLB インスタンスを指定するか、または CCM でサービスの SLB を作成します。 それぞれの方法で指定または作成された SLB インスタンスは、異なった方法で管理されます。
    既存の SLB インスタンス
    • サービスに service.beta.kubernetes.io/alibaba-cloud-loadbalancer-idアノテーションを設定します。
    • SLB インスタンスの設定:CCM はこの SLB インスタンスを使用し、他のアノテーションに基づいて設定します。 CCM は、この SLB インスタンスに対して複数の VServer グループを作成します。 クラスターのノードが変更された場合、CCM は変更に応じて VServer グループのノードを更新します。
    • リスナーの設定:CCM は、 service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners アノテーションの設定に応じて SLB インスタンスのリスナーを設定します。 アノテーションが false に設定されている場合、CCM は SLB インスタンスのリスナーを設定しません。 アノテーションが true に設定されている場合、CCM は SLB インスタンスのリスナーの更新を試みます。 CCM は、SLB インスタンスのリスナーの名前に基づいて、Kubernetes によって管理されているリスナーかどうかを確認します。 名前の形式が k8s/Port/ServiceName/Namespace/ClusterID の場合、リスナーは Kubernetes によって管理されています。 サービスによって宣言されたリスニングポートが既存のリスニングポートと競合する場合、CCM はエラーを報告します。
    • SLB インスタンスの削除:サービスが削除されても、CCM は service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id アノテーションで指定された既存の SLB インスタンスを削除しません。
  • CCM によって管理される SLB インスタンス
    • CCM はサービスの設定に基づいて SLB インスタンス、 リスナー 、および VServer グループのようなリソースを自動的に作成および設定できます。 これらのリソースはすべて、CCM によって管理されます。 これらのリソースの設定を、SLB コンソールから手作業で変更しないでください。 設定が変更された場合、CCM は次回の調整時にサービスによって宣言された設定に復元するため、予期せぬ結果を引き起こします。
    • SLB インスタンスの削除:サービスが削除されると、CCM は SLB インスタンスを削除します。
  • バックエンドサーバーの更新
    • CCM は、サービスの SLBインスタンスのバックエンド VServer グループを自動的に更新します。 サービスのバックエンドエンドポイントが変更されるか、クラスター内のノードが変更されると、CCM は変更に応じてバックエンドサーバーを更新します。
    • サービスのクラスターに spec.externalTrafficPolicy が設定されている場合、CCM はクラスターのすべてのノードを SLB インスタンスのバックエンドサーバーとして追加します。 ただし、バックエンドサーバーがバックエンドラベルによってサービスに指定されている場合はこの限りではありません。 Elastic Computing Service (ECS) インスタンスにアタッチできる SLB インスタンスの数には上限があります。 前述の方法でバックエンドサーバーが追加された場合、アタッチされた SLB インスタンスの数が短時間に増加します。 上限に達した場合、サービスの調整は失敗します。 この問題を解決するには、サービスの spec.ExternalTrafficPoilcy を Local に設定します。
    • サービスの spec.externalTrafficPoilcy が Local に設定されている場合、CCM は、サービスに対応するポッドがバックエンドサーバーとして配置されているノードのみ SLB インスタンスに追加します。 この方法で、アタッチされたインスタンスの数が増加する期間を延長できます。 また、このモードでは、レイヤー 4 の送信元 IP アドレスを保持できます。
    • いかなる状況においても、CCM がクラスターのマスターノードをバックエンドサーバーとして SLB インスタンスに追加することはありません。
    • kubectl drain または kubectl cordon コマンドによっててノードが空になるか、Unschedulable とマークされた場合、CCM は SLB インスタンスからノードをバックエンドサーバーとして削除します。 ノードを削除するには、 service.beta.kubernetes.io/alibaba-cloud-loadbalancer-remove-unscheduled-backend を On に設定します。
      v1.9.3.164-g2105d2e-aliyun より前のバージョンでは、CCM は SLB バックエンドからスケジュールされていないノードを削除します。

コマンドラインの使用

使用方法 1:

  1. コマンドラインを使用して、NGINX アプリケーションを作成します。
    root@master # kubectl run nginx --image=registry.aliyuncs.com/acs/netdia:latest
    root@master # kubectl get po 
    NAME                                   READY     STATUS    RESTARTS   AGE
    nginx-2721357637-dvwq3                 1/1       Running   1          6s
  2. NGINX アプリケーション用のサービスを作成し、type = LoadBalancer を指定して SLB インスタンス経由で NGINX サービスをパブリックネットワークに公開します。
    root@master # kubectl expose deployment nginx --port=80 --target-port=80 --type=LoadBalancer
    root@master # kubectl get svc
    NAME                  CLUSTER-IP      EXTERNAL-IP      PORT(S)                        AGE
    nginx                 172.19.XX.XX    101.37.XX.XX     80:31891/TCP                   4s
  3. ブラウザーで http://101.37.XX.XX に移動し、NGINX サービスにアクセスします。

使用方法 2:

  1. 次の YAML コードを nginx-svc.yml ファイルにコピーして、ファイルを保存します。
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        run: nignx
      name: nginx-01
      namespace: default
    spec:
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        run: nginx
      type: LoadBalancer
  2. 次のコマンドを実行して NGINX アプリケーションをインストールします。
    $ kubectl apply -f nginx-service.yaml
  3. 次のコマンドを実行して NGINX サービスをパブリックネットワークに公開します。
    root@master # kubectl get service
    NAME           TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)        AGE9d
    ngi-01nx       LoadBalancer   172.19.XX.XX    101.37.XX.XX     80:32325/TCP   3h
  4. ブラウザーで http://101.37.XX.XX に移動し、NGINX サービスにアクセスします。

Kubernetes ダッシュボードの使用

  1. 次の YAML コードを nginx-svc.yml ファイルにコピーして、ファイルを保存します。
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        run: nginx
      name: http-svc
      namespace: default
    spec:
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        run: nginx
      type: LoadBalancer
  2. Container Service コンソール にログインし、対象となるクラスターの右側にある [ダッシュボード] をクリックします。 [Kubernetes ダッシュボード] ページが表示されます。
  3. 右上の [作成] をクリックして、アプリケーションを作成します。
    アプリケーションの作成
  4. [ファイルから作成] タブをクリックします。 保存した nginx-svc.yml ファイルを選択します。
  5. [アップロード] をクリックします。
    NGINX アプリケーション用に、LoadBalancer タイプの NGINX サービスが作成されます。サービス名は http-svc です。
  6. [Kubernetes ダッシュボード] ページで、デフォルトの名前空間を選択し、[サービス] をクリックします。
    NGINX サービス http-svc が表示されます。 パブリックエンドポイントは http://114.55.XX.XX:80です。
    サービスへのアクセス
  7. ブラウザーにエンドポイントを入力して NGINX サービスにアクセスします。

Container Service コンソールの使用

  1. [コンテナサービス - Kubernetes] の左側のナビゲーションペインで、 [アプリケーション] > [デプロイメント] を選択します。
  2. 対象となるクラスターと名前空間を選択し、右上の [テンプレートから作成] をクリックします。
    アプリケーションの作成
  3. サンプルテンプレート で [カスタム] を選択し、次のコードをテンプレートセクションにコピーします。
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        run: nginx
      name: ngnix
      namespace: default
    spec:
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        run: nginx
      type: LoadBalancer
  4. [作成] をクリックします。
  5. [Kubernetes ダッシュボード] をクリックし、[Kubernetes ダッシュボード] ページでデプロイの進捗状況を確認します。
    Kubernetes ダッシュボード
  6. または、左側のナビゲーションペインで [Ingress と負荷分散] > [サービス] を選択後、対象となるクラスターおよび名前空間を選択し、デプロイされたサービスを表示します。
    サービスのデプロイ

参考資料

Alibaba Cloud SLBは、ヘルスチェック、課金方法、SLB インスタンスタイプなど、さまざまなパラメーターをサポートしています。 詳細については、SLB 設定パラメーターをご参照ください。

注意事項

Alibaba Cloud では、 アノテーションを指定することで SLB 機能を使用できます。

  • パブリック SLB インスタンスの作成
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx
      namespace: default
    spec:
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        run: nginx
      type: LoadBalancer
  • 内部 SLB インスタンスを作成する
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: "intranet"
      name: nginx
      namespace: default
    spec:
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        run: nginx
      type: LoadBalancer
  • HTTP タイプ SLB インスタンスの作成
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-protocol-port: "http:80"
      name: nginx
      namespace: default
    spec:
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        run: nginx
      type: LoadBalancer
  • HTTPS タイプ SLB インスタンスの作成

    Alibaba Cloud コンソールで証明書を作成し、証明書 ID を登録します。 次に、必要なアノテーションを指定して、HTTPS タイプの SLB インスタンスを作成します。

    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-protocol-port: "https:443"
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-cert-id: "${YOUR_CERT_ID}"
      name: nginx
      namespace: default
    spec:
      ports:
      - port: 443
        protocol: TCP
        targetPort: 443
      selector:
        run: nginx
      type: LoadBalancer
  • SLB インスタンスの 帯域幅の制限
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-charge-type: "paybybandwidth"
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-bandwidth: "100"
      name: nginx
      namespace: default
    spec:
      ポート:
      - port: 443
        protocol: TCP
        targetPort: 443
      selector:
        run: nginx
      type: LoadBalancer
  • SLB インスタンスタイプの指定
    SLB インスタンスの仕様の詳細については、「CreateLoadBalancer」をご参照ください。
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec: "slb.s1.small"
      name: nginx
      namespace: default
    spec:
      ports:
      - port: 443
        protocol: TCP
        targetPort: 443
      selector:
        run: nginx
      type: LoadBalancer
  • 既存の SLB インスタンスの使用
    • デフォルトでは、既存の SLB インスタンスのリスナーは上書きされません。 既存の SLB のリスナーを強制的に上書きするには、service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners true に設定します。
      次の 2 つの理由により、既存の SLB インスタンスのリスナーはデフォルトでは上書きされません。
      • サービスが既存のリスナーにバインドされている場合、上書きを強制するとサービスが中断する可能性があります。
      • CCM がサポートするバックエンドの設定に制限があるため、複雑な設定を処理できません。 複雑なバックエンド設定要件がある場合は、リスナーを上書きせずにコンソールでリスナーを設定できます。
      いずれの場合も、リスナーを強制的に上書きしないことを推奨します。 既存の SLB インスタンスのリスナーポートが不要となった場合は、リスナーを強制的に上書きできます。
    • 現在、 service.beta.kubernetes.io/alibaba-cloud-loadbalancer-additional-resource-tags アノテーションを使用して既存の SLB インスタンスに追加のタグをアタッチすることはできません。
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: "${YOUR_LOADBALACER_ID}"
      name: nginx
      namespace: default
    spec:
      ports:
      - port: 443
        protocol: TCP
        targetPort: 443
      selector:
        run: nginx
      type: LoadBalancer
  • 既存の SLB インスタンスを使用し、SLB インスタンスのリスナーを強制的に上書きする
    既存のリスナーを強制的に上書きします。 リスナーポートの競合が発生した場合、既存のリスナーが削除されます。
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: "${YOUR_LOADBALACER_ID}"
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners: "true"
      name: nginx
      namespace: default
    spec:
      ports:
      - port: 443
        protocol: TCP
        targetPort: 443
      selector:
        run: nginx
      type: LoadBalancere: LoadBalancer
  • バックエンドラベルを使用して、バックエンドサーバーとして使用するワーカーノードを指定する

    複数入力する場合は、コンマ (,) で区切ります。 例:"k1=v1,k2=v2" ノードは、バックエンドサーバーとして追加される指定されたすべてのラベルを満たす必要があります。

    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-backend-label: "failure-domain.beta.kubernetes.io/zone=ap-southeast-5a"
      name: nginx
      namespace: default
    spec:
      ports:
      - port: 443
        protocol: TCP
        targetPort: 443
      selector:
        run: nginx
      type: LoadBalancer
  • TCP タイプの SLB インスタンスへのセッションタイムアウトの設定
    • service.beta.kubernetes.io/alicloud-loadbalancer-persistence-time パラメーター は、 TCP リスナーにのみ適用されます。
    • SLB インスタンスに複数の TCP リスナーがある場合、設定はすべての TCP リスナーで有効になります。
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-persistence-timeout: "1800"
      name: nginx
      namespace: default
    spec:
      ports:
      - port: 443
        protocol: TCP
        targetPort: 443
      selector:
        run: nginx
      type: LoadBalancer
  • Cookie を挿入して HTTP または HTTPS タイプの SLB インスタンスのセッション永続性を設定する
    • HTTP および HTTPS タイプの SLB インスタンスのみサポートされます。
    • SLB インスタンスに複数の HTTP または HTTPS リスナーがある場合、設定はすべての HTTP または HTTPS リスナーに対して有効です。
    • Cookieの挿入によるセッションの永続性を設定するには、次の例で指定されるすべてのアノテーションが必要です。
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-sticky-session: "on"
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-sticky-session-type: "insert"
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-cookie-timeout: "1800"
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-protocol-port: "http:80"
      name: nginx
      namespace: default
    spec:
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        run: nginx
      type: LoadBalancer
  • サーバー側の Cookie による HTTP または HTTPS タイプの SLB インスタンスのセッション永続性を設定する
    • HTTP および HTTPS タイプの SLB インスタンスのみサポートされます。
    • SLB インスタンスに複数の HTTP または HTTPS リスナーがある場合、設定はすべての HTTP または HTTPS リスナーに対して有効です。
    • サーバー側の Cookie によるセッションの永続性を設定するには、次の例で指定されるすべてのアノテーションが必要です。
    • service.beta.kubernetes.io/alibaba-cloud-loadbalancer-cookie アノテーションで指定された Cookie では、文字、数字、下線 (_)、ハイフン (-) のみ使用できます。
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-sticky-session: "on"
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-sticky-session-type: "server"
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-cookie: "${YOUR_COOKIE}"
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-protocol-port: "http:80"
      name: nginx
      namespace: default
    spec:
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        run: nginx
      type: LoadBalancer
  • SLB インスタンスの作成時に、プライマリおよびセカンダリゾーンを指定する
    • 一部のリージョン (ap-southeast-5 など) の SLB インスタンスは、プライマリゾーンとセカンダリゾーンをサポートしていません。
    • 作成後にプライマリおよびセカンダリゾーンを変更することはできません。
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-master-zoneid: "ap-southeast-5a"
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-slave-zoneid: "ap-southeast-5a"
      name: nginx
      namespace: default
    spec:
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        run: nginx
      type: LoadBalancer
  • ポッドが配置されているノードをバックエンドサーバーとして使用する

    デフォルトでは、 サービスのクラスターに externalTrafficPolicy が設定されます。 クラスターモードでは、クラスター内のすべてのノードがバックエンドサーバーとして使用されます。 サービスの externalTrafficPolicy を Localに設定すると、ポッドが配置されているノードのみバックエンドサーバーとして使用されます。

    apiVersion: v1
    kind: Service
    metadata:
      name: nginx
      namespace: default
    spec:
      externalTrafficPolicy: Local
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        run: nginx
      type: LoadBalancer
  • Virtual Private Cloud (VPC) ネットワークタイプの SLB インスタンスを作成する
    • VPC ネットワークタイプの SLB インスタンスを作成するには、次の例で指定されているすべてのアノテーションが必要です。
    • 内部 SLB インスタンスは、VPC およびクラシックネットワークタイプをサポートします。 詳細については、「SLB インスタンスの概要」をご参照ください.
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alicloud-loadbalancer-address-type: "intranet"
        service.beta.kubernetes.io/alicloud-loadbalancer-slb-network-type
      name: nginx
      namespace: default
    spec:
      ports:
      - port: 443
        protocol: TCP
        targetPort: 443
      selector:
        run: nginx
      type: LoadBalancer
  • 帯域幅課金の SLB インスタンスを作成する
    • パブリック SLB インスタンスのみ帯域幅課金をサポートします。
    • 帯域幅課金の SLB インスタンスを作成するためには、次の例で指定されているすべてのアノテーションが必要です。
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-bandwidth: "45"
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-charge-type: "paybybandwidth"
      name: nginx
      namespace: default
    spec:
      ports:
      - port: 443
        protocol: TCP
        targetPort: 443
      selector:
        run: nginx
      type: LoadBalancer
  • ヘルスチェック機能が有効な SLB インスタンスを作成する
    • ヘルスチェック機能が有効な TCP タイプの SLB インスタンスを作成する
      • ヘルスチェック機能は、TCP リスナーではデフォルトで有効になっており、無効化することはできません。 service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-flag annotation アノテーションは無効です。
      • ヘルスチェック機能が有効な TCP タイプの SLB インスタンスを作成するには、次の例で指定されているすべてのアノテーションが必要です。
      apiVersion: v1
      kind: Service
      metadata:
        annotations:
          service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-type: "tcp"
          service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-connect-timeout: "8"
          service.beta.kubernetes.io/alibaba-cloud-loadbalancer-healthy-threshold: "4"
          service.beta.kubernetes.io/alibaba-cloud-loadbalancer-unhealthy-threshold: "4"
          service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-interval: "3"
        name: nginx
        namespace: default
      spec:
        ports:
        - port: 80
          protocol: TCP
          targetPort: 80
        selector:
          run: nginx
        type: LoadBalancer
    • ヘルスチェック機能が有効な HTTP タイプの SLB インスタンスを作成する

      ヘルスチェック機能が有効な HTTP タイプの SLB インスタンスを作成するには、次の例で指定されているすべてのアノテーションが必要です。

      apiVersion: v1
      kind: Service
      metadata:
        annotations:
          service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-flag: "on"
          service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-type: "http"
          service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-uri: "/test/index.html"
          service.beta.kubernetes.io/alibaba-cloud-loadbalancer-healthy-threshold: "4"
          service.beta.kubernetes.io/alibaba-cloud-loadbalancer-unhealthy-threshold: "4"
          service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-timeout: "10"
          service.beta.kubernetes.io/alicloud-loadbalancer-health-check-interval
          service.beta.kubernetes.io/alicloud-loadbalancer-protocol-port: "http:80"
        name: nginx
        namespace: default
      spec:
        ports:
        - port: 80
          protocol: TCP
          targetPort: 80
        selector:
          run: nginx
        type: LoadBalancer
  • SLB インスタンスのスケジューリングアルゴリズムを指定する
    • wrr (デフォルト):重みの大きいバックエンドサーバーが、重みの小さいサーバーよりも多くのリクエストを受信します。
    • wlc:各バックエンドサーバーの重みと負荷 (接続数)に基づいてリクエストが転送されます。 重みが同じである場合、接続数が少ないバックエンド RealServer が、接続数が多いバックエンド RealServer よりも多くのリクエストを受信します。
    • rr:バックエンドサーバーに均等かつ順番にリクエストが転送されます。
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-scheduler: "wlc"
      name: nginx
      namespace: default
    spec:
      ports:
      - port: 443
        protocol: TCP
        targetPort: 443
      selector:
        run: nginx
      type: LoadBalancer
  • アクセス制御機能が有効な SLB インスタンスの作成
    • Alibaba Cloud コンソールでアクセス制御リスト (ACL) を作成し、ACL IDを記録します。 次に、必要なアノテーションを指定して、アクセス制御機能が有効な SLB インスタンスを作成します。
    • ホワイトリストは、特定の IP アドレスからのアクセスのみを許可し、ブラックリストは特定の IP アドレスからのアクセスのみを制限します。
    • アクセス制御機能が有効な SLB インスタンスを作成するには、次の例で指定されているすべてのアノテーションが必要です。
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-acl-status: "on"
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-acl-id: "${YOUR_ACL_ID}"
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-acl-type: "white"
      name: nginx
      namespace: default
    spec:
      ports:
      - port: 443
        protocol: TCP
        targetPort: 443
      selector:
        run: nginx
      type: LoadBalancer
  • SLB インスタンスの VSwitch を指定する
    • Alibaba Cloud VPC コンソールで VSwitch の ID を検索します。 次に、必要なアノテーションを使用して、SLB インスタンスの VSwitch を指定します。
    • SLB インスタンスの VSwitch を指定するには、次の例で指定されているすべてのアノテーションが必要です。
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
       service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: "intranet"
       service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vswitch-id: "${YOUR_VSWITCH_ID}"
      name: nginx
      namespace: default
    spec:
      ports:
      - port: 443
        protocol: TCP
        targetPort: 443
      selector:
        run: nginx
      type: LoadBalancer
  • SLB インスタンスのポート転送を設定する
    • ポート転送により、SLB インスタンスはリクエストを HTTP ポートから HTTPS ポートに転送できるようになります。
    • ポート転送を設定するには、Alibaba Cloud コンソールで証明書を作成し、証明書 ID を記録する必要があります。
    • SLB インスタンスのポート転送を設定するには、次の例で指定されているすべてのアノテーションが必要です。
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-protocol-port: "https:443,http:80"
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-cert-id: "${YOUR_CERT_ID}"
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-forward-port: "80:443"
      name: nginx
      namespace: default
    spec:
      ports:
      - name: https
        port: 443
        protocol: TCP
        targetPort: 443
      - name: http
        port: 80
        protocol: TCP
        targetPort: 80
      selector:
        run: nginx
      type: LoadBalancer
  • SLB インスタンスに追加のタグを添付する

    複数のタグはコンマ (,) で区切ります (例:"k1=v1,k2=v2")。

    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-additional-resource-tags: "Key1=Value1,Key2=Value2" 
      name: nginx
      namespace: default
    spec:
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        run: nginx
      type: LoadBalancer
  • SLB バックエンドで Unschedulable 状態のノードを削除する
    kubectl cordon および kubectl drain コマンドは、ノードを Unscheduleable 状態に設定します。 service.beta.kubernetes.io/alibaba-cloud-loadbalancer-remove-unscheduled-backend のデフォルト値は "off" です。 unscheduleable 状態のノードは、SLB バックエンドサーバーグループから削除されません。 SLB インスタンスのバックエンドサーバーグループから Unscheduleable 状態のノードを削除するには、service.beta.kubernetes.io/alibaba-cloud-loadbalancer-remove-unscheduled-backend を "on" に設定します。
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-remove-unscheduled-backend: "on"
      name: nginx
    spec:
      externalTrafficPolicy: Local
      ports:
      - name: http
        port: 30080
        protocol: TCP
        targetPort: 80
      selector:
        app: nginx
      type: LoadBalancer
  • SLB バックエンドサーバーにポッドをマウントする
    アノテーションservice.beta.kubernetes.io/backend-type を "eni" に設定して、ポッドを Terway ENI ネットワークモードの SLB バックエンドサーバーにマウントできます。 この方法により、転送のパフォーマンスが向上します。
      apiVersion: v1
      kind: Service
      metadata:
        annotations:
          service.beta.kubernetes.io/backend-type: "eni"
        name: nginx
      spec:
        ports:
        - name: http
          port: 30080
          protocol: TCP
          targetPort: 80
        selector:
          app: nginx
        type: LoadBalancer
  • アノテーションの値は、大文字と小文字が区別されます。
  • 2019 年 9 月 11 日から、アノテーションフィールドは alicloud から alibaba-cloud に更新されました。

    例:

    これまでの設定:service.beta.kubernetes.io/alicloud-loadbalancer-id

    今後の設定:service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id

    システムは、alicloud の書き込み形式と互換性があります。 ユーザーがコードを変更する必要はありません。

アノテーション データ型 説明 デフォルト値 サポートされているバージョン
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-protocol-port string リスニングポートを設定します。 複数のポートを設定する場合はコンマ (,) で区切ります (例:https:443,http:80)。 なし V1.9.3 以降のバージョン
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type string SLB インスタンス名を設定します。 設定可能な値は、internet または intranet です。 internet V1.9.3 以降のバージョン
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-slb-network-type string SLB インスタンスのネットワークタイプを設定します。 設定可能な値は、classic および vpc です。

ネットワークタイプを vpc に設定する場合、service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type アノテーションを "intranet" に指定します。

classic V1.9.3 以降のバージョン
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-charge-type string SLB インスタンスの課金方法を設定します。 設定な可能な値は、 paybytraffic または paybybandwidth です。 paybytraffic V1.9.3 以降のバージョン
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id string SLB インスタンスの ID を設定します。 service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id アノテーションを指定して、既存の SLB インスタンスを指定できます。 既存の SLB インスタンスを指定した場合、インスタンスのリスナーは上書きされません。 既存の SLB インスタンスのリスナーを強制的に上書きするには、 service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners アノテーションを "true " に設定します。 なし V1.9.3.59-ge3bc999-aliyun 以降のバージョン
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-backend-label string SLB インスタンスのバックエンドサーバーとして追加されるワーカーノードを指定するためのラベルを設定します。 なし V1.9.3 以降のバージョン
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec string SLB インスタンスの仕様を設定します。 詳細については、以下をご参照ください。CreateLoadBalancer なし V1.9.3 以降のバージョン
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-persistence-timeout string セッションの継続時間を設定します (単位:秒)。

このアノテーションは、TCP リスナーにのみ適用されます。 設定可能な値は、0 から 3600 です。

デフォルト値は 0 です (セッションを維持しないことを示します)。

詳細については、以下をご参照ください。CreateLoadBalancerTCPListener

0 V1.9.3 以降のバージョン
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-sticky-session string セッションの継続時間を適用するかどうかを設定します。 設定可能な値は、on または off です。
HTTP および HTTPS リスナーにのみ適用されます。

詳細については、以下をご参照ください。 CreateLoadBalancerHTTPListener およびCreateLoadBalancerHTTPSListener

off V1.9.3 以降のバージョン
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-sticky-session-type string Cookie の処理方法を設定します。 設定可能な値は以下のとおりです。
  • insert:Cookie を挿入します。
  • server:Cookie を上書きします。
  • HTTP および HTTPS リスナーにのみ適用されます。
  • service.beta.kubernetes.io/alibaba-cloud-loadbalancer-sticky-session アノテーションが "on" に設定されている場合、このアノテーションを指定する必要があります。

詳細については、以下をご参照ください。CreateLoadBalancerHTTPListener およびCreateLoadBalancerHTTPSListener

なし V1.9.3 以降のバージョン
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-cookie-timeout string Cookie のタイムアウト期間を設定します (単位:秒)。 設定可能な値は 1 から 86,400 です。
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-sticky-session アノテーションが "on" に、かつ service.beta.kubernetes.io/alibaba-cloud-loadbalancer-sticky-session-type アノテーションが "insert" に設定されている場合、このアノテーションを指定する必要があります。

詳細については、以下をご参照ください。CreateLoadBalancerHTTPListener およびCreateLoadBalancerHTTPSListener

なし V1.9.3 以降のバージョン
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-cookie string バックエンドサーバー上に設定する Cookie を設定しす。

名前の長さは 1 ~ 200 文字です。 ASCII 文字と数字のみ使用できます。 コンマ (,))、セミコロン (;)、またはスペースは使用できません。 ドル記号 ($) で始めることはできません。

service.beta.kubernetes.io/alibaba-cloud-loadbalancer-sticky-session アノテーションが "on" に、かつ service.beta.kubernetes.io/alibaba-cloud-loadbalancer-sticky-session-type アノテーションが "server" に設定されている場合、このアノテーションを指定する必要があります。

詳細については、以下をご参照ください。CreateLoadBalancerHTTPListener およびCreateLoadBalancerHTTPSListener

なし V1.9.3 以降のバージョン
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-master-zoneid string バックエンドサーバーのプライマリゾーンの ID を設定します。 なし V1.9.3.10-gfb99107-aliyun 以降のバージョン
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-slave-zoneid string バックエンドサーバーのセカンダリゾーンの ID を設定します。 なし V1.9.3.10-gfb99107-aliyun 以降のバージョン
externalTrafficPolicy string ノードをバックエンドサーバーとして追加するためのポリシーを設定します。 設定可能な値は以下のとおりです。
  • Cluster: すべてのノードをバックエンドサーバーとして追加します。
  • Local: ポッドがバックエンドサーバーとして配置されているノードを追加します。
cluster V1.9.3 以降のバージョン
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners string 指定された既存の SLB インスタンスのリスナーを上書きするかどうかを指定します。 false:既存の SLB インスタンスのリスナーは上書きされません。 V1.9.3.59-ge3bc999-aliyun 以降のバージョン
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-bandwidth string SLB インスタンスの帯域幅を設定します。 このアノテーションは、パブリック SLB インスタンスにのみ適用されます。 50 V1.9.3.10-gfb99107-aliyun 以降のバージョン
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-cert-id string Alibaba Cloud の証明書 ID を設定します。 まず、証明書のアップロードが必要です。 なし V1.9.3.164-g2105d2e-aliyun 以降のバージョン
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-flag string ヘルスチェック機能を有効にするかどうかを示します。 設定可能な値は on または off です。
  • TCP リスナーの場合、デフォルトで "on" が設定され、変更できません。
  • HTTP リスナーの場合、デフォルト値は "off" です。
off. TCP リスナーの場合、このアノテーションは不要です。 ヘルスチェック機能はデフォルトで有効になっており、無効にすることはできません。 V1.9.3 以降のバージョン
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-type string ヘルスチェックのタイプを設定します。 設定可能な値は tcp または http です。

詳細については、以下をご参照ください。CreateLoadBalancerTCPListener

tcp V1.9.3 以降のバージョン
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-uri string ヘルスチェックに使用される URI を設定します。
ヘルスチェックのタイプが TCP に設定されている場合、このアノテーションは不要です。

詳細については、以下をご参照ください。CreateLoadBalancerTCPListener

なし V1.9.3 以降のバージョン
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-connect-port string ヘルスチェックに使用されるポートを設定します。 設定可能な値は以下のとおりです。
  • -520 :リスナー用に設定されたバックエンドポート番号を使用します。
  • 1 から 65535 :ヘルスチェックに使用されるバックエンドポート番号を指定します。

詳細については、以下をご参照ください。CreateLoadBalancerTCPListener

なし V1.9.3 以降のバージョン
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-healthy-threshold string バックエンドサーバーが正常だと判定されるまでの連続したヘルスチェックの回数 (失敗から成功まで) を設定します。

設定可能な値は 1 から 100 です。

詳細については、以下をご参照ください。CreateLoadBalancerTCPListener

3 V1.9.3 以降のバージョン
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-unhealthy-threshold string バックエンドサーバーが異常と判定されるまでのヘルスチェックの連続した失敗回数 (成功から失敗まで) を設定します。 設定可能な値は以下のとおりです。

2 から 10

詳細については、以下をご参照ください。CreateLoadBalancerTCPListener

3 V1.9.3 以降のバージョン
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-interval string 連続した 2 回のヘルスチェックの時間間隔を設定します (単位:秒)。

設定可能な値は、1 から 50 です 。

詳細については、以下をご参照ください。CreateLoadBalancerTCPListener

2 V1.9.3 以降のバージョン
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-connect-timeout string ヘルスチェックに対する応答のタイムアウト期間を設定します (単位:秒)。 このアノテーションは、TCP ヘルスチェックに適用されます。 指定されたタイムアウト期間内にバックエンドサーバーが応答しない場合、サーバーはヘルスチェックに失敗します。

設定可能な値は、1 から 300 です。

service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-connect-timeout アノテーションの値が service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-interval アノテーションの値未満であった場合、 service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-connect-timeout アノテーションは無効として扱われます。 この場合、 service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-interval アノテーションの値はタイムアウト期間として使用されます。

詳細については、以下をご参照ください。CreateLoadBalancerTCPListener

5 V1.9.3 以降のバージョン
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-timeout string ヘルスチェックに対する応答のタイムアウト期間を設定します (単位:秒)。 このアノテーションは、HTTP ヘルスチェックに適用されます。 指定されたタイムアウト期間内にバックエンドサーバーが応答しない場合、サーバーはヘルスチェックに失敗します。

設定可能な値は、1 から 300 です。

service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-timeout アノテーションの値が service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-interval アノテーションの値未満の場合、 service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-timeout アノテーションは無効として扱われます。 この場合、 service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-interval アノテーションはタイムアウト期間として使用されます。

詳細については、以下をご参照ください。CreateLoadBalancerTCPListener

5 V1.9.3 以降のバージョン
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-domain string ヘルスチェックに使用されるドメイン名を設定します。
  • $_ip:バックエンドサーバーのプライベート IP アドレスを設定します。 このアノテーションを指定しない場合、または $ _ip に設定した場合、SLB インスタンスは各バックエンドサーバーのプライベート IP アドレスをヘルスチェックのドメイン名として使用します。
  • domain :ドメイン名の長さは 1 文字から 80 文字までです。 英字、数字、アンダースコア (_)、ハイフン (-) を使用できます。
なし V1.9.3 以降のバージョン
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-httpcode string ヘルスチェックが正常であるかどうかを示す HTTP ステータスコードを設定します。 複数の HTTP ステータスを指定する場合、コードをコンマ (,) で区切ります。 設定可能な値は次のとおりです。
  • http_2xx
  • http_3xx
  • http_4xx
  • http_5xx
デフォルト値は、 http_2xx です。
http_2xx V1.9.3 以降のバージョン
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-scheduler string スケジューリングのアルゴリズムを設定します。 設定可能な値は、wrr、wlc、および rr です。
  • wrr (デフォルト):重みの大きいバックエンドサーバーが、重みの小さいサーバーよりも多くのリクエストを受信します。
  • wlc:各バックエンドサーバーの重みと負荷 (接続数)に基づいてリクエストが転送されます。 重みが同じである場合、接続数が少ないバックエンド サーバーが、接続数が多いバックエンドサーバーよりも多くのリクエストを受信します。
  • rr:バックエンドサーバーに均等かつ順番にリクエストが転送されます。
wrr V1.9.3 以降のバージョン
service.beta.kubernetes.io/alicloud-loadbalancer-cert-id string アクセス制御機能を有効にするかどうかを選択します。 設定可能な値は、 "on" または "off" です。 off V1.9.3.164-g2105d2e-aliyun 以降のバージョン
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-acl-id string リスナーがバインドされている ACL の ID を設定します。 service.beta.kubernetes.io/alibaba-cloud-loadbalancer-acl-status アノテーションが "on" に設定されている場合は必須のアノテーションです。 なし v1.9.3.164-g2105d2e-aliyun 以降のバージョン
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-acl-type string ACL のタイプを設定します。

設定可能な値は、"white" および "black" です。

  • white :ACL をホワイトリストとして指定します。 ACL の IP アドレスまたは CIDR ブロックからのリクエストのみ転送されます。 ホワイトリストは、特定の IP アドレスに対してのみアプリケーションへのアクセスを許可する場合に使用できます。 ACL をホワイトリストとして指定すると、リスクが生じる可能性があります。 ホワイトリストの設定後、SLB インスタンスはホワイトリスト内の IP アドレスから送信されたリクエストのみ転送します。 IP アドレスが全く指定されていないホワイトリストが作成されている場合、SLB インスタンスはすべてのリクエストを転送します。
  • black :ACL をブラックリストとして指定します。 ACL の IP アドレスまたは CIDR ブロックからのすべてのリクエストが拒否されます。 ブラックリストは、特定の IP アドレスに対してアプリケーションへのアクセスを禁止する場合に使用できます。 IPアドレスが全く指定されていないブラックリストが作成されている場合、SLB インスタンスはすべてのリクエストを転送します。 service.beta.kubernetes.io/alibaba-cloud-loadbalancer-acl-statusアノテーションが "on" に設定されている場合、このアノテーションは必須です。
なし v1.9.3.164-g2105d2e-aliyun以降のバージョン
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vswitch-id string SLB インスタンスが属する VSwitch の ID を設定します。 このアノテーションを設定するには、service.beta.kubernetes.io/alicloud-loadbalancer-address-type アノテーションをイントラネットに設定する必要があります。 なし V1.9.3 以降のバージョン
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-forward-port string HTTP リクエストを指定された HTTPS ポートに転送するためのポート転送設定です。 例: 80:443 なし V1.9.3.164-g2105d2e-aliyun 以降のバージョン
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-additional-resource-tags string SLB インスタンスにアタッチされるタグを設定します。 複数入力する場合は、コンマ (,) で区切ります。 例: "k1=v1,k2=v2" なし V1.9.3 以降のバージョン
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-remove-unscheduled-backend string SLB バックエンドサーバーから SchedulingDisabled ノードを削除します。 設定可能な値は、on または offです。 off V1.9.3.164-g2105d2e-aliyun 以降のバージョン
service.beta.kubernetes.io/backend-type string アノテーションを "eni" に設定して、ポッドを Terway ENI ネットワークモードの SLB バックエンドサーバーにマウントできます。 この設定により、転送のパフォーマンスが向上します。 このパラメーターは、バックエンドポッドが仮想ノード上の eci ポッドである場合に設定する必要があります。 設定可能な値は、eni です。 なし V1.9.3.164-g2105d2e-aliyun 以降のバージョン