AWS EKS の VPC から CN2 への通信
概要 ジュニパークラウドネイティブのContrail Networking(CN2)リリース23.1は、AWS仮想プライベートクラウド(VPC)ネットワーク、外部ネットワーク、およびCN2クラスター間の通信をサポートしています。この機能は、CNIとしてCN2を使用するAWS EKS環境にのみ適用されます。この記事では、CN2がこの機能を実装する方法に関する情報を提供します。
Kubernetes と VPC ネットワークについて
通常、VPCからAmazon Elastic Kubernetes Service(EKS)で実行されているオーバーレイネットワークのKubernetesワークロードにはアクセスできません。AWS VPC から Kubernetes への通信を実現するには、Kubernetes クラスターのホスト ネットワークを VPC に公開する必要があります。一部のパブリッククラウドのKubernetesディストリビューションでは、この機能をサポートするソリューションを提供していますが、これらのソリューションはKubernetesワークロードではなく、従来のVMワークロードに合わせて調整されています。その結果、これらのソリューションには次の欠点があります。
-
ノードインターフェイスでは、ポッドIPをセカンダリIPアドレスとして設定する必要があります。これにより、ノードにリソース制約が課され、サポートできるポッドの数が減少します。
-
サービスはパブリックロードバランサを通じて公開されます。サービスが作成されるたびに、ロードバランサーがインスタンス化プロセスを開始し、サービスが公開されるまでの時間が長くなる可能性があります。
CN2リリース23.1は、ゲートウェイサービスインスタンス(GSI)を導入することでこの問題に対処します。GSIは、Amazon Web Service(AWS)とKubernetesのリソースの集合体で、CN2とVPCおよび外部ネットワークをシームレスに相互接続します。GSIマニフェストを適用すると、CN2はAmazon EKSクラスター内のポッドとサービス間、および同じVPC内のワークロード間の通信を促進します。
前提 条件
VPCからCN2への通信を有効にするには、以下が必要です。
-
cRPD のライセンス。ライセンスを購入するには、 https://www.juniper.net/us/en/products/routers/containerized-routing-protocol-daemon-crpd.html
-
名前空間内でライセンスをEKSクラスターにインストールする
Secret
contrail-gsi
必要があります。 -
シークレットには、 の crpd ライセンス キーに基づく base64 エンコード バージョンのライセンスが含まれている必要があります。データ。
-
ライセンスを参照する例
Secret
を以下に示します。apiVersion: v1 kind: Secret metadata: name: crpd-license namespace: contrail-gsi data: crpd-license: ****** # base64 encoded crpd license
-
-
CN2リリース23.1以降を実行するEKSクラスター
-
AWS アイデンティティおよびアクセス管理(IAM)ロールへのアクセス。IAM ロールを引き受けるサービス アカウントを構成する方法については、次のリンクを参照してください。
-
EKS クラスター内のノードには、 のラベル
core.juniper.net/crpd-node: ""
が必要です。-
コントローラは、以下のキー
core.juniper.net/crpd-node
を持つノード上のcRPDコンテナのみをスケジュールします。このラベルをノードに追加すると、CN2コントローラ(vRouterを含む)は、このノードでは実行しません。これにより、適切な数のノードが cRPD コンテナ用に予約されます。
-
ゲートウェイ サービス インスタンス コンポーネント
ゲートウェイ サービス インスタンス(GSI)マニフェストの例を次に示します。
apiVersion: v1 kind: Namespace metadata: name: contrail-gsi --- apiVersion: v1 kind: ServiceAccount metadata: name: contrail-gsi-serviceaccount namespace: contrail-gsi --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: contrail-gsi-role rules: - apiGroups: - '*' resources: - '*' verbs: - '*' --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: contrail-gsi-rolebinding roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: contrail-gsi-role subjects: - kind: ServiceAccount name: contrail-gsi-serviceaccount namespace: contrail-gsi --- apiVersion: plugins.juniper.net/v1 kind: GSIPlugin metadata: name: contrail-gsi-plugin namespace: contrail-gsi spec: awsRegion: "us-east-2" iamRoleARN: "arn:aws:iam::********" vpcID: "vpc-**********" common: containers: - image: <repository>/contrail-gsi-plugin:<tag> imagePullPolicy: Always name: contrail-gsi-plugin initContainers: - command: - kubectl - apply - -k - /crd image: <repository>/contrail-gsi-plugin-crdloader:<tag> imagePullPolicy: Always name: contrail-gsi-plugin-crdloader serviceAccountName: contrail-gsi-serviceaccount
awsRegion
、 iamRoleARN
、および vpcID
フィールドはユーザー定義であることに注意してください。このiamRoleARN
機能の前提条件の一部として作成する IAM ロールの値は Amazon リソース名 (ARN) です。
GSIマニフェストを適用すると、以下を作成および管理するカスタムコントローラが作成されます。
AWS リソース:
-
トランジット ゲートウェイ:トランジット ゲートウェイは、VPC を相互接続できるネットワーク トランジット ハブです。トランジット ゲートウェイは、1 つ以上の VPC を持
Attachments
つことができます。 -
接続アタッチメント:トランジットゲートウェイ接続アタッチメントは、VPCで実行されているトランジットゲートウェイとサードパーティの仮想アプライアンス(JCNR)との間に接続を確立します。接続添付ファイルを作成した後、1つ以上の GRE(汎用ルーティングカプセル化)トンネル、または Transit Gateway Connect ピアを Connect 添付ファイルに作成して、トランジットゲートウェイとサードパーティー製アプライアンスを接続できます。Transit Gateway Connect ピアは、ルーティングの冗長性を提供する GRE トンネル上の 2 つの BGP ピアリング セッションで構成されています。トランジットゲートウェイリソースをインストールすると、CN2はこのプロセスを自動的に実行します。
-
VPC アタッチメント: VPC
Attachment
をトランジット ゲートウェイにアタッチします。VPC をトランジットゲートウェイにアタッチすると、そのゲートウェイにリソースとルーティングルールが適用されます。
Kubernetes リソース:
-
接続されたピア:トランジット ゲートウェイの接続ピアは、トランジット ゲートウェイとサードパーティー製アプライアンスまたは JCNR 間の通信を容易にする GRE トンネルです。
CN2 GSIリソース:
-
ジュニパークラウドネイティブルーター(JCNR):JCNRは、EC2インスタンスと他のAWSリソースとCN2を実行するEKSクラスター間のゲートウェイとして機能するCN2の拡張です。
JCNR は、以下のことを行います。
-
マルチプロトコルBGP(MP-BGP)を介してCN2制御ノードに接続し、データプレーンでMPLSoUDPを使用します。
-
CN2 EKSノード間でアクティブ/アクティブL3およびL4ロードバランシングを提供する
JCNR とその接続ピアは、最大 4 つのインスタンスに拡張できます。この場合、トランジット ゲートウェイは JCNR 間でアクティブ/アクティブ L3 および L4 ロード バランシングを提供します。JCNR機能の例として、公開したいVNにaを追加 label
すると、JCNRはそのVNのサブネットをトランジットゲートウェイにアドバタイズします。VN のサブネットとトランジットゲートウェイ間のネクストホップルートが VPC のルーティングテーブルに追加されます。その結果、VN は VPC のネットワークにルーティングされ、VPC 内のワークロードからアクセスできます。この機能は、従来の物理 SDN ゲートウェイと似ています。トランジット ゲートウェイと JCNR は、EKS クラスターと AWS 環境の残りの部分との間の物理ゲートウェイとして機能します hostNetwork
。欠点はありません。
次の図は、典型的な Amazon EKS クラスターでの接続を示しています。CN2はVPCルーティングテーブルを自動的に生成します。
カスタム リソースの実装
CN2は、以下のカスタムリソース(RR)を通じてこの機能を実装しています。
-
TransitGateway
: AWSTransitGateway
リソースを表します。 -
Route
: VPC ルーティング テーブル内のエントリーを表します。ARoute
は、ユーザー入力を必要としない内部で作成されたオブジェクトです。 -
ConnectedPeer
:トランジット ゲートウェイとの BGP セッションを確立するアプライアンス(CN2 の JCNR)を表します。AConnectedPeer
は、ユーザー入力を必要としない内部で作成されたオブジェクトです。
以下に、マニフェストの例を TransitGateway
示します。
apiVersion: core.gsi.juniper.net/v1 kind: TransitGateway metadata: name: tgw1 namespace: contrail-gsi spec: subnetIDs: - subnet-******* - subnet-******* - subnet-******* connectedPeerScale: 1 transitASN: 64513 peerASN: 64513 transitCIDR: 192.0.2.0/24 bgpCidr: 169.254.10.0 controlNodeASN: 64512 licenseSecretName: crpd-license controllerContainer: name: controller command: ["/manager", "-mode=client"] image: <repository>/contrail-gsi-plugin:<tag> imagePullPolicy: Always crpdContainer: name: crpd image: <repository>/crpd:<tag> initContainer: name: init image: <repository>/busybox:<tag>
仕様の詳細については、以下のコマンドを TransitGateway
使用します。
kubectl explain transitgateway.spec
カスタム コントローラの実装
GSIは、クライアント/サーバープラグインを備えたカスタムKubernetesコントローラを使用して実装されます。サーバー側のカスタムコントローラは、CN2コントロールプレーンノード上で動作します。クライアントは JCNR と並行して動作します。これらのコントローラは、 および GSI オブジェクトを TransitGateway
適用すると自動的に設定されます。
トラブルシューティング
このセクションでは、さまざまな ConnectedPeer
接続の問題、カスタム コントローラの問題、ワークロードの到達可能性に関する問題のトラブルシューティングに関する情報を提供します。
カスタム コントローラに関する問題:
-
GSI マニフェストを適用した後、GSI マニフェスト(サーバー、クライアント)に関連付けられたすべてのカスタム コントローラー ポッドがアクティブであることを確認します。
kubectl get pods -n contrail-gsi -l app=contrail-gsi-plugin
CLI出力には、通常のEKS導入で3つのアクティブコントローラーポッドが表示されます。正しいCLI出力が届かない場合は、以下のコマンドを使用して、GSIプラグインがインストールされていることを確認してください。
kubectl get gsiplugins -n contrail-gsi
ポッドのログを
contrail-k8s-deployer
確認します。GSIプラグイン調整のためのフィルター結果とエラーを探します。 -
カスタムコントローラが、必要なAWSリソースに対して作成、読み取り、更新、削除(CRUD)リクエストを作成できることを確認します。
-
ポッドのログを
contrail-gsi
確認します。3つのポッドのうち1つがアクティブになっている必要があり、ログメッセージが出力されます。 -
アクティブなポッドのログに、AWSへのAPI呼び出しができないというエラーが含まれていないことを確認します。これらのエラーが表示された場合は、 に
contrail-gsi-serviceaccount
付与された IAM ロールが正しく構成されていることを確認します(このトピックの「 前提条件 」セクションを参照してください)。
-
問題の場合 TransitGateway
:
-
をインストールした
TransitGateways
後、そのステータスが「保留中」から「使用可能」に変わります。 -
/cRPDポッドがアクティブであることを
ConnectedPeer
確認します。kubectl get pods -n contrail-gsi -l app=connectedpeer
出力にポッドが表示されない場合は、そのポッドがスケジュールされているノードが使用可能
ConnectedPeer
であることを確認します。有効なポッドには、以下のラベルが含まれています。core.juniper.net/crpd-node: ""
問題の場合 ConnectedPeer
:
-
ポッドが
ConnectedPeer
アクティブになり、cRPDがCN2制御ノードとAWSのトランジットゲートウェイとのBGPセッションを確立できることを確認します。cRPDのCLIで次のコマンドを実行します。show bgp summary
このプロセスは、以下の理由で失敗することがあります。
-
有効でアクティブなライセンスがクラスターにインストールされていません
-
BGPのIP接続が正しいとは言えません
-
作業の到達可能性に関する問題の場合:
-
EC2インスタンスからEKSクラスタにアクセスできない場合:
-
ワークロードの VN が
TransitGateway
. -
公開された VN から VPC へのルートが VPC のルーティング テーブルに表示されていることを確認します。
-
EC2インスタンスにVNの CIDR にアクセスするように設定されたセキュリティグループがあることを確認します。
-
カスタム コントローラは、トランジット ゲートウェイに公開されたすべてのルートへのアクセスを許可するセキュリティ グループ(
gsi-sg
)を自動的に作成します。
-
-