Terway Trunk ENI を使用して、Pod ごとに静적 IP、専用 vSwitch、またはセキュリティグループを割り当てることで、きめ細かなトラフィック管理、トラフィック分離、ネットワークポリシー設定、および IP 管理を実現します。
背景情報
Container Service for Kubernetes (ACK) は、Pod ごとのネットワーク設定用の ENI ベースのソリューションを提供します。利用可能な ENI モードは 2 つあります。
Exclusive ENI モード:各 Pod は、専用のネットワークリソースを持つ専用の ENI にバインドされます。強力な分離を提供しますが、より多くの ENI クォータを消費します。高性能で、分離が重視されるアプリケーションに適しています。
このモードを使用するには、ノードプールを作成する際に Exclusive ENI モードを設定します。
Trunk ENI モード:ノード上の Trunk ENI は、複数の Pod に動的に補助 ENI を提供します。ノードごとの Pod 密度を向上させ、大規模なカスタムネットワーク設定に適しています。
まず、クラスターで Trunk ENI 機能を有効にする必要があります。その後、terway-controlplane アドオンが自動的にデプロイされ、カスタムネットワーク設定のライフサイクル管理とポリシーが配信されます。アーキテクチャは次のとおりです。
Trunk ENI モードはカスタムネットワーク設定もサポートしており、重要な Pod にはオンデマンドで専用 vSwitch、セキュリティグループ、静的 IP を割り当て、他の Pod はデフォルトの共有設定を使用します。
制限事項
ACK 専用クラスターを使用する場合、[Quota センター]に移動して、
Container network supports Terway ENI Trunking modeという名前のクォータを申請してください。各ノードに配置可能な Pod 数には制限があります。詳細については、「Terway ネットワークプラグインの使用」をご参照ください。
セキュリティグループのルールは、ノード内の Pod 間のトラフィックや Pod からホストへのトラフィックには適用されません。これらのシナリオでは、NetworkPolicy を使用してください。
Terway のバージョン要件:
Terway をアップグレードするには、アドオンをご参照ください。
Trunk ENI モード:Terway v1.3.0 以降
Exclusive ENI モード:Terway v1.11.0 以降
この機能は Elastic Compute Service (ECS) インスタンスのみをサポートします。
ACS クラスターは、PodNetworking の vSwitch とセキュリティグループの割り当て機能のみをサポートします。静的 IP や Elastic Network Interface (ENI) の選択など、その他の機能は ACS クラスターではサポートされていません。この機能は acs-virtual-node によって提供され、Terway からは独立しています。クラスターに PodNetworking CRD の定義がない場合は、ダウンロードしてクラスターにインストールしてください。
データパス
次の図は、Trunk ENI モードと Exclusive ENI モードのデータパスの違いを示しています。
Pod 専用設定の適用範囲
Pod 専用設定では、各 Pod に独自の vSwitch とセキュリティグループを持つ専用の ENI が割り当てられます。
Pod 専用設定をサポートするノード設定モードは 2 つあります。
Trunk ENI をサポートするノード | Elastic Network Interface (ENI) をサポートするノード (「ノードプールに Exclusive ENI モードを設定」をご参照ください) | |
サポートされるクラスタータイプ | ACK マネージド型クラスター | ACK マネージド型クラスター、ACK 専用クラスター |
デプロイ密度 | 通常の Pod は ENI を共有し、特定の Pod は専用の ENI を使用します。全体的な密度は高くなります。 | すべての Pod が専用の ENI を使用します。密度は低くなります。 |
サポートされるノードタイプ | ECS ノード | ECS ノード |
インスタンスタイプ | Trunk ENI をサポートし、 | ENI をサポートするインスタンスタイプ。 |
ユースケース | コスト重視かつ低コンカレンシーのサービス。 | 高性能、低レイテンシー、高コンカレンシーのサービス。 |
Kubernetes リソースの制限 |
| |
手順1:クラスターでの Trunk ENI 機能の有効化
新規クラスター
ACK クラスターを作成する際に、[ネットワークプラグイン]を Terway に設定し、Terway モード セクション (ネットワークプラグインタイプ:terway-eniip) で [Trunk ENI のサポート]を選択します。詳細については、「ACK dedicated クラスターの作成 (提供終了)」および「ACK managed クラスターの作成」をご参照ください。
Kubernetes 1.31 以降、新規の ACK マネージドクラスターでは Trunk ENI がデフォルトで有効になり、追加の設定は必要ありません。
一度有効にすると、Trunk ENI は変更できません。
既存クラスター
前提条件
既存のクラスターで terway-eniip ネットワークプラグインが使用されている必要があります。詳細については、「Terway ネットワークプラグインの使用」をご参照ください。
クラスターの アドオン管理 ページでネットワークプラグインを確認してください。
制限事項
2020 年 6 月より前に作成されたACK マネージドクラスターは、この機能をサポートしていない可能性があります。ステップ 1 に従って互換性を確認してください。
一度有効にすると、静的 IP、専用 vSwitch、およびセキュリティグループ機能は無効にできません。
手順1:Trunk ENI のサポート状況の確認
ACK 専用クラスターでは、Trunk ENI をサポートする ECS インスタンスを使用するための権限を申請する必要があります。申請するには、チケットを起票してください。
既存の ACK マネージドクラスター または ACK 専用クラスター から移行された ACK マネージドクラスター の場合、Trunk ENI のサポート状況を確認して設定を変更します。 ECS インスタンスの権限は不要です。
トークン設定を確認します。
kubectl get secret -nkube-system addon.network.token設定が存在する場合の期待される出力:
NAME TYPE DATA AGE
addon.network.token Opaque 1 69mトークン設定が存在する場合は、次の手順に進みます。存在しない場合は、Trunk ENI をサポートする新しいクラスターを作成してください。
手順2:terway-eniip と Trunk ENI の有効化
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、 を選択します。
アドオン管理 ページで ネットワーク タブをクリックし、terway-eniip アドオンを見つけます。
terway-eniip カードで アップグレード をクリックし、terway-eniip アドオンを最新バージョンに更新します。
アップグレード ボタンが表示されない場合、アドオンはすでに最新です。この手順はスキップしてください。
terway-eniip を有効にします。
eni-config ConfigMap を編集します。
kubectl edit cm -nkube-system eni-configYAML ファイル内の
eni-configパラメーターを編集します。パラメーター
値
説明
enable_eni_trunking
true
Trunk ENI を有効にします。一度有効にすると無効にできません。
credential_path
/var/addon/token-config
ACK マネージドクラスターでは、このパラメーターがまだ存在しない場合、追加します。
重要他のパラメーターは変更しないでください。
eni-configConfigMap の内容は、有効な JSON 形式である必要があります。
設定例:
apiVersion: v1 data: eni_conf: | { "min_pool_size": 0, "enable_eni_trunking": true, "credential_path": "/var/addon/token-config", ... } kind: ConfigMapTerway Pod を再起動して設定を適用します。
kubectl delete pod -n kube-system -l app=terway-eniip
terway-eniip パラメーターを設定した後、アドオン管理 ページの ネットワーク タブに移動し、terway-controlplane アドオンをインストールします。
インストール後、terway-controlplane カードに インストール済み と表示されます。
手順2:PodNetworking カスタムリソースの作成
Terway は PodNetworking カスタムリソース (CR) を使用してネットワーク設定を定義します。複数の PodNetworking オブジェクトを作成して、異なるネットワークプレーンを定義します。
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
クラスターリスト ページで対象クラスターの名前をクリックし、左側メニューで の順に選択します。
カスタムリソース ページで、CRD タブをクリックし、YAML のリソースの作成 をクリックします。
PodNetworking YAML の例:
apiVersion: network.alibabacloud.com/v1beta1 kind: PodNetworking metadata: name: example spec: allocationType: type: Fixed # Pod の IP アドレス割り当てポリシー。有効な値:Elastic、Fixed。 releaseStrategy: TTL # type が Fixed の場合のみ有効。type が Elastic の場合、releaseStrategy と releaseAfter は不要。 releaseAfter: "1h" # releaseStrategy が TTL の場合のみ有効。 selector: podSelector: matchLabels: foo: bar namespaceSelector: matchLabels: foo: bar securityGroupIDs: - sg-bpxxxx vSwitchOptions: - vsw-bpxxxx eniOptions: eniType: Defaultパラメーターの説明:
パラメーター
説明
allocationType
(Pod の IP アドレス割り当てポリシー)
type
有効な値は次のとおりです。
Elastic:Pod が削除された後に IP リソースが解放されます。
Fixed:静的 IP アドレスポリシー。
typeがFixedの場合、これは固定の名前を持つポッド (デフォルトでは StatefulSet および ownerReference のないポッド) に適用されます。カスタムワークロードの場合、アドオンページで terway-controlplane を設定します。説明静的 IP ポリシーを使用すると、再作成された Pod は元の Pod と同じゾーンに制約されます。
releaseStrategy
typeがFixedの場合にのみ有効です。有効な値:TTL:遅延解放。Pod の削除後、指定した時間が経過すると IP が解放されます。最小:5 分。Never: IP アドレスは解放されません。不要になったら、PodENI リソースを手動で削除します。
releaseAfter
遅延リリース時間。
releaseStrategyがTTLの場合にのみ有効です。 Go time 型 形式を使用します。値はhおよびmの単位を使用し、2h45mや5m0sのように指定します。selector
(ラベルセレクター。一致した Pod はこのネットワーク設定を使用します。)
podSelector
Pod のラベルと照合します。一致した Pod はこのネットワーク設定を使用します。
podSelectorとnamespaceSelectorの両方が設定されている場合、すべてのルールに一致するポッドがこの設定を使用します。一意に一致するようにしてください。Pod が複数の PodNetworking 設定に一致する場合、いずれか 1 つが任意に適用されます。
namespaceSelector
Namespace を照合するラベル。一致した Namespace 内の Pod がこの設定を使用します。
podSelectorとnamespaceSelectorの両方が設定されている場合、すべてのルールに一致するポッドはこの設定を使用します。一意に一致するようにしてください。複数の一致がある場合、いずれか 1 つが任意に選択されます。
vSwitchOptions
-
Pod 用の vSwitch です。指定された vSwitch ID は OR 関係にあります。各 Pod は 1 つの vSwitch のみを使用し、Terway は条件を満たすものを選択します。
Pod は、指定された vSwitch と同じゾーンに制約されます。
vSwitch のゾーンはターゲットノードのゾーンと一致する必要があり、十分な IP アドレスが利用可能である必要があります。そうでなければ、Pod の作成は失敗します。
説明自動スケーリングが有効な場合、vSwitchOptions のゾーン制約により、ノードプールのスケールアウトが妨げられる可能性があります。詳細については、「自動スケーリングに関するよくある質問」をご参照ください。
vSwitchSelectOptions
(vSwitch 選択ポリシーを設定します)
vSwitchSelectionPolicy
有効な値は次のとおりです。
ordered(デフォルト): 入力された順序で選択します。most: 利用可能な IP アドレスが最も多い vSwitch を優先します。random: vSwitch をランダムに選択します。
説明Terway v1.11.0 以降でサポートされています。
securityGroupIDs
-
複数のセキュリティグループ ID をサポートします (すべてが有効になります)。最大 10 個です。
説明Terway v1.13.6 以降は、最大 10 個のセキュリティグループをサポートします。
eniOptions
(Pod が使用する ENI タイプを設定します)
eniType
有効な値は次のとおりです。
デフォルト: 共有 ENI クラスターでは Trunk ENI、専用 ENI クラスターでは専用 ENI。ENI:専用 ENI を使用します。Trunk:Trunk ENI を使用します。
説明Terway v1.11.0 以降でサポートされています。
作成する をクリックします。
PodNetworking リソースを作成すると、Terway はネットワーク設定を同期します。PodNetworking は、そのステータスが Ready になった後に有効化されます。
statusがReadyになります。リソースのステータスが
readyであるかどうかを確認します:kubectl describe PodNetworking example # example をカスタムリソースの名前に置き換えます。
(オプション) 手順3:Namespace への一致するラベルの追加
ラベル照合によって PodNetworking ルールを適用するには、対応するラベルをターゲットの Namespace に追加します。
example という名前のテスト Namespace を作成します。
kubectl create ns exampleネームスペースに
foo=barラベルを追加します:kubectl label namespaces example foo=bar # example をターゲットの Namespace 名に置き換えます。Namespace のラベルを表示します。
kubectl get namespace example --show-labels # example をターゲットの Namespace 名に置き換えます。期待される出力:
NAME STATUS AGE LABELS example Active 24s foo=bar,kubernetes.io/metadata.name=example
(オプション) 手順4:アプリケーション Pod の作成
Pod が作成されると、システムはそのラベルを PodNetworking リソースと照合します。一致した Pod には、一致した設定に従って ENI が割り当てられます。一致しない Pod は、デフォルトの ENI を使用します。
Terway は、一致した各ポッドのネットワークリソースを追跡するために PodENI カスタムリソースを作成します。詳細については、「ラベルとセレクター」をご参照ください。
次の YAML コンテンツで my-nginx.yaml という名前のファイルを作成します。
apiVersion: apps/v1 kind: StatefulSet metadata: name: my-nginx # サンプルアプリケーションの名前。 namespace: example # Namespace を example に指定します。 labels: app: nginx spec: serviceName: "nginx-service" replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx foo: bar # Pod に foo:bar ラベルを追加します。 spec: containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 ports: - containerPort: 80 # StatefulSet が永続ストレージを必要とする場合は、volumeClaimTemplates を定義する必要があります。 # 例: # volumeClaimTemplates: # - metadata: # name: nginx-storage # spec: # accessModes: ["ReadWriteOnce"] # storageClassName: "my-storage-class" # resources: # requests: # storage: 1Gimy-nginx サンプルアプリケーションをデプロイします。デプロイ後、「PodNetworking の使用状況の確認」を参照してネットワーク設定を確認します。
kubectl apply -f my-nginx.yaml
移行のための terway-controlplane の停止
カスタム Pod 設定の ACK 専用クラスターは、ACK マネージド型 Pro クラスターに直接移行することはできません。移行前に terway-controlplane を停止し、移行後に再度有効化します。
移行の準備をします。
terway-controlplane を停止します。
kubectl scale deploy -nkube-system terway-controlplane --replicas 0Webhook の設定を変更します。
# Webhook 設定をバックアップします。 kubectl get mutatingwebhookconfigurations.admissionregistration.k8s.io terway-controlplane -oyaml > terway-controlplane.mutatingwebhookconfigurations.yaml kubectl get validatingwebhookconfigurations.admissionregistration.k8s.io terway-controlplane -oyaml > terway-controlplane.validatingwebhookconfigurations.yaml # Webhook 設定をクリーンアップします。 kubectl delete -f terway-controlplane.mutatingwebhookconfigurations.yaml kubectl delete -f terway-controlplane.validatingwebhookconfigurations.yamlサービスの設定を変更します。
# サービス設定をバックアップします。 kubectl get service -nkube-system terway-controlplane -oyaml > terway-controlplane.service.yaml # サービス設定をクリーンアップします。 kubectl delete -f terway-controlplane.service.yaml
移行後、結果を確認します。
説明詳細については、「ACK dedicated クラスターから ACK managed Pro クラスターへのホットマイグレーション」をご参照ください。
移行に失敗した場合は、Webhook と terway-controlplane を復元します。
# サービス設定を復元します。 kubectl apply -f terway-controlplane.service.yaml # Webhook 設定を復元します。 kubectl apply -f terway-controlplane.mutatingwebhookconfigurations.yaml kubectl apply -f terway-controlplane.validatingwebhookconfigurations.yaml # terway-controlplane を復元します。 kubectl scale deploy -nkube-system terway-controlplane --replicas 1移行に成功した場合は、リソースをクリーンアップします。
kubectl delete deploy -nkube-system terway-controlplane
アドオン管理 ページから terway-controlplane をインストールします。詳細については、「アドオンの管理」をご参照ください。
よくある質問
PodNetworking の使用状況の確認
作成後、 Pod の
annotationsには、PodNetworking の使用を示すk8s.aliyun.com/pod-networkingが含まれます。apiVersion: v1 kind: Pod metadata: annotations: k8s.aliyun.com/pod-eni: "true" k8s.aliyun.com/pod-networking: podnetworking labels: app: example pod-ip: elasticTerway は、そのネットワーク設定を記録するために PodENI リソース (Pod と同じ名前/Namespace) を作成します。
kubectl get podenis.network.alibabacloud.com <my-nginx-0> -n <example> -o yaml # <my-nginx-0> を Pod 名に、<example> を Pod の Namespace に置き換えます。PodNetworking が使用中であることを示す期待される出力:
apiVersion: network.alibabacloud.com/v1beta1 kind: PodENI metadata: finalizers: - pod-eni generation: 1 name: <my-nginx-0> namespace: default spec: allocations: - allocationType: type: Elastic eni: id: eni-bp1xxxx mac: 00:16:xx:xx:xx:xx securityGroupIDs: - sg-bp1xxxx vSwitchID: vsw-bp1xxxx zone: cn-hangzhou-h ipv4: 192.168.x.x ipv4CIDR: 192.168.x.x/19 ipv6: 2408:x:x:x:x:x:x:x ipv6CIDR: 2408:x:x:x::/64 zone: cn-hangzhou-h status: eniInfos: eni-bp1xxxx: id: eni-bp1xxxx status: Bind vid: 1001 instanceID: i-bp1xxxx phase: Bind podLastSeen: "2021-xx-xxT00:00:00Z" trunkENIID: eni-bp1xxxx
Pod が PodNetworking 設定を使用しない場合
PodNetworking のステータスが
Readyであることを確認します。Pod のラベルが PodNetworking のセレクターと一意に一致することを確認します。
静的 IP ポリシーは、StatefulSet で管理される Pod にのみ適用されます。
関連ドキュメント
柔軟な Pod ファイアウォールポリシーについては、「ENI への複数のセキュリティグループの設定」をご参照ください。
コンテナネットワークの問題については、「コンテナネットワークに関するよくある質問」をご参照ください。