Calico的ip池對(duì)象ipPool

本文主要分析calico中的ipPool資源
關(guān)于calico的集群部署,可以參考文章:
http://www.itdecent.cn/p/2f8d8b4d5296

一、環(huán)境介紹

  1. 物理環(huán)境介紹

    主機(jī)名稱 系統(tǒng)版本 IP
    master centos7.5 172.16.91.205
    slave1 centos7.5 172.16.91.206
    slave2 centos7.5 172.16.91.207
  2. 服務(wù)部署介紹

    服務(wù)名稱 版本
    docker v17.03.2-ce
    etcd v3.2.22
    calico v2.6

二、calico支持的模式?

  • BGP模式
    • 路由規(guī)則直接使用物理機(jī)網(wǎng)卡作為路由器轉(zhuǎn)發(fā)
    • 路由即純bgp模式,理論上ipip模式的網(wǎng)絡(luò)傳輸性能低于純bgp模式
  • IPIP模式
    • 一種妥協(xié)的overlay機(jī)制,在宿主機(jī)創(chuàng)建1個(gè)”tunl0”虛擬端口
    • 通過(guò)tun10作為路由轉(zhuǎn)發(fā)
    • 分為兩種模式:
      • ipip always模式(純ipip模式)
      • ipip cross-subnet模式(ipip-bgp混合模式),指“同子網(wǎng)內(nèi)路由采用bgp,跨子網(wǎng)路由采用ipip”

三、如何管理ipPool的生命周期?

3.1 如何創(chuàng)建ipPool 資源對(duì)象?

  • 第一步:自定義yaml,如myPool.yaml
  • 第二步:通過(guò)calicoctl工具,進(jìn)行資源創(chuàng)建
    • calicoctl create -f myPool.yaml

3.2 如何刪除ipPool 資源對(duì)象?

  • 方法一:根據(jù)文件名刪除
    • calicoctl delete -f myPool.yaml
  • 方法二:根據(jù)cidr刪除
    • calicoctl delete ipPool 10.254.0.0/24

3.3 如何更新ipPool 資源對(duì)象?

  • 方法一:calicoctl apply -f myPool.yaml
  • 方法二:calicoctl replace -f myPool.yaml
    image

四、ipPool

4.1 默認(rèn)ipPool

ipPool默認(rèn)情況

4.2 刪除默認(rèn)ipPool資源(選做)

  1. 刪除之前,可以先進(jìn)行備份一份:
    calicoctl get ipp -yaml > ipPool-default.yaml
    
  2. 刪除


    刪除默認(rèn)ipPool資源

4.3 BGP模式

4.3.1 創(chuàng)建bgp模式下的ipPool資源對(duì)象

  1. 自定義bgp模式的ipPool資源對(duì)象
    vim ipPool-bgp.yaml

    - apiVersion: v1
    kind: ipPool
    metadata:
        cidr: 192.168.0.0/16
    spec:
        nat-outgoing: true
        disabled: false
    
  2. 創(chuàng)建ipPool資源

    calicoctl create -f ipPool-bgp.yaml
    
    image

4.3.2 查看物理機(jī)網(wǎng)卡信息

  1. 查看master節(jié)點(diǎn)的網(wǎng)卡信息
    master節(jié)點(diǎn)-bgp模式-網(wǎng)卡信息
  2. 查看slave1節(jié)點(diǎn)的網(wǎng)卡信息
    slave1節(jié)點(diǎn)-bgp模式-網(wǎng)卡信息
  3. 查看slave2節(jié)點(diǎn)的網(wǎng)卡信息
    slave2節(jié)點(diǎn)-bgp模式-網(wǎng)卡信息

4.3.3 查看物理機(jī)路由表信息

  1. 查看master節(jié)點(diǎn)的路由表信息
    master節(jié)點(diǎn)-bgp模式-路由信息
  2. 查看slave1節(jié)點(diǎn)的路由表信息
    slave1節(jié)點(diǎn)-bgp模式-路由信息
  3. 查看slave2節(jié)點(diǎn)的路由表信息
    slave2節(jié)點(diǎn)-bgp模式-路由信息

4.3.4 清理ipPool資源

calicoctl delete -f ipPool-bgp.yaml


清理資源ipPool

4.3.5 BGP模式總結(jié):

  • BGP模式下,不會(huì)在服務(wù)器上創(chuàng)建tun10,
  • 路由轉(zhuǎn)發(fā)功能是通過(guò)服務(wù)器的網(wǎng)卡對(duì)流量進(jìn)行轉(zhuǎn)發(fā)的

4.4 IPIP模式

4.4.1 如何設(shè)置成IPIP模式

通過(guò)顯示的設(shè)置ipip屬性; 

4.4.2 純ipip模式

4.4.2.1 創(chuàng)建純ipip模式下的ipPool資源對(duì)象

  1. 自定義純ipip模式的ipPool資源對(duì)象
    vim ipPool-ipip-always.yaml
    apiVersion: v1
    kind: ipPool
    metadata: 
    cidr: 10.254.0.0/24 
    spec:
    ipip: 
        enabled: true
        mode: always
    nat-outgoing: false
    #默認(rèn)即使false, 也就是啟用此ipPool
    disabled: false 
    
  2. 創(chuàng)建ipPool資源
    calicoctl create -f ipPool-ipip-always.yaml
    
    ipip-always模式

4.4.2.2 查看物理機(jī)網(wǎng)卡信息

  1. 查看master節(jié)點(diǎn)的網(wǎng)卡信息
    master節(jié)點(diǎn)-ipip-always模式-網(wǎng)卡信息
  2. 查看slave1節(jié)點(diǎn)的網(wǎng)卡信息
    slave1節(jié)點(diǎn)-ipip-always模式-網(wǎng)卡信息
  3. 查看slave2節(jié)點(diǎn)的網(wǎng)卡信息
    slave2節(jié)點(diǎn)-ipip-always模式-網(wǎng)卡信息

4.4.2.3 查看物理機(jī)路由表信息

  1. 查看master節(jié)點(diǎn)的路由表信息
    master節(jié)點(diǎn)-ipip-always模式-路由信息
  2. 查看slave1節(jié)點(diǎn)的路由表信息
    slave1節(jié)點(diǎn)-ipip-always模式-路由信息
  3. 查看slave2節(jié)點(diǎn)的路由表信息
    slave2節(jié)點(diǎn)-ipip-always模式-路由信息

4.4.2.4 清理ipPool資源

calicoctl delete -f ipPool-ipip-always.yaml


清理ipip-always資源

4.4.2.5 總結(jié):

ipip-always模式,

  • 會(huì)在每個(gè)節(jié)點(diǎn)上,都創(chuàng)建tun10,
  • 通過(guò)tun10進(jìn)行流量轉(zhuǎn)發(fā)

4.4.3 混合ipip-bgp模式

4.4.3.1 創(chuàng)建混合ipip-bgp模式下的ipPool資源對(duì)象

  1. 自定義混合ipip-bgp模式的ipPool資源對(duì)象
    vim ipPool-ipip-cross-subnet.yaml

    apiVersion: v1
    kind: ipPool
    metadata: 
    cidr: 10.254.0.0/24 
    spec:
    ipip: 
        enabled: true
        mode: cross-subnet
    nat-outgoing: true
    #默認(rèn)即使false, 也就是啟用此ipPool
    disabled: false 
    
    
  2. 創(chuàng)建ipPool資源

    calicoctl create -f ipPool-ipip-cross-subnet.yaml
    
    創(chuàng)建ipip-cross-subenet模式資源

4.4.3.2 查看物理機(jī)網(wǎng)卡信息

  1. 查看master節(jié)點(diǎn)的網(wǎng)卡信息
    master節(jié)點(diǎn)-ipip-cross-subnet模式-網(wǎng)卡信息
  2. 查看slave1節(jié)點(diǎn)的網(wǎng)卡信息
    slave1節(jié)點(diǎn)-ipip-cross-subnet模式-網(wǎng)卡信息
  3. 查看slave2節(jié)點(diǎn)的網(wǎng)卡信息
    slave2節(jié)點(diǎn)-ipip-cross-subnet模式-網(wǎng)卡信息

4.4.3.3 查看物理機(jī)路由表信息

  1. 查看master節(jié)點(diǎn)的路由表信息
    master節(jié)點(diǎn)-ipip-cross-subnet模式-路由信息
  2. 查看slave1節(jié)點(diǎn)的路由表信息
    slave1節(jié)點(diǎn)-ipip-cross-subnet模式-路由信息
  3. 查看slave2節(jié)點(diǎn)的路由表信息
    slave2節(jié)點(diǎn)-ipip-cross-subnet模式-路由信息

4.4.3.4 清理ipPool資源

calicoctl delete -f ipPool-ipip-cross-subnet.yaml

4.4.4 總結(jié)

混合ipip-bgp模式 
- 有些節(jié)點(diǎn)創(chuàng)建tun10, 有些節(jié)點(diǎn)不創(chuàng)建tun10  
- 通過(guò)tun10和網(wǎng)卡進(jìn)行流量轉(zhuǎn)發(fā)   

4.5 總結(jié)整理:

1. BGP模式總結(jié):  
    - BGP模式下,不會(huì)在服務(wù)器上創(chuàng)建tun10, 
    - 路由轉(zhuǎn)發(fā)功能是通過(guò)服務(wù)器的網(wǎng)卡對(duì)流量進(jìn)行轉(zhuǎn)發(fā)的

2. ipip-always模式, 
    - 會(huì)在每個(gè)節(jié)點(diǎn)上,都創(chuàng)建tun10, 
    - 通過(guò)tun10進(jìn)行流量轉(zhuǎn)發(fā)  

3. 混合ipip-bgp模式 
    - 有些節(jié)點(diǎn)創(chuàng)建tun10, 有些節(jié)點(diǎn)不創(chuàng)建tun10  
    - 通過(guò)tun10和網(wǎng)卡進(jìn)行流量轉(zhuǎn)發(fā)   
    - 如果calico集群里,存在多個(gè)混合ipip-bgp模式資源對(duì)象的話,只有第一個(gè)創(chuàng)建的ipip-bgp資源對(duì)象有效, 
    后面創(chuàng)建一直處于阻塞狀態(tài), 經(jīng)測(cè)試,只有刪除第一個(gè)后,第二個(gè)會(huì)自動(dòng)創(chuàng)建的; 
        - 也就是說(shuō),在calico集群中,同一時(shí)刻只能是第一個(gè)ipPool資源對(duì)象有效
4. libnetwork插件負(fù)責(zé)從ipPool池里,獲取IP,指定給docker容器的  

五、如果calico集群里,存在多個(gè)bgp模式的ipPool資源對(duì)象的話,哪個(gè)生效?

簡(jiǎn)單的測(cè)試了幾次,沒(méi)發(fā)現(xiàn)什么規(guī)律。
肯定是測(cè)試不夠充分。
查看calico源碼:

func (i IpamDriver) RequestPool(request *ipam.RequestPoolRequest) (*ipam.RequestPoolResponse, error) {
    logutils.JSONMessage("RequestPool", request)

    // Calico IPAM does not allow you to request a SubPool.
    if request.SubPool != "" {
        err := errors.New(
            "Calico IPAM does not support sub pool configuration " +
                "on 'docker create network'. Calico IP Pools " +
                "should be configured first and IP assignment is " +
                "from those pre-configured pools.",
        )
        log.Errorln(err)
        return nil, err
    }

    if len(request.Options) != 0 {
        err := errors.New("Arbitrary options are not supported")
        log.Errorln(err)
        return nil, err
    }
    var poolID string
    var pool string
    var gateway string
    if request.V6 {
        // Default the poolID to the fixed value.
        poolID = i.poolIDV6
        pool = "::/0"
        gateway = "::/0"
    } else {
        // Default the poolID to the fixed value.
        poolID = i.poolIDV4
        pool = "0.0.0.0/0"
        gateway = "0.0.0.0/0"
    }

    // If a pool (subnet on the CLI) is specified, it must match one of the
    // preconfigured Calico pools.
    if request.Pool != "" {
        poolsClient := i.client.IPPools()
        _, ipNet, err := caliconet.ParseCIDR(request.Pool)
        if err != nil {
            err := errors.New("Invalid CIDR")
            log.Errorln(err)
            return nil, err
        }

        pools, err := poolsClient.List(context.Background(), options.ListOptions{})
        if err != nil {
            log.Errorln(err)
            return nil, err
        }

        f := false
        for _, p := range pools.Items {
            if p.Spec.CIDR == ipNet.String() {
                f = true
                pool = p.Spec.CIDR
                poolID = p.Name
                break
            }
        }

        if !f {
            err := errors.New("The requested subnet must match the CIDR of a " +
                "configured Calico IP Pool.",
            )
            log.Errorln(err)
            return nil, err
        }
    }

    // We use static pool ID and CIDR. We don't need to signal the
    // The meta data includes a dummy gateway address. This prevents libnetwork
    // from requesting a gateway address from the pool since for a Calico
    // network our gateway is set to a special IP.
    resp := &ipam.RequestPoolResponse{
        PoolID: poolID,
        Pool:   pool,
        Data:   map[string]string{"com.docker.network.gateway": gateway},
    }

    logutils.JSONMessage("RequestPool response", resp)

    return resp, nil
}

其中,有一塊代碼邏輯是:

RequestPool

六、問(wèn)題列表

  1. docker: Error response from daemon: IpamDriver.RequestAddress: IP assignment error: No configured Calico pools.
    image

    查看libnetwork的日志:
    image

    或者說(shuō),沒(méi)有定義ip 池,
    解決措施,創(chuàng)建一個(gè)ipPool就可以了,

?
?
?
?
?
?


微信.jpg
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容