Calico
Calico 是一個純三層的數據中心網絡方案(不需要Overlay),並且與OpenStack、Kubernetes、AWS、GCE等IaaS和容器平台都有良好的集成。
Calico在每一個計算節點利用Linux Kernel實現了一個高效的vRouter來負責數據轉發,而每個vRouter通過BGP協議負責把自己上運行的workload的路由信息像整個Calico網絡內傳播——小規模部署可以直接互聯,大規模下可通過指定的BGP route reflector來完成。 這樣保證最終所有的workload之間的數據流量都是通過IP路由的方式完成互聯的。Calico節點組網可以直接利用數據中心的網絡結構(無論是L2或者L3),不需要額外的NAT,隧道或者Overlay Network。
此外,Calico基於iptables還提供了豐富而靈活的網絡Policy,保證通過各個節點上的ACLs來提供Workload的多租戶隔離、安全組以及其他可達性限制等功能。
Calico架構
Calico主要由Felix、etcd、BGP client以及BGP Route Reflector組成
- Felix,Calico Agent,跑在每台需要運行Workload的節點上,主要負責配置路由及ACLs等信息來確保Endpoint的連通狀態;
- etcd,分布式鍵值存儲,主要負責網絡元數據一致性,確保Calico網絡狀態的准確性;
- BGP Client(BIRD), 主要負責把Felix寫入Kernel的路由信息分發到當前Calico網絡,確保Workload間的通信的有效性;
- BGP Route Reflector(BIRD),大規模部署時使用,摒棄所有節點互聯的 mesh 模式,通過一個或者多個BGP Route Reflector來完成集中式的路由分發。
- calico/calico-ipam,主要用作Kubernetes的CNI插件
IP-in-IP
Calico控制平面的設計要求物理網絡得是L2 Fabric,這樣vRouter間都是直接可達的,路由不需要把物理設備當做下一跳。為了支持L3 Fabric,Calico推出了IPinIP的選項。
Calico CNI
見https://github.com/projectcalico/cni-plugin。
Calico CNM
Calico通過Pool和Profile的方式實現了docker CNM網絡:
- Pool,定義可用於Docker Network的IP資源范圍,比如:10.0.0.0/8或者192.168.0.0/16;
- Profile,定義Docker Network Policy的集合,由tags和rules組成;每個 Profile默認擁有一個和Profile名字相同的Tag,每個Profile可以有多個Tag,以List形式保存。
具體實現見https://github.com/projectcalico/libnetwork-plugin,而使用方法可以參考http://docs.projectcalico.org/v3.0/getting-started/docker/。
Calico Kubernetes
對於使用 kubeadm 創建的 Kubernetes 集群,使用以下配置安裝 calico 時需要配置
--pod-network-cidr=192.168.0.0/16
--service-cidr=10.96.0.0/12
(不能與 Calico 網絡重疊)
各版本的安裝方法如下:
- 對於 Kubernetes 1.7.x 或者更新的版本
kubectl apply -f https://docs.projectcalico.org/v3.0/getting-started/kubernetes/installation/hosted/kubeadm/1.7/calico.yaml
- 對於 Kubernetes 1.6.x:
kubectl apply -f http://docs.projectcalico.org/v2.3/getting-started/kubernetes/installation/hosted/kubeadm/1.6/calico.yaml
- 對於 Kubernetes 1.5.x:
kubectl apply -f http://docs.projectcalico.org/v2.3/getting-started/kubernetes/installation/hosted/kubeadm/1.5/calico.yaml
更詳細的自定義配置方法見https://docs.projectcalico.org/v3.0/getting-started/kubernetes。
這會在Pod中啟動Calico-etcd,在所有Node上啟動bird6、felix以及confd,並配置CNI網絡為calico插件:
Calico相關進程
root@ubuntu:~# ps -ef | grep calico | grep -v grep
root 39419 39415 0 Jul01 ? 00:00:26 calico-node -monitor-addresses
root 39420 39413 1 Jul01 ? 00:16:16 calico-node -felix
root 39421 39418 0 Jul01 ? 00:00:23 calico-node -allocate-tunnel-addrs
root 39422 39416 0 Jul01 ? 00:00:28 calico-node -confd
root 39782 39417 0 Jul01 ? 00:00:24 bird6 -R -s /var/run/calico/bird6.ctl -d -c /etc/calico/confd/config/bird6.cfg
root 39783 39414 0 Jul01 ? 00:00:30 bird -R -s /var/run/calico/bird.ctl -d -c /etc/calico/confd/config/bird.cfg
CNI網絡插件配置
root@ubuntu:~# cat /etc/cni/net.d/10-calico.conflist { "name": "k8s-pod-network", "cniVersion": "0.3.1", "plugins": [ { "type": "calico", "log_level": "info", "log_file_path": "/var/log/calico/cni/cni.log", "datastore_type": "kubernetes", "nodename": "ubuntu", "mtu": 0, "ipam": { "type": "calico-ipam" }, "policy": { "type": "k8s" }, "kubernetes": { "kubeconfig": "/etc/cni/net.d/calico-kubeconfig" } }, { "type": "portmap", "snat": true, "capabilities": {"portMappings": true} }, { "type": "bandwidth", "capabilities": {"bandwidth": true} } ] }root@ubuntu:~#
root@cloud:~# cat /etc/cni/net.d/10-calico.conflist { "name": "k8s-pod-network", "cniVersion": "0.3.1", "plugins": [ { "type": "calico", "log_level": "info", "log_file_path": "/var/log/calico/cni/cni.log", "datastore_type": "kubernetes", "nodename": "cloud", "mtu": 0, "ipam": { "type": "calico-ipam" }, "policy": { "type": "k8s" }, "kubernetes": { "kubeconfig": "/etc/cni/net.d/calico-kubeconfig" } }, { "type": "portmap", "snat": true, "capabilities": {"portMappings": true} }, { "type": "bandwidth", "capabilities": {"bandwidth": true} } ] }root@cloud:~# cat /etc/cni/net.d/calico-kubeconfig # Kubeconfig file for Calico CNI plugin. apiVersion: v1 kind: Config clusters: - name: local cluster: server: https://[10.96.0.1]:443 certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN5RENDQWJDZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJeE1EY3dNVEE1TVRZME5sb1hEVE14TURZeU9UQTVNVFkwTmxvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTUtQCkIyeWJFWHRxcHVJN0UyaE01L3FXSnZKY0pqY1dyTDc2TGR3bDRCb295R2Z0cE94UFZTMGlXSmtFcGFmaHZMUjQKdUVwalpOYXllWjZlZWoxWjZOS1docWZWOUw5U1FISDVjdDg4VnVEMUhnUVZIT2NTbkxJNHozYkM2NldKeTcrcQo5TjFPMGpSb0ZZank4USs4cmxxWFVKUEJlY2ZXNnlOS21uWHd4Y2ZLOGlrTmNSVFZQTUtMOTA3aHcvZjFzVmlvCmNPSWZCVENWeXNSRmNTc0RBSm04MGRwVXpCaDE4WTNoczZWdFNNSTlmUzFobWhOSUp0aGhUTXV4aWZtQjRLSjYKclBWWmY2ekxDM3paNEVNam5UaVV5L1NWVXd4QlJCWWVuUURKc1BQS3VkWFE1a08zS0E5ZEpCNy9xekV5L05OWgo0Z1cwZDBnTldCMGc2UjFkOHowQ0F3RUFBYU1qTUNFd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFEYmtyMjRzTXlobXk0TTh1LzR5S2I4cEYzM0cKeWs2UW9CQWcvcDJzQUVQM3N5d0pGYzlBbjZkZkl1RnVVbkllTXBZcXpWZzlnazMzdGhnR2cxZWwrTGpzb2pDOApSRkZoMEpqbVMyU25hdGx1Z2JDYnlobnB2K1dDaG9ERXJQaHREM1RlclV0NHV1bUxpbjNIcXc4STJ4OXBCakhwClErU05nT0NCN1ZTNHIycHZoc2tQenU5T3lnRmRCT1hHREdNWmRrMkJmeWI2MnhTMmhjcGlsK0pqWUNUckdtSXgKQ2RwSnpsKzBKbjRmZE4zRnppOEFuRGlVUlFiV1JkdnJlU2tQaVpidEUrMVhFUG5nVFdybE1YUjNFUlFzU1lhdQp0eitFOWY2SDZ2cW8xQXROZ3JQaW9YOXpPZDFtVUlXVUNKVndzRUFLOGQ1Q1g3VlBBWEUrdDZkcGh1UT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo= users: - name: calico user: token: eyJhbGciOiJSUzI1NiIsImtpZCI6IjRScXhYMDBHcTBkOUo0OWJUMXBTNVR6MXRZOXFRRVp2RW5SWHQ1dnZLZVUifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJjYWxpY28tbm9kZS10b2tlbi1tczlxOSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJjYWxpY28tbm9kZSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjJmMWUyNDE1LWMyOTktNGMwNy1hNjM0LTU3Njk3NjQwNDllMyIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTpjYWxpY28tbm9kZSJ9.qnE0SeQWIb8cl1rclo6fjcmYU2pI34VzdI5enscouyQKiqDM9-nmjdUg2q_aMS3Mk7Reefuf1ZHOVrpPEnn6Q8C4d84WN5GnqegmFqYWxVZBlXxGUYZPK_T7AZn9oUJk_kJPAnz-Mz6TKh_UeFKwrOzGdkumo1WxdC4aeIbsWh0mByZNPXRyBGD0TccYuzidMLY5eWthyfDG-YVk1HVBWKSUw-76YEsmieSF-bzr6w3hlMwPi2vdeaHud3gZrIGHboe61MmV1B71joB2_kARATQKAH-pOD3M73ikxmqgvBX3qjju5LpGfxRlqlaF0ZawEKO_jIS12Dz6ybiKzxkj9Q contexts: - name: calico-context context: cluster: local user: calico current-context: calico-context