AWS EKS 中的 VPC 到 CN2 通信
总结 瞻博网络云原生 Contrail 网络 (CN2) 版本 23.1 支持 AWS 虚拟私有云 (VPC) 网络、外部网络和 CN2 集群之间的通信。此功能仅适用于使用 CN2 作为 CNI 的 AWS EKS 环境。本文提供有关 CN2 如何实现此功能的信息。
了解 Kubernetes 和 VPC 网络
通常,您无法从 VPC 访问在 Amazon Elastic Kubernetes Service (EKS) 上运行的叠加网络中的 Kubernetes 工作负载。为了实现 AWS VPC 到 Kubernetes 的通信,您必须向 VPC 公开 Kubernetes 集群的主机网络。尽管某些公共云 Kubernetes 发行版提供了支持此功能的解决方案,但这些解决方案是为传统虚拟机工作负载而不是 Kubernetes 工作负载量身定制的。因此,这些解决方案具有以下缺点:
-
您必须将 Pod IP 配置为节点接口上的辅助 IP 地址。这会对节点施加资源限制,从而减少可以支持的 Pod 数量。
-
服务通过公共负载均衡器公开。每次创建服务时,负载均衡器都会开始一个实例化过程,这可能会导致服务公开之前的更多时间
CN2 版本 23.1 通过引入网关服务实例 (GSI) 解决了此问题。GSI 是 Amazon Web Service (AWS) 和 Kubernetes 资源的集合,它们协同工作,将 CN2 与 VPC 和外部网络无缝互连。应用 GSI 清单和 CN2 可促进 Amazon EKS 集群中的 Pod 和服务与同一 VPC 中的工作负载之间的通信。
先决条件
要启用 VPC 到 CN2 的通信,需要满足以下条件:
-
用于 cRPD 的许可证。要购买许可证,请访问 https://www.juniper.net/us/en/products/routers/containerized-routing-protocol-daemon-crpd.html
-
您必须将许可证作为命名空间中的
contrail-gsi
安装Secret
到 EKS 集群中。 -
密钥必须包含 的 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 角色的说明,请参阅以下链接: 将服务账户配置为代入 IAM 角色
-
EKS 集群中的节点必须具有以下标签:
core.juniper.net/crpd-node: ""
。-
控制器将仅在具有以下键的节点上调度 cRPD 容器:
core.juniper.net/crpd-node
。将此标签添加到节点后,任何 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 的网络中转枢纽。一个中转网关可以有
Attachments
一个或多个 VPC。 -
连接附件:中转网关连接附件在中转网关与 VPC 中运行的第三方虚拟设备 (JCNR) 之间建立连接。创建连接附件后,可以在连接附件上创建一个或多个通用路由封装 (GRE) 隧道或中转网关连接对等方,以连接中转网关和第三方设备。中转网关连接对等方由 GRE 隧道上的两个 BGP 对等会话组成,它们提供路由冗余。安装中转网关资源后,CN2 会自动执行此过程。
-
VPC 附件:VPC
Attachment
连接到中转网关。当您将 VPC 附加到中转网关时,资源和路由规则将应用于该网关。
Kubernetes 资源:
-
连接的对等方:中转网关连接对等方是一种 GRE 隧道,可促进中转网关与第三方设备或 JCNR 之间的通信。
CN2 GSI 资源:
-
瞻博网络云原生路由器 (JCNR):JCNR 是 CN2 的扩展,充当 EC2 实例和其他 AWS 资源与运行 CN2 的 EKS 集群之间的网关。
JCNR 执行以下操作:
-
通过多协议 BGP (MP-BGP) 连接到 CN2 控制节点,并在数据平面中使用 MPLSoUDP
-
在 CN2 EKS 节点之间提供主动/主动 L3 和 L4 负载平衡
您可以将 JCNR 及其连接的对等方扩展到最多四个实例。在这种情况下,中转网关可在 JCNR 之间提供主动/主动 L3 和 L4 负载平衡。作为 JCNR 功能的示例,如果在要公开的 VN 上添加 label
,JCNR 会将该 VN 的子网播发到中转网关。VN 子网与中转网关之间的下一跃点路由将添加到 VPC 的路由表中。因此,VN 在 VPC 的网络中路由,并通过 VPC 内的工作负载进行访问。此功能类似于传统的物理 SDN 网关,其中中转网关和 JCNR 充当 EKS 集群与 AWS 环境其余部分之间的物理网关,而不存在 的缺点 hostNetwork
。
下图描述了典型 Amazon EKS 集群中的连接。请注意,CN2 自动生成 VPC 路由表。

自定义资源实现
CN2 通过以下自定义资源 (CR) 实现此功能:
-
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 一起运行。应用 TransitGateway
和 GSI 对象时会自动配置这些控制器。
故障 排除
本节提供有关排查各种 ConnectedPeer
连接问题、自定义控制器问题和工作负载可达性问题的信息。
对于自定义控制器问题:
-
应用 GSI 清单后,请确保与 GSI 清单关联的所有自定义控制器 Pod(服务器、客户端)都处于活动状态。
kubectl get pods -n contrail-gsi -l app=contrail-gsi-plugin
CLI 输出应在常规 EKS 部署中显示三个活动控制器 Pod。如果您没有收到正确的 CLI 输出,请使用以下命令验证是否已安装 GSI 插件。
kubectl get gsiplugins -n contrail-gsi
检查容器的
contrail-k8s-deployer
日志。过滤 GSI 插件协调器的结果并查找任何错误。 -
确保自定义控制器可以向所需的 AWS 资源发出创建、读取、更新、删除 (CRUD) 请求。
-
检查 Pod 的
contrail-gsi
日志;三个 Pod 中的一个应处于活动状态,并将输出日志消息。 -
验证活动 Pod 的日志不包含有关无法对 AWS 进行 API 调用的错误。如果您确实看到这些错误,请确保已正确配置授予 的
contrail-gsi-serviceaccount
IAM 角色(请参阅本主题的 先决条件 部分)。
-
对于 TransitGateway
问题:
-
安装
TransitGateways
后,请确保其状态从“挂起”更改为“可用”。 -
ConnectedPeer
确保 /cRPD Pod 处于活动状态。kubectl get pods -n contrail-gsi -l app=connectedpeer
如果输出中未显示任何 Pod,请确保有一个节点可用于
ConnectedPeer
调度 Pod。有效的容器包含以下标签:core.juniper.net/crpd-node: ""
。
对于 ConnectedPeer
问题:
-
ConnectedPeer
Pod 处于活动状态后,请确保 cRPD 可以与 CN2 控制节点和 AWS 的中转网关建立 BGP 会话。在 cRPD 的 CLI 中运行以下命令:show bgp summary
此过程可能会由于以下原因而失败:
-
群集中未安装有效的活动许可证
-
BGP 的 IP 连接不正确
-
对于工作可访问性问题:
-
如果您无法从 EC2 实例访问 EKS 集群:
-
确保工作负载的 VN 已向 .
TransitGateway
-
确保从公开的 VN 到 VPC 的路由显示在 VPC 的路由表中。
-
确保 EC2 实例具有配置为访问 VN 的 CIDR 的安全组。
-
自定义控制器会自动创建一个安全组 (
gsi-sg
),该安全组允许访问向中转网关公开的所有路由。
-
-