calico网络剖析
配置 BGP 对等
Big picture
在 Calico 节点之间或与网络基础设施对等配置 BGP(边界网关协议)以分发路由信息。
价值
Calico 节点可以通过 BGP 交换路由信息,以实现 Calico 网络工作负载(Kubernetes pod 或 OpenStack VM)的可达性。在本地部署中,这使您可以使您的工作负载成为整个网络其余部分的一等公民。在公共云部署中,它提供了一种在集群内分发路由信息的有效方式,并且通常与 IPIP 覆盖或跨子网模式结合使用。
特征
本操作指南使用以下 Calico 功能:
- 节点资源
- BGP配置资源
-
BGPPeer 资源
- 全球同行
- 特定于节点的对等体
概念
边界网关协议
BGP是用于在网络中的路由器之间交换路由信息的标准协议。每个运行 BGP 的路由器都有一个或多个BGP 对等体——它们通过 BGP 与之通信的其他路由器。您可以将 Calico 网络视为在每个节点上提供虚拟路由器。您可以将 Calico 节点配置为相互对等、使用路由反射器或使用架顶式 (ToR) 路由器。
常见的 BGP 拓扑
根据您的环境,有多种配置 BGP 网络的方法。以下是使用 Calico 完成的一些常见方法。
全网状
启用 BGP 后,Calico 的默认行为是创建内部 BGP (iBGP) 连接的全网状连接,其中每个节点相互对等。这允许 Calico 在任何 L2 网络上运行,无论是公共云还是私有云,或者,如果配置了 IPIP,则可以在任何不阻止 IPIP 流量的网络上覆盖运行。Calico 不将 BGP 用于 VXLAN 覆盖。
注意:大多数公共云都支持 IPIP。值得注意的例外是 Azure,它会阻止 IPIP 流量。因此,如果您想在 Azure 中将 Calico 作为覆盖网络运行,则必须将 Calico 配置为使用 VXLAN。
全网状结构非常适合 100 个或更少节点的中小型部署,但在规模明显更大的情况下,全网状结构的效率会降低,我们建议使用路由反射器。
路由反射器
要构建大型内部 BGP (iBGP) 集群,可以使用BGP 路由反射器来减少每个节点上使用的 BGP 对等体的数量。在这个模型中,一些节点充当路由反射器,并被配置为在它们之间建立一个完整的网格。然后将其他节点配置为与这些路由反射器的子集对等(通常为 2 个用于冗余),与全网状相比减少了 BGP 对等连接的总数。
架顶式 (ToR)
在本地部署中,您可以将 Calico 配置为直接与您的物理网络基础设施对等。通常,这涉及禁用 Calico 的默认全网状行为,而是将 Calico 与您的 L3 ToR 路由器对等。构建本地 BGP 网络的方法有很多种。如何配置 BGP 取决于您 - Calico 适用于 iBGP 和 eBGP 配置,您可以像网络设计中的任何其他路由器一样有效地对待 Calico。
根据您的拓扑结构,您还可以考虑在每个机架内使用 BGP 路由反射器。但是,通常仅当每个 L2 域中的节点数很大(> 100)时才需要这样做。
要深入了解常见的本地部署模型,请参阅Calico over IP Fabrics。
在你开始之前…
calicoctl必须安装和配置。
如何
注意:显着更改 Calico 的 BGP 拓扑,例如从全网状更改为与 ToR 对等互连,可能会导致在重新配置过程中临时丢失 pod 网络连接。建议仅在维护时段内进行此类更改。
- 配置全局 BGP 对等体
- 配置每节点 BGP 对等体
- 配置一个节点作为路由反射器
- 禁用默认的 BGP 节点到节点网格
- 在没有任何流量中断的情况下从节点到节点网格更改为路由反射器
- 查看节点的 BGP 对等状态
- 更改默认的全局 AS 号
- 更改特定节点的 AS 编号
配置全局 BGP 对等体
全局 BGP 对等点适用于集群中的所有节点。如果您的网络拓扑包括将与部署中的每个 Calico 节点对等的 BGP 扬声器,这将很有用。
以下示例创建一个全局 BGP 对等体,它将每个 Calico 节点配置为与AS 64567中的****192.20.30.40对等。
apiVersion: projectcalico.org/v3
kind: BGPPeer
metadata:
name: my-global-peer
spec:
peerIP: 192.20.30.40
asNumber: 64567
配置每节点 BGP 对等体
每节点 BGP 对等点适用于集群中的一个或多个节点。您可以通过准确指定节点名称或使用标签选择器来选择哪些节点。
以下示例创建了一个 BGPPeer,它将每个带有标签rack: rack-1的 Calico 节点配置为与AS 64567中的****192.20.30.40对等。
apiVersion: projectcalico.org/v3
kind: BGPPeer
metadata:
name: rack1-tor
spec:
peerIP: 192.20.30.40
asNumber: 64567
nodeSelector: rack == 'rack-1'
配置一个节点作为路由反射器
Calico 节点可以配置为充当路由反射器。为此,您希望充当路由反射器的每个节点都必须有一个集群 ID——通常是一个未使用的 IPv4 地址。
要将节点配置为集群 ID 为 244.0.0.1 的路由反射器,请运行以下命令。
calicoctl patch node my-node -p '{"spec": {"bgp": {"routeReflectorClusterID": "244.0.0.1"}}}'
通常,您会希望标记此节点以指示它是路由反射器,从而允许 BGPPeer 资源轻松选择它。您可以使用 kubectl 执行此操作。例如:
kubectl label node my-node route-reflector=true
现在很容易将路由反射器节点配置为相互对等以及使用标签选择器的其他非路由反射器节点。例如:
kind: BGPPeer
apiVersion: projectcalico.org/v3
metadata:
name: peer-with-route-reflectors
spec:
nodeSelector: all()
peerSelector: route-reflector == 'true'
注意:添加
routeReflectorClusterID
到节点规范会立即将其从节点到节点网格中删除,从而破坏现有的 BGP 会话。添加 BGP 对等互连将启动新的 BGP 会话。这将对在发生这种情况的节点中运行的工作负载的数据平面流量造成短暂的(大约 2 秒)中断。为避免这种情况,请通过配置新节点或kubectl drain
在节点上运行(这本身可能会因工作负载耗尽而导致中断)确保节点上没有运行任何工作负载。
禁用默认的 BGP 节点到节点网格
可以关闭默认的节点到节点 BGP 网格以启用其他 BGP 拓扑。为此,请修改默认的BGP 配置资源。
运行以下命令以禁用 BGP 全连接:
calicoctl patch bgpconfiguration default -p '{"spec": {"nodeToNodeMeshEnabled": false}}'
注意:如果默认 BGP 配置资源不存在,您需要先创建它。有关详细信息,请参阅BGP 配置。
注意:禁用节点到节点网格将中断 pod 网络,直到/除非您使用 BGPPeer 资源配置替换 BGP 对等互连。您可以在禁用节点到节点网格之前配置 BGPPeer 资源,以避免 pod 网络中断。
在没有任何流量中断的情况下从节点到节点网格更改为路由反射器
从节点到节点 BGP 网格切换到 BGP 路由反射器涉及拆除 BGP 会话并启动新会话。这会导致集群中节点上运行的工作负载出现短暂的数据平面网络中断(大约 2 秒)。为了避免这种情况,您可以提供路由反射器节点并在拆除节点到节点的网状会话之前启动它们的 BGP 会话。
请按照以下步骤操作:
-
提供新节点作为路由反射器。节点不应该是可调度的 ,它们应该
routeReflectorClusterID
在它们的规范中。这些不会成为现有节点到节点 BGP 网格的一部分,并且在禁用网格时将成为路由反射器。这些节点还应该有一个标签route-reflector
,以便为 BGP 对等互连选择它们。或者,您可以通过运行从集群中的现有节点中耗尽工作负载,kubectl drain <NODE>
以便将它们配置为路由反射器,但这会在耗尽这些节点时导致这些节点上的工作负载中断。 -
还设置BGPPeer规范以将路由反射器节点配置为使用标签选择器相互对等以及与其他非路由反射器节点对等。
-
等待建立这些对等互连。这可以通过在节点上运行来验证。
sudo calicoctl node status
或者,您可以创建CalicoNodeStatus
资源以获取节点的 BGP 会话状态。 -
如果您确实从节点中耗尽了工作负载或将它们创建为不可调度,请再次将节点标记为可调度(例如通过运行
kubectl uncordon <NODE>
)。
查看节点的 BGP 对等状态
创建CalicoNodeStatus 资源以监视节点的 BGP 会话状态。
或者,您可以calicoctl node status
在给定节点上运行该命令以了解有关其 BGP 状态的更多信息。
注意:此命令与本地 Calico 代理通信,因此您必须在您尝试查看其状态的节点上执行它。
更改默认的全局 AS 号
默认情况下,所有 Calico 节点都使用 64512 自治系统,除非已为节点指定了每个节点的 AS。您可以通过修改默认BGPConfiguration资源来更改所有节点的全局默认值。以下示例命令将全局默认 AS 编号设置为64513。
calicoctl patch bgpconfiguration default -p '{"spec": {"asNumber": "64513"}}'
注意:如果默认 BGP 配置资源不存在,您需要先创建它。有关详细信息,请参阅BGP 配置。
更改特定节点的 AS 编号
您可以通过使用修改节点对象来为特定节点配置 AS calicoctl
。例如,以下命令将名为node-1的节点更改为属于AS 64514。
calicoctl patch node node-1 -p '{"spec": {"bgp": {"asNumber": "64514"}}}'