Service YAML ファイル内のアノテーションを使用して、Edge Load Balancer (ELB) インスタンス、リスナー、バックエンドサーバーグループ、およびエッジ Elastic IP アドレス (エッジ EIP) を構成します。
このトピックで使用されるすべてのアノテーションキーはプレフィックス service.beta.kubernetes.io/ を使用します。表にはサフィックスのみを示します。
注意事項
-
アノテーションの値は大文字と小文字を区別します。小文字を使用してください。
-
Service に
type: LoadBalancerを設定します。 -
ELB を使用するには、
loadBalancerClass: alibabacloud.com/elbを設定します。
ELB インスタンスの構成は、インスタンス作成後に変更できません。インスタンスレベルの設定を変更する場合は、Service を削除して新しい値で再作成する必要があります。
ベースライン Service 構成
このトピックのすべての例は、以下の Service を基にしています。この Service はラベルによって ENS ノードプールを選択し、Service トポロジーを有効にして、指定されたノードプール内の Pod のみにトラフィックを転送します。
apiVersion: v1
kind: Service
metadata:
name: nginx
namespace: default
annotations:
openyurt.io/topologyKeys: openyurt.io/nodepool # Service トポロジーを有効化。
service.openyurt.io/nodepool-labelselector: key1=val1 # ENS ノードプールを選択。
spec:
ports:
- name: nginx-80
port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx
type: LoadBalancer
loadBalancerClass: alibabacloud.com/elb
nodepool-labelselector アノテーションは、次の 2 つの構文を受け付けます。
| 構文 | 論理 | 例 |
|---|---|---|
key1=val1,key2=val2 |
AND — ノードプールはすべてのラベルを満たす必要があります。 | env=prod,region=cn-north |
key in (val1,val2) |
OR — ノードプールはいずれかの値を満たせばよいです。 | region in (cn-north,cn-south) |
ELB インスタンス構成
インスタンスタイプと課金方法の指定
インスタンスタイプの詳細および料金については、「CreateLoadBalancer」および「インスタンスタイプと課金」をご参照ください。
| アノテーションサフィックス | 説明 | デフォルト |
|---|---|---|
alibaba-cloud-loadbalancer-spec |
ELB インスタンスタイプ(例:elb.s1.small)。 |
elb.s2.small |
alibaba-cloud-loadbalancer-pay-type |
課金方法。PostPaid(従量課金)のみサポートされています。 |
PostPaid |
例:
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
Service 公開モードの設定
| アノテーションサフィックス | 説明 | デフォルト |
|---|---|---|
alibaba-cloud-loadbalancer-address-type |
internet:Service をインターネットに公開(内部 ELB インスタンスとエッジ EIP が必要)。intranet:Service をプライベートネットワークに公開(内部 ELB インスタンスのみ必要)。 |
internet |
例:
annotations:
openyurt.io/topologyKeys: openyurt.io/nodepool
service.openyurt.io/nodepool-labelselector: key1=val1
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: internet
エッジ EIP 仕様の構成(インターネットモードのみ)
address-type が internet の場合、内部 ELB インスタンスとエッジ EIP の両方が必要です。
| アノテーションサフィックス | 説明 | デフォルト |
|---|---|---|
alibaba-cloud-loadbalancer-eip-bandwidth |
エッジ EIP の最大帯域幅。単位:Mbit/s。 | 10 |
alibaba-cloud-loadbalancer-eip-isp |
ISP。cmcc(China Mobile)、unicom(China Unicom)、elecom(China Telecom)。 |
なし |
alibaba-cloud-loadbalancer-eip-instance-charge-type |
EIP 課金方法。PostPaid(従量課金)のみサポートされています。 |
PostPaid |
alibaba-cloud-loadbalancer-eip-internet-charge-type |
インターネット帯域幅の課金方法。95BandwidthByMonth(月次 95 パーセンタイル課金)のみサポートされています。 |
95BandwidthByMonth |
例:
annotations:
openyurt.io/topologyKeys: openyurt.io/nodepool # Service トポロジーを有効化。
service.openyurt.io/nodepool-labelselector: key1=val1 # ENS ノードプールを選択。
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"
バックエンドサーバーグループ
外部トラフィックポリシーの設定
外部トラフィックポリシーは、どの ENS ノードがトラフィックを受信するかを制御します。
-
ローカルモード(
externalTrafficPolicy: Local):トラフィックはアプリケーション Pod をホストしているノードにのみ送信されます。複数の Service が 1 つの ELB インスタンスを共有する場合は使用できません。 -
クラスターモード(デフォルト):トラフィックは仮想プライベートクラウド(VPC)内のすべての ENS ノードに分散されます。複数の Service が 1 つの ELB インスタンスを共有する場合に必要です。
例(ローカルモード):
apiVersion: v1
kind: Service
metadata:
name: nginx
namespace: default
annotations:
openyurt.io/topologyKeys: openyurt.io/nodepool # Service トポロジーを有効化。
service.openyurt.io/nodepool-labelselector: key1=val1 # ENS ノードプールを選択。
spec:
ports:
- name: nginx-80
port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx
type: LoadBalancer
loadBalancerClass: alibabacloud.com/elb
externalTrafficPolicy: Local
ノードラベルによるバックエンドサーバーの追加
| アノテーションサフィックス | 説明 | デフォルト |
|---|---|---|
alibaba-cloud-loadbalancer-backend-label |
バックエンドサーバーとして追加するノードのラベル。複数のラベルは AND 論理で、カンマで区切ります(例:k1=v1,k2=v2)。 |
該当なし |
特定のエッジノードをバックエンドサーバープールから除外するには、そのノードにラベル node.kubernetes.io/exclude-from-external-load-balancers=true を追加します。
例:
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
バックエンドサーバーの重み設定
リスナーが重み付きラウンドロビン(WRR)アルゴリズムを使用する場合、リクエストはバックエンドサーバーの重みに基づいて分散されます。
| アノテーションサフィックス | 説明 | デフォルト |
|---|---|---|
alibaba-cloud-loadbalancer-backend-weight |
base=<weight>,<nodeName>=<weight> 形式での重み割り当て。base はすべてのバックエンドサーバーのデフォルト重みを設定します。個別のノードオーバーライドはカンマで区切ります。 |
base=100 |
例 — デフォルト重みを 50 に設定し、node1 を 80、node2 を 90 にオーバーライドします。
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
リスナー
EdgeControllerManager (ECM) は、spec.ports に基づいて自動的にリスナーを作成します。バックエンドポートはクラスターによって割り当てられます。特定のバックエンドポートを固定するには、nodePort を明示的に設定します。
spec:
ports:
- name: nginx-80
port: 80
protocol: TCP
nodePort: 30080
targetPort: 80
スケジューリングアルゴリズムの設定
| アノテーションサフィックス | 説明 | デフォルト |
|---|---|---|
alibaba-cloud-loadbalancer-scheduler |
ロードバランシングアルゴリズム。 | rr |
サポートされているアルゴリズム:
| 値 | アルゴリズム | 動作 |
|---|---|---|
rr |
ラウンドロビン | リクエストをすべてのバックエンドサーバーに均等に分散します。 |
wrr |
重み付きラウンドロビン | 重みの高いバックエンドサーバーほど多くのリクエストを受信します。 |
wlc |
重み付き最小接続 | 重みと現在の接続数に基づいてリクエストを分散します。 |
sch |
ソース IP 一貫ハッシュ | 同じソース IP からのリクエストを同じバックエンドサーバーにルーティングします。 |
qch |
QUIC ID 一貫ハッシュ | 同じ QUIC ID を持つリクエストを同じバックエンドサーバーにルーティングします。 |
iqch |
iQUIC CID 一貫ハッシュ | iQUIC CID の 2、3、4 バイト目が同じリクエストを同じバックエンドサーバーにルーティングします。 |
例:
annotations:
openyurt.io/topologyKeys: openyurt.io/nodepool
service.openyurt.io/nodepool-labelselector: key1=val1
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-scheduler: wrr
セッション維持の構成(TCP リスナー)
| アノテーションサフィックス | 説明 | デフォルト |
|---|---|---|
alibaba-cloud-loadbalancer-persistence-timeout |
セッション維持の持続時間(秒)。有効範囲:0~3600。0 を設定すると無効になります。ELB インスタンスに複数の TCP リスナーがある場合、この設定はすべてのリスナーに適用されます。 |
0 |
接続タイムアウトの構成(TCP リスナー)
| アノテーションサフィックス | 説明 | デフォルト |
|---|---|---|
alibaba-cloud-loadbalancer-established-timeout |
TCP 接続タイムアウト(秒)。有効範囲:10~900。 | 500 |
例:
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"
ヘルスチェックの構成
| アノテーションサフィックス | 説明 | デフォルト |
|---|---|---|
alibaba-cloud-loadbalancer-healthy-threshold |
バックエンドサーバーを正常とマークするために必要な連続したヘルスチェック成功回数。有効範囲:2~10。 | 3 |
alibaba-cloud-loadbalancer-unhealthy-threshold |
バックエンドサーバーを異常とマークするために必要な連続したヘルスチェック失敗回数。有効範囲:2~10。 | 3 |
alibaba-cloud-loadbalancer-check-interval |
ヘルスチェック間隔(秒)。有効範囲:2~10。 | 2 |
alibaba-cloud-loadbalancer-health-check-connect-timeout |
ヘルスチェック応答タイムアウト(秒)。バックエンドサーバーがこの期間内に応答しない場合、チェックは失敗とマークされます。有効範囲:1~300。 | 5 |
例:
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-check-interval: "2"
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-connect-timeout: "5"
高度な構成
既存の ELB インスタンスの使用
既存の ELB インスタンスを Service にアタッチするには、ネットワーク ID と ELB インスタンス ID を指定します。
-
managed-by-userアノテーションを付けて Service を適用します。apiVersion: v1 kind: Service metadata: name: nginx namespace: default annotations: openyurt.io/topologyKeys: openyurt.io/nodepool # サービスのトポロジーを有効化します。 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 -
対象ノードプール(ENS VPC)に対応する PoolService を見つけ、ELB インスタンス ID をアノテーションとして追加します。
kubectl annotate ps {<SERVICENAME>-NodePoolID} service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id=<lb_ID><SERVICENAME>はノードプール(ENS VPC)の PoolService 名に、<lb_ID>は ELB インスタンス ID に置き換えてください。
複数の Service 間で 1 つの ELB インスタンスを共有
複数の Service で 1 つの ELB インスタンスを共有する場合、以下のすべての条件を満たす必要があります。
-
externalTrafficPolicyをクラスターモード(デフォルト)に設定します。 -
ユーザー管理の ELB インスタンスを使用し、
managed-by-userアノテーションで指定します。 -
EIP 経由でインターネットアクセスが必要な場合は、EIP を手動で作成および管理します。
-
service.openyurt.io/elb-force-override-listeners: "true"を設定して、リスナーを強制的に上書きします。
例:
apiVersion: v1
kind: Service
metadata:
name: nginx
namespace: default
annotations:
openyurt.io/topologyKeys: openyurt.io/nodepool # Service トポロジーを有効化。
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