デフォルトでは、ノード上のすべての Pod がそのノードのセキュリティグループと IP アドレスプールを共有します。これにより、Pod レベルでの細かいネットワーク分離が不可能となり、ノード上の任意の Pod が同一のリソースにアクセスできるようになります。Terway の Trunk ENI 機能は、各 Pod に専用の ENI、vSwitch、およびセキュリティグループを割り当てることでこの課題を解決します。同時に、同一ノード上の他の Pod のデプロイ密度を低下させることはありません。
以下の手順では、Terway Trunk ENI 機能を有効化し、PodNetworking カスタムリソース定義 (CRD) を使用して Pod 単位のネットワーク分離を構成する方法について説明します。
仕組み
Trunk ENI 機能を有効化すると、クラスター内に terway-controlplane コンポーネントがデプロイされます。Pod が作成されると、Terway はそのラベルを PodNetworking CRD と照合します。一致が見つかった場合、Terway は該当する PodNetworking で定義された vSwitch およびセキュリティグループから、Pod に専用の ENI を割り当てます。PodNetworking と一致しない Pod は、共有 ENI から IP アドレスを使用し続けます。
ノードの構成モード
Pod 単位のネットワーク分離をサポートするノードモードには、2 種類あります。クラスタータイプおよびデプロイ密度の要件に応じて選択してください。
| Trunk ENI をサポートするノード | ENI をサポートするノード | |
|---|---|---|
| サポートされるクラスタータイプ | ACK マネージドクラスター | ACK マネージドクラスターおよび ACK 専用クラスター |
| デプロイ密度 | 通常の Pod は共有 ENI を使用し、指定された Pod は排他的な ENI を使用 — 全体的な密度が高くなります | すべての Pod が排他的な ENI を使用 — 密度が低くなります |
| サポートされるノードタイプ | ECS ノード | ECS ノード |
| インスタンスタイプ | インスタンスの EniTrunkSupported=trueDescribeInstanceTypes が有効になっているもの( をご参照ください) | ENI をサポートするインスタンス |
制限事項
ACK 専用クラスター:作業を進める前に、クォータセンターコンソールで
Container network supports Terway ENI Trunking modeクォータを申請してください。ノードあたりの Pod 数: ノードあたりの Pod 数には上限があります。詳細については、「Terway の使用」をご参照ください。
同一ノード間のトラフィック: Pod のセキュリティグループルールは、同一ノード上の Pod 間、または Pod とそのホストノード間のトラフィックには適用されません。これらのシナリオで分離を強制するには、ネットワークポリシーを構成してください。
2020 年 6 月以前に作成された ACK マネージドクラスター: この機能はサポートされていない場合があります。確認には、「ステップ 1:クラスターが Terway Trunk ENI 機能をサポートしているか確認する」に従ってください。
不可逆性: 静的 IP アドレス、vSwitch、およびセキュリティグループは、一度有効化すると無効化できません。
前提条件
開始する前に、以下を確認してください。
terway-eniipネットワークプラグインがインストール済みの ACK マネージドクラスターまたは ACK 専用クラスター(ACK 専用クラスターのみ)Trunk ENI の ECS インスタンス権限を申請するためのチケット送信済み
Trunk ENI をサポートするインスタンスタイプ(
EniTrunkSupported=true)のノード(Trunk ENI ノードモードを使用する場合)Pod に割り当てる予定の vSwitch に十分な利用可能な IP アドレスがあること
ステップ 1:Terway Trunk ENI 機能を有効化する
新規クラスターで Trunk ENI を有効化する
ACK クラスターを作成する際、ネットワークプラグイン を Terway に、Terway モード を ENI Trunking のサポート に設定します。このモードでのネットワークプラグインの種類は terway-eniip です。手順については、「ACK 専用クラスターの作成(非推奨)」および「ACK マネージドクラスターの作成」をご参照ください。
Kubernetes 1.31 以降を実行する新規 ACK マネージドクラスターでは、Trunk ENI 機能がデフォルトで有効化されています。
Trunk ENI 機能は、一度有効化すると無効化できません。
既存のクラスターで Trunk ENI を有効化する
ステップ 1:クラスターが Terway Trunk ENI 機能をサポートしているか確認する
ACK 専用クラスターを使用する場合は、このステップをスキップしてください。代わりに、チケットを送信して Trunk ENI の ECS インスタンス権限を申請し、ステップ 2 に進んでください。
既存の ACK マネージドクラスター、または ACK 専用クラスターからアップグレードされた ACK マネージドクラスターの場合は、クラスターが Terway Trunk ENI 機能をサポートしているか確認し、構成を変更する必要があります。Trunk ENI をサポートする ECS インスタンスを使用するための権限申請は不要です。
以下のコマンドを実行して、トークン構成を確認します。
kubectl get secret -nkube-system addon.network.token期待される出力:
NAME TYPE DATA AGE
addon.network.token Opaque 1 69mトークンが存在する場合は、ステップ 2 に進んでください。存在しない場合は、クラスターは Trunk ENI 機能をサポートしていません。代わりに、Trunk ENI が有効化された新規クラスターを作成してください。
ステップ 2:terway-eniip の更新および構成
ACK コンソールにログインします。左側のナビゲーションウィンドウで、クラスター をクリックします。
クラスター名をクリックします。左側のナビゲーションウィンドウで、操作 > アドオン を選択します。
アドオン ページで、ネットワーキング タブをクリックし、terway-eniip を探します。
terway-eniip カードで、最新バージョンへアップグレードするために アップグレード をクリックします。アップグレード ボタンが表示されない場合は、すでに最新バージョンがインストールされています。
Trunk ENI を有効化するために、
eni-configConfigMap を編集します。パラメーター 値 説明 enable_eni_trunkingtrueTrunk ENI 機能を有効化します。有効化後は無効化できません。 credential_path/var/addon/token-configACK マネージドクラスターのみで必須です。存在しない場合は、手動でこのパラメーターを追加してください。 kubectl edit cm -nkube-system eni-configConfigMap 内で以下のパラメーターを設定します。他のパラメーターは変更しないでください。ConfigMap の内容は JSON 形式である必要があります。例としての ConfigMap を以下に示します。
apiVersion: v1 data: eni_conf: | { "min_pool_size": 0, "enable_eni_trunking": true, "credential_path": "/var/addon/token-config", ... } kind: ConfigMap変更を有効化するために Terway ポッドを再起動します。
kubectl delete pod -n kube-system -l app=terway-eniipアドオン ページで、ネットワーキング タブをクリックし、terway-controlplane をインストールします。インストール後、インストール済み が terway-controlplane カードに表示されます。
ステップ 2:PodNetworking を作成する
PodNetworking は、一連の Pod に対してネットワーク構成を定義する Terway のカスタムリソース定義 (CRD) です。構成したいネットワークプレーンごとに 1 つの PodNetworking を作成します。
ACK コンソールにログインし、クラスター をクリックします。
クラスター名をクリックします。左側のナビゲーションウィンドウで、ワークロード > カスタムリソース を選択します。
カスタムリソース ページで、CRD タブをクリックし、YAML からの作成 をクリックします。
以下のテンプレートを貼り付け、環境に合わせてパラメーターを変更します。
パラメーター 説明 allocationType.typeElastic:Pod 削除時に IP が解放されます。Fixed:Pod の再起動時も IP アドレスを保持します。Fixed モードは、固定名を持つ Pod(StatefulSet およびデフォルトでownerReferencesを持たない Pod)にのみ適用されます。カスタムワークロードを構成する必要がある場合は、コンポーネント管理で terway-controlplane を構成してください。Fixed モードを使用する場合、Pod は常に同一ゾーンで再作成されます。releaseStrategytypeがFixedの場合にのみ適用されます。TTL:指定されたreleaseAfterの遅延後に IP を解放(最小 5 分)。Never:IP は自動的に解放されず、IP アドレスを解放するには PodENI を手動で削除する必要があります。releaseAfterreleaseStrategyがTTLの場合にのみ適用されます。Go の期間形式を使用します。例:2h45m、5m0s。podSelectorPod のラベルと照合します。 podSelectorとnamespaceSelectorの両方が設定されている場合、Pod は両方の条件を満たす必要があります。各 Pod は最大で 1 つの PodNetworking と一致しなければならず、複数の PodNetworking と一致する場合は、使用されるネットワーク構成は未定義となります。namespaceSelector名前空間のラベルと照合します。 podSelectorと同じ照合ルールが適用されます。vSwitchOptionsvSwitch のリストです。Terway は Pod ごとに 1 つの vSwitch を選択します。Pod は、リストされた vSwitch と同じゾーン内のノードにのみスケジュールできます。vSwitch に十分な利用可能な IP アドレスがあることを確認してください。利用可能な IP アドレスがない場合、Pod の作成は失敗します。ノードの自動スケーリングが有効な場合、このゾーン制約によりノードプールのスケールアウトが妨げられる可能性があります。 vSwitchSelectOptions.vSwitchSelectionPolicyTerway v1.11.0 以降でサポートされます。 ordered(デフォルト):リストされた順序で vSwitch を使用。most:利用可能な IP アドレス数が最も多い vSwitch を使用。random:ランダムに選択。securityGroupIDs1~5 個のセキュリティグループ ID。指定されたすべてのセキュリティグループが同時に有効になります。 eniOptions.eniTypeTerway v1.11.0 以降でサポートされます。 Default(デフォルト):共有 ENI クラスターでは Trunk ENI モード、排他的 ENI クラスターでは排他的な ENI モード。ENI:排他的な ENI モード。Trunk:Trunk ENI モード。apiVersion: network.alibabacloud.com/v1beta1 kind: PodNetworking metadata: name: example spec: allocationType: type: Fixed # IP 割り当てポリシー:Elastic または Fixed releaseStrategy: TTL # Fixed ポリシーの場合のみ:TTL または Never releaseAfter: "1h" # TTL 戦略の場合のみ:IP 解放前の遅延 selector: podSelector: matchLabels: foo: bar # このラベルを持つ Pod がこの PodNetworking を使用 namespaceSelector: matchLabels: foo: bar # namespaceSelector が設定されている場合、名前空間も一致する必要があります securityGroupIDs: - sg-bpxxxx # 最大 5 個のセキュリティグループ ID;すべて同時に有効 vSwitchOptions: - vsw-bpxxxx # 1 個以上の vSwitch;Terway は Pod ごとに 1 つを選択 status: status: Ready以下の表にパラメーターの説明を示します。
作成 をクリックします。
PodNetworking が準備完了であることを確認する:
kubectl describe PodNetworking example # example をご自身の PodNetworking 名に置き換えてくださいstatus フィールドが Ready と表示されるまで待ちます。PodNetworking は、Ready ステータスになるまで Pod に適用されません。
(任意)ステップ 3:名前空間にラベルを追加する
PodNetworking で namespaceSelector を使用する場合、対象の名前空間に一致するラベルを追加します。
テスト用の名前空間を作成します。
kubectl create ns examplenamespaceSelectorと一致するラベルを追加します。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 をデプロイしてネットワーク構成を検証する
以下の内容で
my-nginx.yamlファイルを作成します。apiVersion: apps/v1 kind: StatefulSet metadata: name: my-nginx # アプリケーション名 namespace: example # 対象名前空間 labels: app: nginx spec: serviceName: "nginx-service" replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx foo: bar # PodNetworking の podSelector と一致させる必要があります 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アプリケーションをデプロイします。
kubectl apply -f my-nginx.yamlPod が PodNetworking 構成を使用していることを確認します。Pod が PodNetworking と一致した場合、Pod に
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 が Pod 用に自動作成した PodENI を確認します。
kubectl get podenis.network.alibabacloud.com <my-nginx-0> -n <example> -o yaml # <my-nginx-0> を Pod 名、<example> を名前空間名に置き換えてください出力結果により、Pod に割り当てられた ENI、vSwitch、セキュリティグループ、および IP アドレスが確認できます。
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
クラスター移行前に terway-controlplane を停止する
ACK 専用クラスターで Pod のカスタム構成を有効化している場合、ワークロードを ACK マネージド Pro クラスターに直接移行することはできません。移行前に terway-controlplane を停止し、移行後に再び有効化してください。
移行前:
terway-controlplaneを停止します。kubectl scale deploy -nkube-system terway-controlplane --replicas 0Webhook 構成をバックアップした後、削除します。
# バックアップ 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 # 削除 kubectl delete -f terway-controlplane.mutatingwebhookconfigurations.yaml kubectl delete -f terway-controlplane.validatingwebhookconfigurations.yaml
移行後:
移行手順については、「ACK 専用クラスターから ACK マネージド Pro クラスターへのホットマイグレーション」をご参照ください。
移行が失敗した場合: Webhook および
terway-controlplaneを復元します。kubectl apply -f terway-controlplane.mutatingwebhookconfigurations.yaml kubectl apply -f terway-controlplane.validatingwebhookconfigurations.yaml kubectl scale deploy -nkube-system terway-controlplane --replicas 1移行が成功した場合:
terway-controlplaneを削除し、アドオン ページから再インストールします。kubectl delete deploy -nkube-system terway-controlplane再インストール手順については、「システムコンポーネントの管理」をご参照ください。
よくある質問
Pod が期待される PodNetworking を使用していないのはなぜですか?
以下の項目を順に確認してください。
PodNetworking の
statusがReadyである必要があります。kubectl describe PodNetworking <name>を実行して確認してください。Pod のラベルが正確に 1 つの PodNetworking と一致している必要があります。複数の PodNetworking と一致する場合、使用されるネットワーク構成は未定義となります。
PodNetworking で Fixed 割り当てポリシーを使用している場合、これは StatefulSet および
ownerReferencesを持たない Pod にのみ適用されます。Deployment またはその他のコントローラーによって管理される Pod は一致しません。
次のステップ
より詳細な Pod レベルのファイアウォールポリシーを実現するために、ENI ごとに複数のセキュリティグループを構成する:「ENI に対する複数のセキュリティグループの設定」
コンテナネットワークの問題をトラブルシューティングする:「コンテナネットワークに関するよくある質問」