Kubernetes
  • 序言
  • 基礎入門
    • Kubernetes 簡介
    • Kubernetes 基本概念
    • Kubernetes 101
    • Kubernetes 201
    • Kubernetes 集群
  • 核心原理
    • 核心原理
    • 架構原理
    • 設計理念
    • 核心組件
      • etcd
      • kube-apiserver
      • kube-scheduler
      • kube-controller-manager
      • kubelet
      • kube-proxy
      • kube-dns
      • Federation
      • kubeadm
      • hyperkube
      • kubectl
    • 資源對象
      • Autoscaling
      • ConfigMap
      • CronJob
      • CustomResourceDefinition
      • DaemonSet
      • Deployment
      • Ingress
      • Job
      • LocalVolume
      • Namespace
      • NetworkPolicy
      • Node
      • PersistentVolume
      • Pod
      • PodPreset
      • ReplicaSet
      • Resource Quota
      • Secret
      • SecurityContext
      • Service
      • ServiceAccount
      • StatefulSet
      • Volume
  • 部署配置
    • 部署指南
    • kubectl 安裝
    • 單機部署
    • 特性開關
    • 最佳配置
    • 版本支持
    • 集群部署
      • kubeadm
      • kops
      • Kubespray
      • Azure
      • Windows
      • LinuxKit
      • kubeasz
    • 附加組件
      • Addon-manager
      • DNS
      • Dashboard
      • 監控
      • 日誌
      • Metrics
      • GPU
      • Cluster Autoscaler
      • ip-masq-agent
    • Kubernetes-The-Hard-Way
      • 準備部署環境
      • 安裝必要工具
      • 創建計算資源
      • 配置創建證書
      • 配置生成配置
      • 配置生成密鑰
      • 部署 Etcd 群集
      • 部署控制節點
      • 部署計算節點
      • 配置 Kubectl
      • 配置網絡路由
      • 部署 DNS 擴展
      • 煙霧測試
      • 刪除集群
  • 插件擴展
    • API 擴展
      • Aggregation
      • CustomResourceDefinition
    • 訪問控制
      • 認證
      • RBAC 授權
      • 准入控制
    • Scheduler 擴展
    • 網絡插件
      • CNI
      • Flannel
      • Calico
      • Weave
      • Cilium
      • OVN
      • Contiv
      • SR-IOV
      • Romana
      • OpenContrail
      • Kuryr
    • 運行時插件 CRI
      • CRI-tools
      • Frakti
    • 存儲插件
      • 容器存儲接口 CSI
      • FlexVolume
      • glusterfs
    • 網絡策略
    • Ingress Controller
      • Ingress + Letsencrypt
      • minikube Ingress
      • Traefik Ingress
      • Keepalived-VIP
    • Cloud Provider 擴展
    • Device 插件
  • 服務治理
    • 服務治理
      • 一般準則
      • 滾動升級
      • Helm
      • Operator
      • Service Mesh
      • Linkerd
      • Linkerd2
    • Istio
      • 安裝
      • 流量管理
      • 安全管理
      • 策略管理
      • 度量管理
      • 排錯
      • 社區
    • Devops
      • Draft
      • Jenkins X
      • Spinnaker
      • Kompose
      • Skaffold
      • Argo
      • Flux GitOps
  • 實踐案例
    • 實踐概覽
    • 資源控制
    • 集群高可用
    • 應用高可用
    • 調試
    • 端口映射
    • 端口轉發
    • 用戶管理
    • GPU
    • HugePage
    • 安全
    • 審計
    • 備份恢復
    • 證書輪換
    • 大規模集群
    • 大數據與機器學習
      • Spark
      • Tensorflow
    • Serverless
  • 排錯指南
    • 排錯概覽
    • 集群排錯
    • Pod 排錯
    • 網絡排錯
    • PV 排錯
      • AzureDisk
      • AzureFile
    • Windows 排錯
    • 雲平臺排錯
      • Azure
    • 排錯工具
  • 社區貢獻
    • 開發指南
    • 單元測試和集成測試
    • 社區貢獻
  • 附錄
    • 生態圈
    • 學習資源
    • 國內鏡像
    • 如何貢獻
    • 參考文檔
Powered by GitBook
On this page
  • Calico 架構
  • IP-in-IP
  • Calico CNI
  • Calico CNM
  • Calico Kubernetes
  • Calico 的不足
  1. 插件擴展
  2. 網絡插件

Calico

PreviousFlannelNextWeave

Last updated 1 year ago

是一個純三層的數據中心網絡方案(不需要 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 組成

  1. Felix,Calico Agent,跑在每臺需要運行 Workload 的節點上,主要負責配置路由及 ACLs 等信息來確保 Endpoint 的連通狀態;

  2. etcd,分佈式鍵值存儲,主要負責網絡元數據一致性,確保 Calico 網絡狀態的準確性;

  3. BGP Client(BIRD), 主要負責把 Felix 寫入 Kernel 的路由信息分發到當前 Calico 網絡,確保 Workload 間的通信的有效性;

  4. BGP Route Reflector(BIRD),大規模部署時使用,摒棄所有節點互聯的 mesh 模式,通過一個或者多個 BGP Route Reflector 來完成集中式的路由分發。

  5. calico/calico-ipam,主要用作 Kubernetes 的 CNI 插件

IP-in-IP

Calico 控制平面的設計要求物理網絡得是 L2 Fabric,這樣 vRouter 間都是直接可達的,路由不需要把物理設備當做下一跳。爲了支持 L3 Fabric,Calico 推出了 IPinIP 的選項。

Calico CNI

Calico CNM

Calico 通過 Pool 和 Profile 的方式實現了 docker CNM 網絡:

  1. Pool,定義可用於 Docker Network 的 IP 資源範圍,比如:10.0.0.0/8 或者 192.168.0.0/16;

  2. Profile,定義 Docker Network Policy 的集合,由 tags 和 rules 組成;每個 Profile 默認擁有一個和 Profile 名字相同的 Tag,每個 Profile 可以有多個 Tag,以 List 形式保存。

Calico Kubernetes

對於使用 kubeadm 創建的 Kubernetes 集群,使用以下配置安裝 calico 時需要配置

  • --pod-network-cidr=192.168.0.0/16

  • --service-cidr=10.96.0.0/12 (不能與 Calico 網絡重疊)

然後運行

kubectl apply -f https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/rbac-kdd.yaml
kubectl apply -f https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/kubernetes-datastore/calico-networking/1.7/calico.yaml

這會在 Pod 中啓動 Calico-etcd,在所有 Node 上啓動 bird6、felix 以及 confd,並配置 CNI 網絡爲 calico 插件:

# Calico 相關進程
$ ps -ef | grep calico | grep -v grep
root      9012  8995  0 14:51 ?        00:00:00 /bin/sh -c /usr/local/bin/etcd --name=calico --data-dir=/var/etcd/calico-data --advertise-client-urls=http://$CALICO_ETCD_IP:6666 --listen-client-urls=http://0.0.0.0:6666 --listen-peer-urls=http://0.0.0.0:6667
root      9038  9012  0 14:51 ?        00:00:01 /usr/local/bin/etcd --name=calico --data-dir=/var/etcd/calico-data --advertise-client-urls=http://10.146.0.2:6666 --listen-client-urls=http://0.0.0.0:6666 --listen-peer-urls=http://0.0.0.0:6667
root      9326  9325  0 14:51 ?        00:00:00 bird6 -R -s /var/run/calico/bird6.ctl -d -c /etc/calico/confd/config/bird6.cfg
root      9327  9322  0 14:51 ?        00:00:00 confd -confdir=/etc/calico/confd -interval=5 -watch --log-level=debug -node=http://10.96.232.136:6666 -client-key= -client-cert= -client-ca-keys=
root      9328  9324  0 14:51 ?        00:00:00 bird -R -s /var/run/calico/bird.ctl -d -c /etc/calico/confd/config/bird.cfg
root      9329  9323  1 14:51 ?        00:00:04 calico-felix
# CNI 網絡插件配置
$ cat /etc/cni/net.d/10-calico.conf
{
    "name": "k8s-pod-network",
    "cniVersion": "0.1.0",
    "type": "calico",
    "etcd_endpoints": "http://10.96.232.136:6666",
    "log_level": "info",
    "ipam": {
        "type": "calico-ipam"
    },
    "policy": {
        "type": "k8s",
         "k8s_api_root": "https://10.96.0.1:443",
         "k8s_auth_token": "<token>"
    },
    "kubernetes": {
        "kubeconfig": "/etc/cni/net.d/calico-kubeconfig"
    }
}

$ cat /etc/cni/net.d/calico-kubeconfig
# Kubeconfig file for Calico CNI plugin.
apiVersion: v1
kind: Config
clusters:
- name: local
  cluster:
    insecure-skip-tls-verify: true
users:
- name: calico
contexts:
- name: calico-context
  context:
    cluster: local
    user: calico
current-context: calico-context

Calico 的不足

  • 既然是三層實現,當然不支持 VRF

  • 不支持多租戶網絡的隔離功能,在多租戶場景下會有網絡安全問題

  • Calico 控制平面的設計要求物理網絡得是 L2 Fabric,這樣 vRouter 間都是直接可達的

參考文檔

見 。

具體實現見 。

更詳細的自定義配置方法見 。

https://github.com/projectcalico/cni-plugin
https://github.com/projectcalico/libnetwork-plugin
https://docs.projectcalico.org/v3.0/getting-started/kubernetes
https://xuxinkun.github.io/2016/07/22/cni-cnm/
https://www.projectcalico.org/
http://blog.dataman-inc.com/shurenyun-docker-133/
Calico