Terway Trunk ENI を使用して、Pod ごとに静的 IP、vSwitch、またはセキュリティグループを割り当て、ネットワーク分離を実現します。
背景情報
ACK は、Pod 単位でネットワーク設定を行うための ENI ベースのソリューションを提供しています。2 つの ENI モードが利用できます。
-
専用 ENI モード:各 Pod が専用の ENI にバインドされ、独立したネットワークリソースを持ちます。高い分離性を実現しますが、ENI クォータの消費量が多くなります。高性能で分離性の高いアプリケーションに適しています。
このモードを使用するには、ノードプールの作成時に[専用 ENI ネットワークモード]を設定します。
-
Trunk ENI モード:ノード上の Trunk ENI が、複数の Pod に対して補助 ENI を動的に提供します。ノードあたりの Pod デプロイ密度が向上し、大規模なカスタムネットワーク設定に適しています。
まず、クラスターで Trunk ENI 機能を有効にします。その後、terway-controlplane コンポーネントが自動的にデプロイされ、カスタムネットワーク設定のライフサイクル管理とポリシーを配信します。アーキテクチャ:
Trunk ENI モードは、カスタムネットワーク設定もサポートしており、重要な Pod に対してオンデマンドで専用 vSwitch、セキュリティグループ、静的 IP を割り当てることができます。一方、他の Pod はデフォルトの共有設定を使用します。
制限事項
-
ACK 専用クラスターを使用している場合は、クォータセンターにアクセスして、
Container network supports Terway ENI Trunking modeという名前のクォータを申請してください。 -
各ノードには Pod ホスティング制限があります。詳細については、「Terway ネットワークプラグインの使用」をご参照ください。
-
セキュリティグループルールは、ノード内の Pod 間トラフィックや Pod からホストへのトラフィックには適用されません。これらのシナリオでは NetworkPolicy を使用してください。
-
Terway のバージョン要件:
Terway をアップグレードするには、「アドオン」をご参照ください。
-
Trunk ENI モード:Terway v1.3.0 以降
-
専用 ENI モード:Terway v1.11.0 以降
-
-
この機能は ECS インスタンスでのみサポートされています。
データパス
次の図は、Trunk ENI モードと専用 ENI モードのデータパスの違いを示しています。
専用 Pod 設定の適用範囲
専用 Pod 設定を使用すると、各 Pod は独自の vSwitch とセキュリティグループを持つ専用 ENI を取得します。
専用 Pod 設定をサポートする 2 つのノード設定モードがあります。
|
Trunk ENI をサポートするノード |
Elastic Network Interface をサポートするノード (「ノードプールに専用 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 専用クラスターの作成 (廃止)」および「ACK マネージドクラスターの作成」をご参照ください。
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 -n kube-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 -n kube-system eni-config -
eni_conf キーの下にあるパラメータを編集します。
パラメータ
値
説明
enable_eni_trunking
true
Trunk ENI を有効にします。一度有効にすると無効にできません。
credential_path
/var/addon/token-config
ACK マネージドクラスターの場合、このパラメータが存在しない場合は追加してください。
重要-
他のパラメータは変更しないでください。
-
eni-config
ConfigMapの内容は、有効な JSON 形式である必要があります。
設定例:
apiVersion: v1 data: eni_conf: | { "min_pool_size": 0, "enable_eni_trunking": true, "credential_path": "/var/addon/token-config", ... } kind: ConfigMap -
-
Terway 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の場合、このポリシーは固定名を持つ Pod (デフォルトでは、StatefulSet およびownerReferencesがない Pod) に適用されます。カスタムワークロードの場合は、[アドオン] ページで terway-controlplane を設定してください。説明静的 IP ポリシーを使用すると、再作成された Pod は元の Pod と同じゾーンに制約されます。
releaseStrategy
typeがFixedの場合にのみ有効です。有効な値:-
TTL: 遅延リリース。Pod 削除後、指定された時間が経過した後に IP が解放されます。最小値: 5 分。 -
Never: IP アドレスは自動的に解放されません。不要になったら、PodENI リソースを手動で削除してください。
releaseAfter
遅延リリース時間。
releaseStrategyがTTLの場合にのみ有効で、Go の時間型形式でhやmなどの単位 (2h45mや5m0sなど) を使用します。selector
(ラベルセレクター。一致した Pod がこのネットワーク設定を使用します。)
podSelector
-
Pod のラベルと照合します。一致した Pod がこのネットワーク設定を使用します。
-
podSelectorとnamespaceSelectorの両方が設定されている場合、すべてのルールに一致する Pod がこの設定を使用します。 -
一意の一致を確保してください。Pod が複数の PodNetworking 設定に一致する場合、いずれか 1 つが任意に適用されます。
namespaceSelector
-
名前空間のラベルと照合します。一致した名前空間内の Pod がこの設定を使用します。
-
podSelectorとnamespaceSelectorの両方が設定されている場合、すべてのルールに一致する Pod がこの設定を使用します。 -
一意の一致を確保してください。複数の一致がある場合、いずれかが任意に選択されます。
vSwitchOptions
-
-
Pod 用の vSwitch。複数の ID が指定されている場合、Terway は条件を満たすものを 1 つ選択します。
-
Pod は、指定された vSwitch と同じゾーンに制約されます。
-
vSwitch のゾーンは、ターゲットノードのゾーンと一致する必要があり、十分な空き IP アドレスが必要です。そうでない場合、Pod の作成は失敗します。
説明オートスケーリングが有効になっている場合、vSwitchOptions ゾーンの制約により、ノードプールのスケールアウトが妨げられる可能性があります。詳細については、「オートスケーリング FAQ」をご参照ください。
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
有効な値:
-
Default: 共有 ENI クラスターの場合は Trunk ENI、専用 ENI クラスターの場合は専用 ENI。 -
ENI: 専用 ENI を使用します。 -
Trunk: Trunk ENI を使用します。
説明Terway v1.11.0 以降でサポートされています。
-
-
作成する をクリックします。
PodNetworking は、その
statusがReadyになって初めて有効になります。リソースのステータスが
readyかどうかを確認します。kubectl describe PodNetworking example # example をカスタムリソースの名前に置き換えてください。
(オプション) ステップ 3: 名前空間に一致するラベルを追加する
ラベルマッチングによって PodNetworking ルールを適用するには、対応するラベルをターゲット名前空間に追加します。
-
example という名前のテスト名前空間を作成します。
kubectl create ns example -
foo=barラベルを名前空間に追加します。kubectl label namespaces example foo=bar # example をターゲット名前空間の名前に置き換えてください。 -
名前空間のラベルを表示します。
kubectl get namespace example --show-labels # example をターゲット名前空間の名前に置き換えてください。出力例:
NAME STATUS AGE LABELS example Active 24s foo=bar,kubernetes.io/metadata.name=example
(オプション) ステップ 4: アプリケーション Pod を作成する
Pod が作成されると、システムはそのラベルを PodNetworking リソースと照合します。一致した Pod には、一致した設定に従って ENI が割り当てられます。一致しない Pod は、デフォルトの ENI を使用します。
Terway は、一致した各 Pod のネットワークリソースを追跡するために、PodENI カスタムリソースを作成します。詳細については、「ラベルとセレクター」をご参照ください。
-
my-nginx.yaml という名前のファイルを作成し、次の YAML コンテンツを記述します。
apiVersion: apps/v1 kind: StatefulSet metadata: name: my-nginx # サンプルアプリケーションの名前。 namespace: example # 名前空間を 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: 1Gi -
my-nginx サンプルアプリケーションをデプロイします。デプロイ後、ネットワーク設定を確認するには、「PodNetworking の使用状況の確認」をご参照ください。
kubectl apply -f my-nginx.yaml
移行のために terway-controlplane を停止する
カスタム Pod 設定がされている ACK 専用クラスターは、ACK マネージド Pro 版クラスターに直接移行できません。移行前に terway-controlplane を停止し、移行後に再度有効にしてください。
-
移行の準備をします。
-
terway-controlplane を停止します。
kubectl scale deploy -n kube-system terway-controlplane --replicas 0 -
Webhook を設定します。
# 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 -n kube-system terway-controlplane -oyaml > terway-controlplane.service.yaml # 元のサービス設定を削除します。 kubectl delete -f terway-controlplane.service.yaml
-
-
移行後、結果を確認します。
説明詳細については、「ACK 専用クラスターから ACK マネージド 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 -n kube-system terway-controlplane --replicas 1 -
移行が成功した場合は、リソースを削除します。
kubectl delete deploy -n kube-system terway-controlplane
-
-
アドオン管理 ページから terway-controlplane をインストールします。詳細については、「アドオンの管理」をご参照ください。
よくある質問
PodNetworking の使用状況の確認
-
作成後、ポッドの
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: elastic -
Terway は、Pod と同じ名前/名前空間の PodENI リソースを作成し、そのネットワーク設定を記録します。
kubectl get podenis.network.alibabacloud.com <my-nginx-0> -n <example> -o yaml # <my-nginx-0> を Pod 名に、<example> を Pod の名前空間に置き換えてください。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 ポリシーは、固定名を持つ Pod (デフォルトでは、StatefulSet および ownerReferences がない Pod) に適用されます。
関連ドキュメント
-
柔軟な Pod ファイアウォールポリシーについては、「ENI に複数のセキュリティグループを設定する」をご参照ください。
-
コンテナネットワークの問題については、「コンテナネットワーク FAQ」をご参照ください。