サービスの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インスタンスがサービスを公開するモード:
| インターネット |
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情報:
| なし |
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 | バックエンドサーバーとして追加するワーカーノードのラベルを指定します。 複数のラベルはコンマ (,) で区切ります (例: | 非該当 |
バックエンドサーバーを追加するときにエッジノードを除外するには、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=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 | リスナーは、次のスケジューリングアルゴリズムをサポートします。
| 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 | バックエンドサーバーのステータスが失敗 (利用不可) から成功 (利用可能) に変わるまでに、バックエンドサーバーが連続してヘルスチェックに合格する必要がある回数。 有効な値: 2〜10。 | 3 |
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-unhealthy-threshold | バックエンドサーバーのステータスが成功 (利用可能) から失敗 (利用不可) に変わるまでに、バックエンドサーバーが連続してヘルスチェックに失敗する必要がある回数。 有効な値: 2〜10。 | 3 |
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-check-interval | 連続した 2 回のヘルスチェックの時間間隔を設定します 有効な値: 2〜10。 単位は秒です。 | 2 |
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-connect-timeout | ヘルスチェック応答のタイムアウト期間。 バックエンドサーバーが指定されたタイムアウト期間内に応答しない場合、サーバーはヘルスチェックに合格しません。 有効な値: 1〜300。 単位は秒です。 | 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の高度な設定について説明します。
さまざまなシナリオでサービスを作成します。
既存の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
ノードプール (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に置き換えます。