本文出自官方文档,原文连接

前期准备

Calico支持使用ETCDKubernetes API作为数据的存储。官方文档建议在自建的Kubernetes中使用Kubernetes API作为后端存储,混合部署时使用ETCD,如在OpenShiftKubernetes组成混合云时使用Etcd。混合云的场景我想应该比较少见,详细情况就去查看官网吧,这里使用Kubernetes API作为存储后端

安装

集群小于50节点

注意: 使用CalicoPod的网络默认将使用192.168.0.0/16的网段。如果宿主机也是该网段内,需要调整calio.yaml文件内的CALICO_IPV4POOL_CIDR

1
wget https://docs.projectcalico.org/manifests/calico.yaml

Calico的网络模式修改为BGP

默认Calico的网络模式是IPIP的。如果要更高效的转发,使用BGP

下载calicoctl

1
wget https://github.com/projectcalico/calico/releases/download/v3.19.1/release-v3.19.1.tgz

修改默认配置项

修改calico.yaml文件,搜索DaemonSet关键字,在calico/node容器的ENV中,增加以下ENV

  • 禁用IPIP

    1
    2
    
    - name: CALICO_IPV4POOL_IPIP
      value: "off"
    
  1. 指定Pod的网络地址范围。如果不指定,默认的Pod段是192.168.0.0/16,这样无论怎么配置,都不会真正实现BGP。仍然使用的是IPIP隧道模式

    1
    2
    
    - name: CALICO_IPV4POOL_CIDR
      value: 172.20.0.0/16
    
  2. 应用

    1
    
    kubectl apply -f calico.yaml
    
  3. 验证

    1
    
    kubectl get pods -n kube-system -o wide
    

容器的IP应该是在172.20.0.0/16子网内的。否则没成功。新建集群删除重新配置,直接修改无效。官网原文有这么一段话:

calico/node can be configured to create a default IP pool for you, but only if none already exist in the cluster

创建BGPConfiguration

准备YAML文件bgp.yaml,详细参数意义请参考官方文档

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
apiVersion: projectcalico.org/v3
kind: BGPConfiguration
metadata:
  name: default
spec:
  logSeverityScreen: Info
  nodeToNodeMeshEnabled: false
  asNumber: 63400
  serviceClusterIPs:
  - cidr: 10.96.0.0/12
  serviceExternalIPs:
  - cidr: 104.244.42.129/32
  - cidr: 172.217.3.0/24
  listenPort: 178
  communities:
  - name: bgp-large-community
    value: 63400:300:100
  prefixAdvertisements:
  - cidr: 172.218.4.0/26
    communities:
    - bgp-large-community
    - 63400:120

应用

1
calicoctl create -f bgp.yaml

创建BGP Peer

给准备运行Router Reflector的节点打上标签

1
kubectl label node NodeName route-reflector=true

增加BGP Peer运行的节点规则与建立连接的规则

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
cat << EOF | calicoctl create -f -
kind: BGPPeer
apiVersion: projectcalico.org/v3
metadata:
  name: peer-to-rrs
spec:
  # 规则1:普通 bgp node 与 rr 建立连接
  nodeSelector: "!has(route-reflector)"
  peerSelector: has(route-reflector)

---
kind: BGPPeer
apiVersion: projectcalico.org/v3
metadata:
  name: rr-mesh
spec:
  # 规则2:route reflectors 之间也建立连接
  nodeSelector: has(route-reflector)
  peerSelector: has(route-reflector)
EOF

确保相应主机有指定的Label

1
2
calicoctl get nodes
calicoctl get node NodeName -o yaml

验证

查看BGP Peer

1
calicoctl node status

查看路由表

1
route -n

此时,去往不同主机的Pod网段的路由应该走宿主机网卡,而不是tunl0接口。如果仍是tunl0接口,说明还是IPIP网络