1. 概述

作为 Kubernetes 最长应用的一种网络插件,Calico 具备很强的扩展性,较优的资源利用和较少的依赖,相较于 Flannel 插件采纳 Overlay 的网络,Calico 能够通过三层路由的形式采纳性能更佳的 Underlay 网络,Calico 网络插件的转发效率是所有计划中较高的。

在应用 Calico 网络插件的理论生产环境当中,为了进步网络的性能和灵活性,须要将 K8S 的工作节点和物理网络中的 leaf 交换机建设 bgp 街坊关系,同步 bgp 路由信息,能够将 pod 网络的路由公布到物理网络中。Calico 给出了三种类型的 BGP 互联计划,别离是 Full-meshRoute reflectorsTop of Rack (ToR)

Full-mesh

全互联模式,启用了 BGP 之后,Calico 的默认行为是在每个节点彼此对等的状况下创立残缺的外部 BGP(iBGP)连贯,这使 Calico 能够在任何 L2 网络(无论是私有云还是公有云)上运行,或者说(如果配了 IPIP)能够在任何不禁止 IPIP 流量的网络上作为 overlay 运行。对于 vxlan overlay,Calico 不应用 BGP。

Full-mesh 模式对于 100 个以内的工作节点或更少节点的中小规模部署十分有用,然而在较大的规模上,Full-mesh 模式效率会升高,较大规模状况下,Calico 官网倡议应用 Route reflectors。

Route reflectors

如果想构建外部 BGP(iBGP)大规模集群,能够应用 BGP 路由反射器来缩小每个节点上应用 BGP 对等体的数量。在此模型中,某些节点充当路由反射器,并配置为在它们之间建设残缺的网格。而后,将其余节点配置为与这些路由反射器的子集(通常为冗余,通常为 2 个)进行对等,从而与全网格相比缩小了 BGP 对等连贯的总数。

Top of Rack(ToR)

在本地部署中,能够将 Calico 配置为间接与物理网络根底构造对等。通常,这须要波及到禁用 Calico 的默认 Full-mesh 行为,将所有 Calico 节点与 L3 ToR 路由器对等。

本篇文章重点会介绍如何在 BGP 网络环境下配置 Calico 路由反射器,本篇次要介绍将 K8S 工作节点作为路由反射器和物理交换机建设 BGP 连贯。配置环境拓扑如下:

在本次环境中,别离有一台 spine 交换机和两台 leaf 交换机来建设 EBGP 连贯。所有 leaf 交换机都属于一个独立的自治零碎,所有 leaf 交换机下的 node 都属于一个独立的自治零碎。Kubernetes 集群节点中每个 leaf 下由两台工作节点作为 CalicoRR(路由反射器),之所以用两台 node 作为路由反射器是思考冗余性,所有 Calico RR 都跟本人上联的 leaf 交换机建设 EBGP 连贯。Calico RR 和本人所属的 node 之间建设 iBGP 连贯。

装置 calicoctl

Calico RR 所有配置操作都须要通过 calicoctl 工具来实现, calicoctl 容许从命令创立,读取,更新和删除 Calico 对象,所以咱们首先须要在 Kubernetes 所有的工作节点上装置 calicoctl 工具。

采纳二进制形式装置 calicoctl 工具。

登录到主机,关上终端提示符,而后导航到装置二进制文件地位,个别状况下 calicoctl 装置到 /usr/local/bin/。

应用以下命令下载 calicoctl 二进制文件,版本号抉择本人 calico 的版本。

$ curl -O -L  https://github.com/projectcalico/calicoctl/releases/download/v3.17.2/calicoctl

将文件设置为可执行文件。

$ chmod +x calicoctl

每次执行 calicoctl 之前须要设置环境变量。

$ export DATASTORE_TYPE=kubernetes$ export KUBECONFIG=~/.kube/config

如果不心愿每次执行 calicoctl 之前都须要设置环境变量,能够将环境变量信息写到永恒写入到/etc/calico/calicoctl.cfg 文件里,calicoctl.cfg 配置文件编辑如下:

apiVersion: projectcalico.org/v3kind: CalicoAPIConfigmetadata:spec:  datastoreType: "kubernetes"  kubeconfig: "/root/.kube/config"

命令应用

[root@node1 ~]# calicoctl -hUsage:  calicoctl [options] <command> [<args>...]    create       Create a resource by filename or stdin.    replace      Replace a resource by filename or stdin.    apply        Apply a resource by filename or stdin.  This creates a resource                 if it does not exist, and replaces a resource if it does exists.    patch        Patch a pre-exisiting resource in place.    delete       Delete a resource identified by file, stdin or resource type and                 name.    get          Get a resource identified by file, stdin or resource type and                 name.    label        Add or update labels of resources.    convert      Convert config files between different API versions.    ipam         IP address management.    node         Calico node management.    version      Display the version of calicoctl.    export       Export the Calico datastore objects for migration    import       Import the Calico datastore objects for migration    datastore    Calico datastore management.Options:  -h --help               Show this screen.  -l --log-level=<level>  Set the log level (one of panic, fatal, error,                          warn, info, debug) [default: panic]Description:  The calicoctl command line tool is used to manage Calico network and security  policy, to view and manage endpoint configuration, and to manage a Calico  node instance.  See 'calicoctl <command> --help' to read about a specific subcommand.

敞开 Full-mesh 模式

Calico 默认是 Full-mesh 全互联模式,Calico 集群中的的节点之间都会建设连贯,进行路由替换。然而随着集群规模的扩充,mesh 模式将造成一个微小服务网格,连接数成倍增加。这时就须要应用 Route Reflector(路由器反射)模式解决这个问题。确定一个或多个 Calico 节点充当路由反射器,让其余节点从这个 RR 节点获取路由信息。

敞开 node-to-node BGP 网络,具体操作步骤如下:

增加 default BGP 配置,调整 nodeToNodeMeshEnabled 和 asNumber:

[root@node1 calico]# cat bgpconf.yamlapiVersion: projectcalico.org/v3kind: BGPConfigurationmetadata:  name: defaultspec:  logSeverityScreen: Info  nodeToNodeMeshEnabled: false  asNumber: 64512

间接利用一下,利用之后会马上禁用 Full-mesh,

[root@node1 calico]# calicoctl apply -f bgpconf.yamlSuccessfully applied 1 'BGPConfiguration' resource(s)

查看 bgp 网络配置状况,false 为敞开

[root@node1 calico]# calicoctl get bgpconfigNAME      LOGSEVERITY   MESHENABLED   ASNUMBERdefault   Info          false         64512

批改工作节点的 calico 配置

通过 calicoctl get nodes --output=wide 能够获取各节点的 ASN 号,

[root@node1 calico]# calicoctl get nodes --output=wideNAME    ASN      IPV4             IPV6node1   (64512)   172.20.0.11/24node2   (64512)   172.20.0.12/24node3   (64512)   172.20.0.13/24node4   (64512)   173.20.0.11/24node5   (64512)   173.20.0.12/24node6   (64512)   173.20.0.13/24

能够看到获取的 ASN 号都是“(64512)”,这是因为如果不给每个节点指定 ASN 号,默认都是 64512。咱们能够依照拓扑图配置各个节点的 ASN 号,不同 leaf 交换机下的节点,ASN 号不一样,每个 leaf 交换机下的工作节点都是一个独立自治零碎。

通过如下命令,获取工作节点的 calico 配置信息:

$ calicoctl get node node1 -o yaml > node1.yaml

每一个工作节点的 calico 配置信息都须要获取一下,输入为 yaml 文件,“node1”为 calico 节点的名称。

依照如下格局进行批改:

[root@node1 calico]# cat node1.yamlapiVersion: projectcalico.org/v3kind: Nodemetadata:  annotations:    projectcalico.org/kube-labels: '{"beta.kubernetes.io/arch":"amd64","beta.kubernetes.io/os":"linux","kubernetes.io/arch":"amd64","kubernetes.io/hostname":"node1","kubernetes.io/os":"linux","node-role.kubernetes.io/master":"","node-role.kubernetes.io/worker":"","rr-group":"rr1","rr-id":"rr1"}'  creationTimestamp: null  labels:    beta.kubernetes.io/arch: amd64    beta.kubernetes.io/os: linux    kubernetes.io/arch: amd64    kubernetes.io/hostname: node1    kubernetes.io/os: linux    node-role.kubernetes.io/master: ""    node-role.kubernetes.io/worker: ""  name: node1spec:  bgp:    asNumber: 64512                           ## asNumber依据本人须要进行批改    ipv4Address: 172.20.0.11/24    routeReflectorClusterID: 172.20.0.11      ## routeReflectorClusterID个别改成本人节点的IP地址  orchRefs:  - nodeName: node1    orchestrator: k8sstatus:  podCIDRs:  - ""  - 10.233.64.0/24

将所有节点的 Calico 配置信息全副批改之后,通过 calicoctl get nodes -o wide 命令获取到的节点信息如下:

[root@node1 calico]# calicoctl get nodes -o wideNAME    ASN     IPV4             IPV6node1   64512   172.20.0.11/24node2   64512   172.20.0.12/24node3   64512   172.20.0.13/24node4   64513   173.20.0.11/24node5   64513   173.20.0.12/24node6   64513   173.20.0.13/24

下面能够能够看到所有的 ASN 好都已变为手动指定的,不在是全局默认的。

为 node 节点进行分组(增加 label)

为不便让 BGPPeer 轻松抉择节点,在 Kubernetes 集群中,咱们须要将所有节点通过打 label 的形式进行分组,这里,咱们将 label 标签分为上面几种:

rr-group 这里定义为节点所属的 Calico RR 组,次要有 rr1 和 rr2 两种,为不同 leaf 交换机下的 Calico RR
rr-id 这里定义为所属 Calico RR 的 ID,节点增加了该标签阐明该节点作为了路由反射器,次要有 rr1 和 rr2 两种,为不同 leaf 交换机下的 Calico RR

通过以下命令为每个节点增加 label,

$ kubectl label nodes node1 rr-group=rr1$ kubectl label nodes node1 rr-id=rr1

查看最终设置状况,

[root@node1 calico]# kubectl get nodes --show-labelsNAME         STATUS           ROLES            AGE          VERSION         LABELSnode1   Ready    master,worker   31d   v1.17.9   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node1,kubernetes.io/os=linux,node-role.kubernetes.io/master=,node-role.kubernetes.io/worker=,rr-group=rr1,rr-id=rr1node2   Ready    master,worker   31d   v1.17.9   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node2,kubernetes.io/os=linux,node-role.kubernetes.io/master=,node-role.kubernetes.io/worker=,rr-group=rr1,rr-id=rr1node3   Ready    master,worker   31d   v1.17.9   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node3,kubernetes.io/os=linux,node-role.kubernetes.io/master=,node-role.kubernetes.io/worker=,rr-group=rr1node4   Ready    worker          16d   v1.17.9   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node4,kubernetes.io/os=linux,node-role.kubernetes.io/worker=,rr-group=rr2,rr-id=rr2node5   Ready    worker          16d   v1.17.9   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node5,kubernetes.io/os=linux,node-role.kubernetes.io/worker=,rr-group=rr2,rr-id=rr2node6   Ready    worker          16d   v1.17.9   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node5,kubernetes.io/os=linux,node-role.kubernetes.io/worker=,rr-group=rr2,rr-id=rr2

配置 BGPPeer

在配置 BGPPeer 之前,咱们能够先查看一下各个 node BGP 的节点状态,因为曾经禁用了 Full-mesh,并且当初还没有配置 BGPPeer,所以所有节点里的信息都是空的。

[root@node3 ~]# calicoctl node statusCalico process is running.IPv4 BGP statusNo IPv4 peers found.IPv6 BGP statusNo IPv6 peers found.

依据环境拓扑,node1 和 node2 作为 Calico RR,须要和 leaf01 交换机建设 BGP 连贯;node4 和 node5 作为 Calico RR 须要和 leaf02 交换机建设 BGP 连贯;node1、node2 和 node3 须要和 RR1 建设 BGP 连贯;node4、node5 和 node6 须要和 RR2 建设 BGP 连贯。依照上面步骤顺次配置:

  1. RR1 和 leaf01 建设 BGP 连贯

编写配置文件,取名为“rr1-to-leaf1-peer.yaml”,配置文件编辑如下:

[root@node1 calico]# cat rr1-to-leaf1-peer.yamlapiVersion: projectcalico.org/v3kind: BGPPeermetadata:  name: rr1-to-leaf1-peer        ## 给BGPPeer取一个名称,不便辨认spec:  nodeSelector: rr-id == 'rr1'   ## 通过节点选择器增加有rr-id == 'rr1'标签的节点  peerIP: 172.20.0.254           ##  leaf01交换机的地址  asNumber: 65009                ##  leaf01交换机的AS号

利用该配置,

[root@node1 calico]# calicoctl apply -f rr1-to-leaf1-peer.yamlSuccessfully applied 1 'BGPPeer' resource(s)
  1. RR1 和本人所属的节点建设 BGP 连贯

RR1 所属的节点次要有 node1、node2 和 node3,也就是打了 rr-group=rr1 标签的节点,配置文件编写如下:

[root@node1 calico]# cat rr1-to-node-peer.yamlapiVersion: projectcalico.org/v3kind: BGPPeermetadata:  name: rr1-to-node-peer              ## 给BGPPeer取一个名称,不便辨认spec:  nodeSelector: rr-group == 'rr1'     ## 通过节点选择器增加有rr-group == ‘rr1’标签的节点  peerSelector: rr-id  == 'rr1'       ## 通过peer选择器增加有rr-id == ‘rr1’标签的路由反射器

利用该配置,

[root@node1 calico]# calicoctl apply -f rr1-to-node-peer.yamlSuccessfully applied 1 'BGPPeer' resource(s)
  1. 在 leaf01 交换机上操作,建设 leaf01 交换机和 RR1 的 BGP 连贯,交换机配置实现后,能够查看交换机 bgp peer 的连贯状态
[leaf01]show bgp peer ipv4 BGP local router ID: 2.2.2.2 Local AS number: 65009 Total number of peers: 3          Peers in established state: 3  * - Dynamically created peer  Peer                    AS  MsgRcvd  MsgSent OutQ PrefRcv Up/Down  State  100.0.0.1            65008     1696     1677    0       8 23:52:28 Established  172.20.0.11          64512     1648     1506    0       4 23:51:50 Established  172.20.0.12          64512     1647     1659    0       4 23:51:44 Established

下面 172.20.0.11 和 172.20.0.12 是 node1 和 node2 节点,也就是 RR1。状态显示为“Established“阐明 BGP 连结已建设。

  1. RR2 和 leaf02 建设 BGP 连贯

编写配置文件,取名为“rr2-to-leaf2-peer.yaml”,配置文件编辑如下:

[root@node1 calico]# cat rr2-to-leaf2-peer.yamlapiVersion: projectcalico.org/v3kind: BGPPeermetadata:  name: rr2-to-leaf2-peer        ## 给BGPPeer取一个名称,不便辨认spec:  nodeSelector: rr-id == 'rr2'   ## 通过节点选择器增加有rr-id == 'rr2'标签的节点  peerIP: 173.20.0.254           ##  leaf02交换机的地址  asNumber: 65010                ##  leaf02交换机的AS号

利用该配置,

[root@node1 calico]# calicoctl apply -f rr2-to-leaf2-peer.yamlSuccessfully applied 1 'BGPPeer' resource(s)
  1. RR2 和本人所属的节点建设 BGP 连贯

RR2 所属的节点次要有 node4、node5 和 node6,也就是打了 rr-group=rr2 标签的节点,配置文件编写如下:

[root@node1 calico]# cat rr2-to-node-peer.yamlapiVersion: projectcalico.org/v3kind: BGPPeermetadata:  name: rr2-to-node-peer              ## 给BGPPeer取一个名称,不便辨认spec:  nodeSelector: rr-group == 'rr2'     ## 通过节点选择器增加有rr-group == ‘rr2’标签的节点  peerSelector: rr-id  == 'rr2'       ## 通过peer选择器增加有rr-id == ‘rr2’标签的路由反射器

利用该配置,

[root@node1 calico]# calicoctl apply -f rr2-to-node-peer.yamlSuccessfully applied 1 'BGPPeer' resource(s)
  1. 在 leaf02 交换机上操作,建设 leaf02 交换机和 RR2 的 BGP 连贯

交换机配置实现后,能够查看交换机 bgp peer 的连贯状态

<leaf02>sysSystem View: return to User View with Ctrl+Z.[leaf02]show bgp peer ipv4 BGP local router ID: 3.3.3.3 Local AS number: 65010 Total number of peers: 3          Peers in established state: 3  * - Dynamically created peer  Peer                    AS  MsgRcvd  MsgSent OutQ PrefRcv Up/Down  State  100.0.0.5            65008     1561     1686    0      11 24:01:03 Established  173.20.0.11          64513     1655     1650    0       2 23:59:44 Established  173.20.0.12          64513     1661     1883    0       2 23:59:56 Established

下面 173.20.0.11 和 173.20.0.12 是 node4 和 node5 节点,也就是 RR2。状态显示为“Established“阐明 BGP 连结已建设。

最初,咱们能够通过 calicoctl get bgppeer 命令来查看所有的 BGPPeer 配置条目,

[root@node1 calico]# calicoctl get bgppeerNAME                PEERIP         NODE                ASNrr1-to-leaf1-peer   172.20.0.254   rr-id == 'rr1'      65009rr1-to-node-peer                   rr-group == 'rr1'   0rr2-to-leaf2-peer   173.20.0.254   rr-id == 'rr2'      65010rr2-to-node-peer                   rr-group == 'rr2'   0

如果想删除某个 BGPPeer 条目,能够通过上面的命令

$ calicoctl delete bgppeer rr2-to-node-peer

工作节点配置验证

至此,BGPPeer 配置已实现,能够在各个节点里再次查看 BGPPeer 状态信息

在 node1 节点操作

[root@node1 calico]# calicoctl node statusCalico process is running.IPv4 BGP status+--------------+---------------+-------+------------+-------------+| PEER ADDRESS |   PEER TYPE   | STATE |   SINCE    |    INFO     |+--------------+---------------+-------+------------+-------------+| 172.20.0.12  | node specific | up    | 2021-02-16 | Established || 172.20.0.13  | node specific | up    | 2021-02-16 | Established || 172.20.0.254 | node specific | up    | 2021-02-16 | Established |+--------------+---------------+-------+------------+-------------+IPv6 BGP statusNo IPv6 peers found.

能够看到该节点曾经和 leaf01 交换机、node2 和 node3 节点建设了 BGP 连贯。

在 node2 节点操作

[root@node2 ~]# calicoctl node statusCalico process is running.IPv4 BGP status+--------------+---------------+-------+------------+-------------+| PEER ADDRESS |   PEER TYPE   | STATE |   SINCE    |    INFO     |+--------------+---------------+-------+------------+-------------+| 172.20.0.11  | node specific | up    | 2021-02-16 | Established || 172.20.0.13  | node specific | up    | 2021-02-16 | Established || 172.20.0.254 | node specific | up    | 2021-02-16 | Established |+--------------+---------------+-------+------------+-------------+IPv6 BGP statusNo IPv6 peers found.

能够看到该节点曾经和 leaf01 交换机、node1 和 node3 节点建设了 BGP 连贯。

在 node3 节点操作

[root@node3 ~]# calicoctl node statusCalico process is running.IPv4 BGP status+--------------+---------------+-------+------------+-------------+| PEER ADDRESS |   PEER TYPE   | STATE |   SINCE    |    INFO     |+--------------+---------------+-------+------------+-------------+| 172.20.0.11  | node specific | up    | 2021-02-16 | Established || 172.20.0.12  | node specific | up    | 2021-02-16 | Established |+--------------+---------------+-------+------------+-------------+IPv6 BGP statusNo IPv6 peers found.

能够看到该节点曾经和 node1 和 node2 节点建设了 BGP 连贯,因为该节点不作为路由反射器节点,所以并为与 leaf01 交换机建设 bgp 连贯。

在 node4 节点操作

[root@node4 ~]# calicoctl node statusCalico process is running.IPv4 BGP status+--------------+---------------+-------+------------+-------------+| PEER ADDRESS |   PEER TYPE   | STATE |   SINCE    |    INFO     |+--------------+---------------+-------+------------+-------------+| 173.20.0.12  | node specific | up    | 2021-02-16 | Established || 173.20.0.13  | node specific | up    | 2021-02-16 | Established || 173.20.0.254 | node specific | up    | 2021-02-16 | Established |+--------------+---------------+-------+------------+-------------+IPv6 BGP statusNo IPv6 peers found.

能够看到该节点曾经和 leaf02 交换机、node5 和 node6 节点建设了 BGP 连贯。

在 node5 节点操作

[root@node5 ~]# calicoctl node statusCalico process is running.IPv4 BGP status+--------------+---------------+-------+------------+-------------+| PEER ADDRESS |   PEER TYPE   | STATE |   SINCE    |    INFO     |+--------------+---------------+-------+------------+-------------+| 173.20.0.11  | node specific | up    | 2021-02-16 | Established || 173.20.0.13  | node specific | up    | 2021-02-16 | Established || 173.20.0.254 | node specific | up    | 2021-02-16 | Established |+--------------+---------------+-------+------------+-------------+IPv6 BGP statusNo IPv6 peers found.

能够看到该节点曾经和 leaf02 交换机、node4 和 node6 节点建设了 BGP 连贯。

在 node6 节点操作

[root@node6 ~]# calicoctl node statusCalico process is running.IPv4 BGP status+--------------+---------------+-------+------------+-------------+| PEER ADDRESS |   PEER TYPE   | STATE |   SINCE    |    INFO     |+--------------+---------------+-------+------------+-------------+| 173.20.0.11  | node specific | up    | 2021-02-16 | Established || 173.20.0.12  | node specific | up    | 2021-02-16 | Established |+--------------+---------------+-------+------------+-------------+IPv6 BGP statusNo IPv6 peers found.

能够看到该节点曾经和 node4 和 node5 节点建设了 BGP 连贯,因为该节点不作为路由反射器节点,所以并为与 leaf02 交换机建设 bgp 连贯。

交换机配置验证

咱们能够在所有交换机里去查看 BGP 同步的路由信息有没有署于 pod 的路由地址

Spine 交换机操作

Leaf01 交换机操作

Leaf02 交换机操作

在下面交换机操作截图中,10.233 结尾的地址段都是 pod 地址段的路由信息。

将 Service 地址路由同步到物理网络

有些时候不光须要 Pod 地址能够在现网可被路由,Service 地址也会有这个需要,咱们能够通过批改 bgpconfig 配置来实现 Service 地址的路由同步,

首先查看是否具备默认的 BGP 配置

[root@node1 ~]# calicoctl get bgpconfig defaultNAME      LOGSEVERITY   MESHENABLED   ASNUMBERdefault   Info          false         64512

默认的 BGP 配置是存在的,更新 BGP 配置

[root@node1 ~]# calicoctl patch BGPConfig default --patch \> '{"spec": {"serviceClusterIPs": [{"cidr": "10.233.0.0/18"}]}}'Successfully patched 1 'BGPConfiguration' resource

留神将下面 10.233.0.0./18 地址段批改为 Service 的地址段

上述配置实现之后,便能够在交换机里看到曾经同步过去的 Service 地址段的路由信息。

文档参考链接

绝大多数配置都能够通过 Calico 官网文档获取,以下就是撰写本文参考的次要官网文档链接

  • https://docs.projectcalico.org/networking/bgp
  • https://docs.projectcalico.org/getting-started/clis/calicoctl/install
  • https://docs.projectcalico.org/networking/advertise-service-ips#advertise-service-cluster-ip-addresses

    本文由博客一文多发平台 OpenWrite 公布!