Calico的ip池对象ipPool

本文主要分析calico中的ipPool资源
关于calico的集群部署,可以参考文章:
https://www.jianshu.com/p/2f8d8b4d5296

一、环境介绍

  1. 物理环境介绍

    主机名称 系统版本 IP
    master centos7.5 172.16.91.205
    slave1 centos7.5 172.16.91.206
    slave2 centos7.5 172.16.91.207
  2. 服务部署介绍

    服务名称 版本
    docker v17.03.2-ce
    etcd v3.2.22
    calico v2.6

二、calico支持的模式?

  • BGP模式
    • 路由规则直接使用物理机网卡作为路由器转发
    • 路由即纯bgp模式,理论上ipip模式的网络传输性能低于纯bgp模式
  • IPIP模式
    • 一种妥协的overlay机制,在宿主机创建1个”tunl0”虚拟端口
    • 通过tun10作为路由转发
    • 分为两种模式:
      • ipip always模式(纯ipip模式)
      • ipip cross-subnet模式(ipip-bgp混合模式),指“同子网内路由采用bgp,跨子网路由采用ipip”

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

3.1 如何创建ipPool 资源对象?

  • 第一步:自定义yaml,如myPool.yaml
  • 第二步:通过calicoctl工具,进行资源创建
    • calicoctl create -f myPool.yaml

3.2 如何删除ipPool 资源对象?

  • 方法一:根据文件名删除
    • calicoctl delete -f myPool.yaml
  • 方法二:根据cidr删除
    • calicoctl delete ipPool 10.254.0.0/24

3.3 如何更新ipPool 资源对象?

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

四、ipPool

4.1 默认ipPool

ipPool默认情况

4.2 删除默认ipPool资源(选做)

  1. 删除之前,可以先进行备份一份:
    calicoctl get ipp -yaml > ipPool-default.yaml
    
  2. 删除


    删除默认ipPool资源

4.3 BGP模式

4.3.1 创建bgp模式下的ipPool资源对象

  1. 自定义bgp模式的ipPool资源对象
    vim ipPool-bgp.yaml

    - apiVersion: v1
    kind: ipPool
    metadata:
        cidr: 192.168.0.0/16
    spec:
        nat-outgoing: true
        disabled: false
    
  2. 创建ipPool资源

    calicoctl create -f ipPool-bgp.yaml
    
    image

4.3.2 查看物理机网卡信息

  1. 查看master节点的网卡信息
    master节点-bgp模式-网卡信息
  2. 查看slave1节点的网卡信息
    slave1节点-bgp模式-网卡信息
  3. 查看slave2节点的网卡信息
    slave2节点-bgp模式-网卡信息

4.3.3 查看物理机路由表信息

  1. 查看master节点的路由表信息
    master节点-bgp模式-路由信息
  2. 查看slave1节点的路由表信息
    slave1节点-bgp模式-路由信息
  3. 查看slave2节点的路由表信息
    slave2节点-bgp模式-路由信息

4.3.4 清理ipPool资源

calicoctl delete -f ipPool-bgp.yaml


清理资源ipPool

4.3.5 BGP模式总结:

  • BGP模式下,不会在服务器上创建tun10,
  • 路由转发功能是通过服务器的网卡对流量进行转发的

4.4 IPIP模式

4.4.1 如何设置成IPIP模式

通过显示的设置ipip属性; 

4.4.2 纯ipip模式

4.4.2.1 创建纯ipip模式下的ipPool资源对象

  1. 自定义纯ipip模式的ipPool资源对象
    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
    #默认即使false, 也就是启用此ipPool
    disabled: false 
    
  2. 创建ipPool资源
    calicoctl create -f ipPool-ipip-always.yaml
    
    ipip-always模式

4.4.2.2 查看物理机网卡信息

  1. 查看master节点的网卡信息
    master节点-ipip-always模式-网卡信息
  2. 查看slave1节点的网卡信息
    slave1节点-ipip-always模式-网卡信息
  3. 查看slave2节点的网卡信息
    slave2节点-ipip-always模式-网卡信息

4.4.2.3 查看物理机路由表信息

  1. 查看master节点的路由表信息
    master节点-ipip-always模式-路由信息
  2. 查看slave1节点的路由表信息
    slave1节点-ipip-always模式-路由信息
  3. 查看slave2节点的路由表信息
    slave2节点-ipip-always模式-路由信息

4.4.2.4 清理ipPool资源

calicoctl delete -f ipPool-ipip-always.yaml


清理ipip-always资源

4.4.2.5 总结:

ipip-always模式,

  • 会在每个节点上,都创建tun10,
  • 通过tun10进行流量转发

4.4.3 混合ipip-bgp模式

4.4.3.1 创建混合ipip-bgp模式下的ipPool资源对象

  1. 自定义混合ipip-bgp模式的ipPool资源对象
    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
    #默认即使false, 也就是启用此ipPool
    disabled: false 
    
    
  2. 创建ipPool资源

    calicoctl create -f ipPool-ipip-cross-subnet.yaml
    
    创建ipip-cross-subenet模式资源

4.4.3.2 查看物理机网卡信息

  1. 查看master节点的网卡信息
    master节点-ipip-cross-subnet模式-网卡信息
  2. 查看slave1节点的网卡信息
    slave1节点-ipip-cross-subnet模式-网卡信息
  3. 查看slave2节点的网卡信息
    slave2节点-ipip-cross-subnet模式-网卡信息

4.4.3.3 查看物理机路由表信息

  1. 查看master节点的路由表信息
    master节点-ipip-cross-subnet模式-路由信息
  2. 查看slave1节点的路由表信息
    slave1节点-ipip-cross-subnet模式-路由信息
  3. 查看slave2节点的路由表信息
    slave2节点-ipip-cross-subnet模式-路由信息

4.4.3.4 清理ipPool资源

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

4.4.4 总结

混合ipip-bgp模式 
- 有些节点创建tun10, 有些节点不创建tun10  
- 通过tun10和网卡进行流量转发   

4.5 总结整理:

1. BGP模式总结:  
    - BGP模式下,不会在服务器上创建tun10, 
    - 路由转发功能是通过服务器的网卡对流量进行转发的

2. ipip-always模式, 
    - 会在每个节点上,都创建tun10, 
    - 通过tun10进行流量转发  

3. 混合ipip-bgp模式 
    - 有些节点创建tun10, 有些节点不创建tun10  
    - 通过tun10和网卡进行流量转发   
    - 如果calico集群里,存在多个混合ipip-bgp模式资源对象的话,只有第一个创建的ipip-bgp资源对象有效, 
    后面创建一直处于阻塞状态, 经测试,只有删除第一个后,第二个会自动创建的; 
        - 也就是说,在calico集群中,同一时刻只能是第一个ipPool资源对象有效
4. libnetwork插件负责从ipPool池里,获取IP,指定给docker容器的  

五、如果calico集群里,存在多个bgp模式的ipPool资源对象的话,哪个生效?

简单的测试了几次,没发现什么规律。
肯定是测试不够充分。
查看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

六、问题列表

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

    查看libnetwork的日志:
    image

    或者说,没有定义ip 池,
    解决措施,创建一个ipPool就可以了,







微信.jpg
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335