本文主要分析calico中的ipPool資源
關(guān)于calico的集群部署,可以參考文章:
http://www.itdecent.cn/p/2f8d8b4d5296
一、環(huán)境介紹
-
物理環(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 -
服務(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資源(選做)
- 刪除之前,可以先進(jìn)行備份一份:
calicoctl get ipp -yaml > ipPool-default.yaml -
刪除
刪除默認(rèn)ipPool資源
4.3 BGP模式
4.3.1 創(chuàng)建bgp模式下的ipPool資源對(duì)象
-
自定義bgp模式的ipPool資源對(duì)象
vim ipPool-bgp.yaml- apiVersion: v1 kind: ipPool metadata: cidr: 192.168.0.0/16 spec: nat-outgoing: true disabled: false -
創(chuàng)建ipPool資源
calicoctl create -f ipPool-bgp.yamlimage
4.3.2 查看物理機(jī)網(wǎng)卡信息
- 查看master節(jié)點(diǎn)的網(wǎng)卡信息
master節(jié)點(diǎn)-bgp模式-網(wǎng)卡信息 - 查看slave1節(jié)點(diǎn)的網(wǎng)卡信息
slave1節(jié)點(diǎn)-bgp模式-網(wǎng)卡信息 - 查看slave2節(jié)點(diǎn)的網(wǎng)卡信息
slave2節(jié)點(diǎn)-bgp模式-網(wǎng)卡信息
4.3.3 查看物理機(jī)路由表信息
- 查看master節(jié)點(diǎn)的路由表信息
master節(jié)點(diǎn)-bgp模式-路由信息 - 查看slave1節(jié)點(diǎn)的路由表信息
slave1節(jié)點(diǎn)-bgp模式-路由信息 - 查看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ì)象
- 自定義純ipip模式的ipPool資源對(duì)象
vim ipPool-ipip-always.yamlapiVersion: 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 - 創(chuàng)建ipPool資源
calicoctl create -f ipPool-ipip-always.yamlipip-always模式
4.4.2.2 查看物理機(jī)網(wǎng)卡信息
- 查看master節(jié)點(diǎn)的網(wǎng)卡信息
master節(jié)點(diǎn)-ipip-always模式-網(wǎng)卡信息 - 查看slave1節(jié)點(diǎn)的網(wǎng)卡信息
slave1節(jié)點(diǎn)-ipip-always模式-網(wǎng)卡信息 - 查看slave2節(jié)點(diǎn)的網(wǎng)卡信息
slave2節(jié)點(diǎn)-ipip-always模式-網(wǎng)卡信息
4.4.2.3 查看物理機(jī)路由表信息
- 查看master節(jié)點(diǎn)的路由表信息
master節(jié)點(diǎn)-ipip-always模式-路由信息 - 查看slave1節(jié)點(diǎn)的路由表信息
slave1節(jié)點(diǎn)-ipip-always模式-路由信息 - 查看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ì)象
-
自定義混合ipip-bgp模式的ipPool資源對(duì)象
vim ipPool-ipip-cross-subnet.yamlapiVersion: 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 -
創(chuàng)建ipPool資源
calicoctl create -f ipPool-ipip-cross-subnet.yaml創(chuàng)建ipip-cross-subenet模式資源
4.4.3.2 查看物理機(jī)網(wǎng)卡信息
- 查看master節(jié)點(diǎn)的網(wǎng)卡信息
master節(jié)點(diǎn)-ipip-cross-subnet模式-網(wǎng)卡信息 - 查看slave1節(jié)點(diǎn)的網(wǎng)卡信息
slave1節(jié)點(diǎn)-ipip-cross-subnet模式-網(wǎng)卡信息 - 查看slave2節(jié)點(diǎn)的網(wǎng)卡信息
slave2節(jié)點(diǎn)-ipip-cross-subnet模式-網(wǎng)卡信息
4.4.3.3 查看物理機(jī)路由表信息
- 查看master節(jié)點(diǎn)的路由表信息
master節(jié)點(diǎn)-ipip-cross-subnet模式-路由信息 - 查看slave1節(jié)點(diǎn)的路由表信息
slave1節(jié)點(diǎn)-ipip-cross-subnet模式-路由信息 - 查看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)題列表
- 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