【Calico系列】7 Calico ibgp 配置简述

相关配置步骤在官网上都有,这里只做要点记录和一些上下文的解释。很好地运用calico和bgp还需要更多数据通信方面的知识积累。

本文记录从一个使用 calico 3.10作为网络插件的 kubernetes 1.17集群,将其配置成与柜顶交换机进行 ibgp 路由交换的过程。

这个架构有比较好的扩展性,后期可以扩展机柜间使用ebgp的方式互联(但需要实现规划好机柜间的网络规划、掩码之类的,这里涉及到每个机柜承载的机器数量)。

参考的文档如下:

  1. lijiao - Calico网络的原理、组网方式与使用
  2. https://docs.projectcalico.org/networking/bgp

目前规划的情报:

主机信息:

90.90.90.1-2

交换机信息:

网关 90.90.90.90/24

网络资源:90.90.0.0/16

IP 用途
90.90.90.0/24 host IP,master vip:90.90.90.12
90.90.0.0/18 pod ip段
90.90.64.0/18 除90.90.90.0/24以外暂不使用
90.90.128.0/18 service ip段
90.90.192.0/18 暂不使用
  1. 查看集群calico状态

    1594021532695

  2. 禁用默认的 BGP fullmesh,设置AS号

    确认集群没有bgp配置信息,如果有,先备份出来。

    $ calicoctl get bgpConfiguration
    NAME   LOGSEVERITY   MESHENABLED   ASNUMBER
    

    配置下面的bgp配置信息,停用 full-mesh 模式,增加serviceIP段声明

    # 1.bgpconfig.yaml
    apiVersion: projectcalico.org/v3
    kind: BGPConfiguration
    metadata:
      name: default
    spec:
      asNumber: 64512
      logSeverityScreen: Info
      nodeToNodeMeshEnabled: false
      serviceClusterIPs:
      - cidr: 90.90.128.0/18
    

    应用:

    $ kubectl apply -f 1.bgpconfig.yaml
    Successfully applied 1 'BGPConfiguration' resource(s)
    

    集群此时bgp网络不通,不同主机的pod互ping是不通的:

    $ calicoctl node status
       
    Calico process is running.
       
    IPv4 BGP status
    No IPv4 peers found.
       
    IPv6 BGP status
    No IPv6 peers found.
       
    
  3. 配置BGP Global Peer

    # global-peer
    apiVersion: projectcalico.org/v3
    kind: BGPPeer
    metadata:
      name: bgppeer-global-router
    spec:
      peerIP: 90.90.90.90
      asNumber: 64512
    

    配置了global peer 网络就通了。如果你是多机柜的集群,由于默认的 node 配置里是没有 asn 号码的,另一个机柜中的网络也是不通的,所以,对于多机柜的集群,除了配置 Global Peer,还需要针对每个peer和node单独配置,自定义asn,自定义rr,修改掩码等。

    先查询节点的名字:

    calico get node -owide
    

    再添加一个单独的 bgppeer 配置。比如这里我对 master002 做单独的配置。

    # peer
    apiVersion: projectcalico.org/v3
    kind: BGPPeer
    metadata:
      name: master002-peer
    spec:
      asNumber: 64512
      node: master002
      peerIP: 90.90.90.90
         
    # node
    apiVersion: projectcalico.org/v3
    kind: Node
    metadata:
      name: master002
    spec:
      bgp:
        asNumber: 64512
        ipv4Address: 90.90.90.2/24
      orchRefs:
      - nodeName: master002
        orchestrator: k8s
    

    关于对node的操作,也可以参考官方的文档,更简单一些:

    calicoctl patch node node-1 -p '{"spec": {"bgp": {“asNumber”: “64512”}}}'
    

    最后的结果如下:

    1594089915629

如此配置便完成了。

再跑一个nginx,试试calico的loadbalancer功能。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-test
spec:
  selector:
    matchLabels:
      app: nginx-test
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx-test
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        resources:
          requests:
            cpu: 100m
            memory: 100Mi
        ports:
        - containerPort: 80
      restartPolicy: Always
---
kind: Service
apiVersion: v1
metadata:
  labels:
    app: nginx-test
  name: nginx-loadbalancer-test
spec:
  type: LoadBalancer
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: nginx-test

但网络运维这部分需要做的事情还远远不止,比如为节点打机柜和生产或测试标签、规划系统默认和ns的生产测试网段、配置ns网络准入、系统限制等,目前社区还没有给出具体的规范,由各厂家自己管理了。


自定义 laravel nova 记一个etcd节点重加入集群