ユーザートラフィックの管理と分離、ネットワークポリシーの設定、IPアドレスの管理をきめ細かく行う場合は、Container Service for Kubernetes (ACK) クラスターのTerway Trunk elastic network interface (ENI) 機能を有効にできます。 この機能を使用すると、静的IPアドレス、個別のvSwitch、およびポッドごとに個別のセキュリティグループを指定できます。
背景情報
トランクエラスティックネットワークインターフェイス (ENI) は、新しい仮想ネットワークインターフェイスです。 トランクENIは、ENIが提供するすべての機能をサポートします。 さらに、使用できるENIの最大数に達し、追加のENIを使用する場合は、これらのENIをトランクENIに関連付けることができます。 これらのENIのそれぞれは、ポッドに個別に割り当てることができます。
クラスターのトランクENI機能を有効にすると、特定のポッドの構成をカスタマイズして、排他モードでトランクENIに関連付けられている追加のENIを使用し、他のポッドが元のENIを共有するように設定できます。 ポッドのカスタム設定機能はオプションです。 デフォルトでは、すべてのポッドは共有ENIから割り当てられたIPアドレスを使用します。 ポッドでカスタム構成を使用できるようにするには、最初にクレームを作成して、ポッドのカスタムポッド構成機能を有効にする必要があります。
カスタムポッド構成を有効にすると、terway-controlplaneコンポーネントがクラスターにデプロイされます。 次の図は、コンポーネントの動作を示しています。
制限事項
ACK専用クラスターを使用している場合は、Quota Centerコンソールに移動し、
Container network supports Terway ENI Trunking mode
を申請します。Terway Trunk ENI機能を有効にするには、Trunk ENIをサポートするElastic Compute Service (ECS) インスタンスを購入する必要があります。 ECS APIを呼び出してインスタンスタイプを照会した後、
EniTrunkSupported=true
パラメーターが返された場合、インスタンスタイプはトランクENIをサポートしています。 ECS APIを呼び出してインスタンスタイプを照会する方法の詳細については、「DescribeInstanceTypes」をご参照ください。ノードに作成できるポッドの数には制限があります。 詳細については、「Terwayでの作業」をご参照ください。
ポッドセキュリティグループルールは、同じノード上のポッド間のトラフィック、およびポッドとポッドが作成されたノード間のトラフィックには適用されません。 これらのシナリオでポッドセキュリティグループルールを適用する場合は、ネットワークポリシーを設定できます。
手順1: クラスターのTerway Trunk ENI機能の有効化
ACK専用クラスターを使用する場合は、チケットを起票し、トランクENIをサポートするECSインスタンスを使用する権限を申請します。 ACKマネージドクラスターの場合、トランクENIをサポートするECSインスタンスを使用するための権限を申請する必要はありません。
新しいクラスターでTerway Trunk ENI機能を有効にする
ACKクラスターを作成し、[ネットワークプラグイン] を [Terway] に設定し、[Terwayモード] を [ENIトランキングのサポート] に設定します。 このモードでは、ネットワークプラグインのタイプはterway-eniipです。 詳細については、「ACK専用クラスターの作成」および「ACK管理クラスターの作成」をご参照ください。
デフォルトでは、Trunk ENI機能は、Kubernetes 1.31以降のバージョンを実行する新しく作成されたACK管理クラスターに対して有効になっています。
トランクENI機能は、新しいクラスターで有効になった後は無効にできません。
既存のクラスターでトランクENI機能を有効にする
前提条件
クラスターが使用するネットワークプラグインのタイプはterway-eniipです。 Terwayネットワークプラグインの詳細については、「Terwayでの作業」をご参照ください。
クラスターの [アドオン] ページでインストールしたネットワークプラグインを照会できます。
制限事項
この機能は、6月2020日より前に作成されたACK管理クラスターではサポートされない場合があります。 手順1を実行して、クラスターがこの機能をサポートしているかどうかを確認します。
静的IPアドレス、vSwitch、およびセキュリティグループは、有効化後は無効化できません。
手順1: クラスターがTerway Trunk ENI機能をサポートしているかどうかを確認する
ACK専用クラスターを使用する場合は、この手順をスキップします。 トランクENIを使用するには、権限を申請する必要があります。 できます チケットを起票し、トランクENIをサポートするECSインスタンスを使用する権限を申請します。
ACK専用クラスターからアップグレードされた既存のACK管理クラスターまたはACK管理クラスターの場合、クラスターがTerway Trunk ENI機能をサポートしているかどうかを確認し、設定を変更する必要があります。 トランクENIをサポートするECSインスタンスを使用するための権限を申請する必要はありません。
次のコマンドを実行して、トークン設定を確認します。
kubectl get secret -nkube-syste m addon.net work.token
期待される出力:
名前タイプデータ年齢
addon.netの仕事. token Opaque 1 69m
トークン設定が存在する場合は、次のステップに進みます。 トークン設定が存在しない場合、Terway Trunk ENI機能はクラスターでサポートされていません。 この場合、Terway Trunk ENI機能を有効にして新しいクラスターを作成できます。
手順2: terway-eniipを有効にし、クラスターのTerway Trunk ENI機能を有効にする
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、 を選択します。
On theアドオンページをクリックし、ネットワーキングタブを検索し、terway-eniipコンポーネントを使用します。
では、terway-eniipカード、クリックアップグレードterway-eniipを最新バージョンに更新します。
[アップグレード] ボタンが表示されない場合は、最新バージョンのterway-eniipがインストールされています。 このステップはスキップできます。
terway-enniipを有効にします。
次のコマンドを実行して、eni-config ConfigMapを変更します。
kubectl edit cm -nkube-system eni-config
eni-config ConfigMapのパラメーターを変更します。
パラメーター
例
説明
enable_eni_trunking
true
トランクENI機能を有効にします。 この機能は、有効化後は無効にできません。
credential_path
/var/addon/token-config
ACK管理クラスターを使用する場合、ConfigMapにはこのパラメーターは含まれません。 手動でパラメーターを追加する必要があります。
重要他のパラメータは変更しないでください。
eni-config ConfigMapの内容はJSON形式である必要があります。
例:
apiVersion: v1 データ: eni_conf: | { "min_pool_size": 0、 "enable_eni_trunking": true、 "credential_path": "/var/addon/token-config" 、 ... } kind: ConfigMap
次のコマンドを実行してTerwayポッドを再起動し、変更されたConfigMapを有効にします。
kubectl delete pod -n kube-system -l app=terway-eniip
インストールterway-controlplaneからネットワーキングのタブアドオンterway-eniipを有効にした後のページ。
terway-controlplaneをインストールすると、terway-controlplaneカードにinstalledが表示されます。
ステップ2: PodNetworkingの作成
Terwayでは、PodNetworkingという名前のカスタムリソース定義 (CRD) を使用してネットワーク構成を記述できます。 複数のPodNetworkingを作成して、異なるネットワークプレーンを設計できます。
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
On theクラスターページで、管理するクラスターの名前をクリックし、 左側のナビゲーションウィンドウに表示されます。
[カスタムリソース] ページで、[YAMLから作成] をクリックします。
次のコードブロックは、PodNetworkingのサンプルを示しています。
apiVersion: network.alibabacloud.com/v1beta1 kind: PodNetworking metadata: name: example spec: allocationType: type: Fixed # The policy that describes how IP addresses are allocated to pods. Valid values: Elastic and Fixed. releaseStrategy: TTL # This parameter takes effect only if the PodNetworking uses the Fixed policy. If the PodNetworking uses the Elastic policy, you do not need to configure the releaseStrategy and releaseAfter parameters. releaseAfter: "1h" # This parameter takes effect only if releaseStrategy is set to TTL. selector: podSelector: matchLabels: foo: bar namespaceSelector: matchLabels: foo: bar securityGroupIDs: - sg-bpxxxx vSwitchOptions: - vsw-bpxxxx status: status: Ready
下表に、各パラメーターを説明します。
パラメーター
説明
allocationType
(ポッドへのIPアドレスの割り当て方法を説明するポリシー)
type
有効な値:
Elastic: elastic IPアドレス (EIP) をポッドに割り当てます。 ポッドが削除されると、IPアドレスは解放されます。
修正: 静的IPアドレスをポッドに割り当てます。
固定ポリシーを使用するPodNetworkingは、StatefulSetsによって作成されたポッドに対してのみ有効です。 StatefulSetsの詳細については、「Kubernetes StatefulSetのベストプラクティス」をご参照ください。
説明固定ポリシーを使用すると、ポッドが再作成されるゾーンが元のゾーンと同じになるように制約が追加されます。
releaseStrategy
IPアドレスのリリース方法を説明するポリシー。 このパラメーターは、
type
がFixed
に設定されている場合にのみ有効です。 有効な値:TTL
: IPアドレスは遅延してリリースされます。 ポッドが削除された後、指定された期間が終了するまで、ポッドのIPアドレスは解放されません。 最小値は5分です。Never
: IPアドレスはリリースされません。 IPアドレスが使用されなくなった場合は、PodENIを手動で削除する必要があります。
releaseAfter
ポッドのIPアドレスを解放するための遅延。 このパラメーターは、
releaseStrategy
がTTL
に設定されている場合にのみ有効です。 値はGo timeタイプでなければなりません。 例:2h4 5m
または5m 0s
詳細については、「Go time type」をご参照ください。セレクター
(現在のPodNetworkingを使用するポッドを選択するために使用されるラベルセレクタ)
podSelector
ポッドのラベルを一致させるために使用されるセレクター。 このセレクターと一致するポッドは、現在のPodNetworkingを使用します。
podSelector
とnamespaceSelector
の両方が設定されている場合、両方のセレクターに一致するポッドのみが現在のPodNetworkingを使用します。ポッドのラベルが1つのPodNetworking ConfigMapのセレクターと一致することを確認します。 ポッドが複数のPodNetworking ConfigMapと一致する場合、ポッドは任意のPodNetworking ConfigMapのネットワーク設定を使用します。
namespaceSelector
名前空間ラベルを照合するために使用されるセレクター。 このセレクターと一致するポッドは、現在のPodNetworkingを使用します。
podSelector
とnamespaceSelector
の両方が設定されている場合、両方のセレクターに一致するポッドのみが現在のPodNetworkingを使用します。ポッドのラベルが1つのPodNetworking ConfigMapのセレクターと一致することを確認します。 ポッドが複数のPodNetworking ConfigMapと一致する場合、ポッドは任意のPodNetworking ConfigMapのネットワーク設定を使用します。
vSwitchOptions
-
ポッドによって使用されるvSwitchを指定します。 複数のvSwitch間の論理関係はORです。 各ポッドで使用できるvSwitchは1つだけです。 Terwayは、各ポッドに適切なvSwitchを自動的に選択します。
ポッドをスケジュールできるゾーンが、vSwitchOptionsパラメーターで指定したvSwitchのゾーンと同じになるように、制約が追加されます。
vSwitchOptionsのvSwitchのゾーンが、ポッドがスケジュールされているノードのゾーンと同じであることを確認します。 さらに、これらのvSwitchが十分なアイドルIPアドレスを提供できることを確認してください。 それ以外の場合、ACKはポッドの作成に失敗します。
vSwitchSelectOptions (使用するvSwitchを決定するポリシー)
vSwitchSelectionPolicy
有効な値:
ordered
: これはデフォルト値です。 vSwitchは、入力された順序で使用されます。most
: 使用可能な最も多くのIPアドレスでvSwitchを優先します。random
: vSwitchはランダムに選択されます。
説明Terway v1.11.0以降でサポートされています。
securityGroupIDs
-
セキュリティグループのIDを指定します。 複数のセキュリティグループが同時に有効になります。 最大5つのセキュリティグループを指定できます。
eniOptions (ポッドで使用されるENIタイプ)
eniType
有効な値:
デフォルト
: デフォルトモードです。 Terway共有ENIモードで実行されるクラスターでは、トランクENIモードが使用されます。 Terway ENI排他モードで実行されるクラスターでは、排他ENIモードが使用されます。ENI
: 専用ENIモードを使用します。トランク
: トランクENIモードを使用します。
説明Terway v1.11.0以降でサポートされています。
[作成] をクリックします。
PodNetworkingが作成されると、Terwayは自動的にネットワーク設定を同期します。 PodNetworkingは、PodNetworkingの
ステータス
がReady
に変更された後にのみ、ポッドで有効になります。次のコマンドを実行して、リソースのステータスが
準備完了
かどうかを確認します。kubectlはPodNetworkingの例を説明します。# 例を実際のカスタムリソース名に置き換えます。
(オプション) 手順1: 名前空間にラベルを追加する
PodNetworkingをデプロイした後、指定した名前空間にラベルを追加して、リソースがPodNetworkingのポリシーと一致するようにする必要があります。
次のコマンドを実行して、exampleという名前のテスト名前空間を作成します。
kubectl create ns example
次のコマンドを実行して、
foo=bar
ラベルを名前空間に追加します。kubectl label namespaces example foo=bar # Replace example with the actual namespace name.
次のコマンドを実行して、名前空間のラベルを照会します。
kubectl get namespace example --show-labels # Replace example with the actual namespace name.
期待される出力:
NAME STATUS AGE LABELS example Active 24s foo=bar,kubernetes.io/metadata.name=example
(オプション) 手順2: ポッドの作成
ACKがポッドを作成すると、ポッドのラベルがPodNetworkingと照合されます。 ポッドがPodNetworkingと一致しない場合、ポッドにはデフォルトで共有ENIからIPアドレスが割り当てられます。 ポッドがPodNetworkingと一致する場合、PodNetworkingで指定された設定に基づいてポッドにIPアドレスが割り当てられます。
Terwayは、PodNetworkingsと一致するポッドのPodENIという名前のCRDを自動的に作成します。 PodENIは、ポッドのリソース使用状況を追跡するために使用されます。 PodENIはTerwayによって管理されます。 ポッドラベルの詳細については、「ラベルとセレクター」をご参照ください。
次のyamlテンプレートを使用してmy-nginx. YAMLファイルを作成します。
apiVersion: apps/v1 kind: StatefulSet metadata: name: my-nginx # The name of the application. namespace: example # Specify the namespace name as example. labels: app: nginx spec: serviceName: "nginx-service" replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx foo: bar # Add the foo: bar label to the pod. spec: containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 ports: - containerPort: 80 If the StatefulSet requires persistent storage, you must set the volumeClaimTemplates parameter. # Example: # volumeClaimTemplates: # - metadata: # name: nginx-storage # spec: # accessModes: ["ReadWriteOnce"] # storageClassName: "my-storage-class" # resources: # requests: # storage: 1Gi
次のコマンドを実行して、my-nginxという名前のサンプルアプリケーションをデプロイします。 詳細については、「」をご参照ください。ポッドがPodNetworking ConfigMapで指定されたネットワーク設定を使用しているかどうかを確認するにはどうすればよいですか。
kubectl apply -f my-nginx.yaml
クラスター移行前にterway-controlplaneを停止する
ACK専用クラスターのポッドカスタム設定機能を有効にすると、ACK専用クラスターからACK Proクラスターにワークロードを直接移行することはできません。 移行開始前にterway-controlplaneを停止し、移行完了後にterway-controlplaneを有効にする必要があります。
移行を開始する前に、次の手順を実行します。
次のコマンドを実行してterway-controlplaneを停止します。
kubectl scale deploy -nkube-system terway-controlplane --replicas 0
次のコマンドを実行してwebhookを設定します。
# Back up the webhook configurations. 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 # Delete the webhook configuration. kubectl delete -f terway-controlplane.mutatingwebhookconfigurations.yaml kubectl delete -f terway-controlplane.validatingwebhookconfigurations.yaml
移行が成功したことを確認します。
説明クラスター移行の詳細については、「ACK専用クラスターからACK Proクラスターへのホットマイグレーション」をご参照ください。
移行に失敗した場合は、次のコマンドを実行してwebhookおよびterway-controlplaneを復元します。
# Restore the webhook configuration. kubectl apply -f terway-controlplane.mutatingwebhookconfigurations.yaml kubectl apply -f terway-controlplane.validatingwebhookconfigurations.yaml # Restore terway-controlplane. kubectl scale deploy -nkube-system terway-controlplane --replicas 1
移行が成功した場合は、次のコマンドを実行して関連するリソースを削除します。
kubectl delete deploy -nkube-system terway-controlplane
アドオンページからterway-controlplaneコンポーネントをインストールします。 詳細については、「システムコンポーネントの管理」をご参照ください。
よくある質問
ポッドがPodNetworking ConfigMapで指定されたネットワーク設定を使用しているかどうかを確認するにはどうすればよいですか。
ポッドが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は、ポッドで使用されるネットワーク構成を記録するために、同じポッド名と名前空間を持つPodENIを自動的に作成します。 次のメソッドを使用して、PodENIをクエリできます。
kubectl get podenis.network.alibabacloud.com your-pod-name -n default -oyaml apiVersion: network.alibabacloud.com/v1beta1 kind: PodENI metadata: finalizers: - pod-eni generation: 1 name: your-pod-name 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
ポッドの作成後、ポッドが目的のPodNetworking ConfigMapで指定されたネットワーク設定を使用しないのはなぜですか。
PodNetworkingのステータスが
準備完了
であることを確認します。ポッドのラベルが目的のPodNetworkingのラベルのみと一致することを確認します。
PodNetworkingが固定ポリシーを使用している場合、StatefulSetsによって作成されていないポッドはPodNetworkingと一致しません。
関連ドキュメント
ENIに複数のセキュリティグループを設定して、ポッドネットワークファイアウォールポリシーをより柔軟に適用できます。 詳細については、「ENIの複数のセキュリティグループの設定」をご参照ください。
コンテナーネットワークの問題をトラブルシューティングする方法の詳細については、「コンテナーネットワークに関するよくある質問」をご参照ください。