《蹲坑學K8S》之19-4:部署Calico網絡

2020-09-10 DoDo在線

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架構

1、Calico組成

主要由 Felix、etcd、BGP client 以及 BGP Route Reflector 組成:

Felix: Calico agent,跑在每臺需要運行 workload 的節點上,主要負責配置路由及 ACLs 等信息來確保 endpoint 的連通狀態;

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

BGPClient(BIRD): 主要負責把 Felix 寫入 kernel 的路由信息分發到當前 Calico 網絡,確保 workload 間的通信的有效性;

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

2、Calico網絡方式

(1)IPIP

從字面來理解,就是把一個IP數據包又套在一個IP包裡,即把 IP 層封裝到 IP 層的一個 tunnel,看起來似乎是浪費,實則不然。它的作用其實基本上就相當於一個基於IP層的網橋!一般來說,普通的網橋是基於mac層的,根本不需 IP,而這個 ipip 則是通過兩端的路由做一個 tunnel,把兩個本來不通的網絡通過點對點連接起來。ipip 的原始碼在內核 net/ipv4/ipip.c 中可以找到。

(2)BGP

邊界網關協議(Border Gateway Protocol, BGP)是網際網路上一個核心的去中心化自治路由協議。它通過維護IP路由表或『前綴』表來實現自治系統(AS)之間的可達性,屬於矢量路由協議。BGP不使用傳統的內部網關協議(IGP)的指標,而使用基於路徑、網絡策略或規則集來決定路由。因此,它更適合被稱為矢量性協議,而不是路由協議。BGP,通俗的講就是將接入到機房的多條線路(如電信、聯通、移動等)融合為一體,實現多線單IP,BGP 機房的優點:伺服器只需要設置一個IP位址,最佳訪問路由是由網絡上的骨幹路由器根據路由跳數與其它技術指標來確定的,不會佔用伺服器的任何系統。


二、Calico原理

Calico把每個作業系統的協議棧認為是一個路由器,然後把所有的容器認為是連在這個路由器上的網絡終端,在路由器之間跑標準的路由協議——BGP的協議,然後讓它們自己去學習這個網絡拓撲該如何轉發。所以Calico方案其實是一個純三層的方案,也就是說讓每臺機器的協議棧的三層去確保兩個容器,跨主機容器之間的三層連通性。

對於控制平面,它每個節點上會運行兩個主要的程序,一個是Felix,它會監聽ECTD中心的存儲,從它獲取事件,比如說用戶在這臺機器上加了一個IP,或者是分配了一個容器等。接著會在這臺機器上創建出一個容器,並將其網卡、IP、MAC都設置好,然後在內核的路由表裡面寫一條,註明這個IP應該到這張網卡。綠色部分是一個標準的路由程序,它會從內核裡面獲取哪一些IP的路由發生了變化,然後通過標準BGP的路由協議擴散到整個其他的宿主機上,讓外界都知道這個IP在這裡,你們路由的時候得到這裡來。

由於Calico是一種純三層的實現,因此可以避免與二層方案相關的數據包封裝的操作,中間沒有任何的NAT,沒有任何的overlay,所以它的轉發效率可能是所有方案中最高的,因為它的包直接走原生TCP/IP的協議棧,它的隔離也因為這個棧而變得好做。因為TCP/IP的協議棧提供了一整套的防火牆的規則,所以它可以通過IPTABLES的規則達到比較複雜的隔離邏輯。

轉發流程如下圖所示:


三、基於kubeadm部署Calico網絡

[root@k8s-master ~] cat calico.yaml | grep image:

[root@k8s-master ~] docker pull calico/pod2daemon-flexvol:v3.13.3[root@k8s-master ~] docker pull calico/kube-controllers:v3.13.3


[root@k8s-master ~]34;10.244.0.0/16& kubectl apply -f calico.yaml

[root@k8s-master ~] kubectl get pods -n kube-system | grep calico

[root@k8s-master ~] kubectl get nodes

[root@k8s-master ~] kubectl cluster-info

2、查看網絡

在k8s-master上查看:

[root@k8s-master ~] ip a

在k8s-node-2上查看:

[root@k8s-node-2 ~] vim nginx-web.yml添加:apiVersion: v1kind: Servicemetadata:  name: nginx  labels:    tier: frontendspec:  type: NodePort  selector:    tier: frontend  ports:  - name: http    port: 80    targetPort: 80---apiVersion: apps/v1kind: Deploymentmetadata:  name: nginxspec:  replicas: 2  selector:    matchLabels:     tier: frontend  template:    metadata:      labels:        tier: frontend    spec:     containers:     - name: nginx       image: nginx:1.16       ports:       - name: http         containerPort: 80

[root@k8s-master ~] kubectl get pods[root@k8s-master ~] ping 10.244.109.67[root@k8s-master ~] curl http://10.244.109.67

[root@k8s-master ~] wget https://github.com/projectcalico/calicoctl/releases/download/v3.14.0/calicoctl  [root@k8s-master ~] cp calicoctl /usr/local/bin/ [root@k8s-master ~] scp calicoctl 192.168.1.2:/usr/local/bin/

[root@k8s-master ~] calicoctl node status

k8s-node-1查看網絡狀態

[root@k8s-node-1 ~] calicoctl node status

驗證網絡:

[root@k8s-master ~] netstat -antlp | grep ESTABLISHED | grep bird

[root@k8s-node-1 ~] netstat -antlp | grep ESTABLISHED | grep bird


相關焦點

  • 《蹲坑學K8S》之19-5:二進位部署Calico網絡
    二進位部署kubernetes完畢後,查看群集狀態為NotReady,現在開始二進位部署calico網絡在kubelet添加cni配置[root@k8s-master~] wget https://docs.projectcalico.org/manifests/calico-etcd.yaml 2、下載鏡像[root@k8s-master ~] docker pull calico/cni:v3.14.0[root@k8s-master ~] docker pull calico/node
  • 《蹲坑學K8S》之19-6:部署Weave網絡
    這種方式省去了集中式的K/V Store,能夠在一定程度上減低部署的複雜性,Weave將其稱為「data centric」,而非RAFT或者Paxos的「algorithm centric」。這樣,容器網絡為所有容器都連接到weave網橋weave網橋通過veth pair連到內核的openvswitch模塊跨主機容器通過openvswitch vxlan通信policy controller通過配置iptables規則為容器設置網絡策略
  • 處理一次k8s、calico無法分配podIP的心路歷程
    一個網絡錯誤某天,上kplcloud構建一個測試應用,構建完成之後發現新pod一直啟動失敗,並且拋出了以下錯誤信息:Failed create pod sandbox: rpc error: code = Unknown desc = NetworkPlugin cni failed
  • 《蹲坑學kubernetes》之19-2:部署Flannel
    一、安裝部署flannel網絡(一)Etcd中網絡設置1、在Etcd中網絡設置:kubernetes/ssl/etcd-key.pem  --endpoints=&34;  set /coreos.com/network/config &34;Network&34;10.244.0.0/16&34;Backend&34;Type&34; host-gw&39; 3、查看網絡設置
  • 免翻牆安裝k8s 1.15.1
    準備安裝kubernetes的鏡像4.1 查看安裝需要的鏡像kubeadm在安裝時需要從k8s.io官網下載一些必要的docker images,因為科學上網原因,會一直卡在拉取images階段,因此,我們需要先手動下載必要的Images。
  • 《蹲坑學K8S》之23-1:安裝部署Istio
    Istio安裝方式:(1)使用 Istioctl 安裝(2)使用 Helm 自定義安裝(3)安裝獨立 Operator [實驗](4)多集群安裝使用IstioctlKubernetes群集以後,還有部署以下組件以及功能模塊。
  • 《蹲坑學K8S》之19-3:Flannel通信原理
    然後,以pause的網絡命名空間為基礎,創建同一個Pod內的其它容器(–net=container:xxx)。因此,同一個Pod內的所有容器就會共享同一個網絡命名空間,在同一個Pod之間的容器可以直接使用localhost進行通信。
  • 《蹲坑學K8S》之19-3:Flannel通信原理
    然後,以pause的網絡命名空間為基礎,創建同一個Pod內的其它容器(–net=container:xxx)。因此,同一個Pod內的所有容器就會共享同一個網絡命名空間,在同一個Pod之間的容器可以直接使用localhost進行通信。
  • 使用kubeadm的方式搭建K8S高可用集群
     << EOFnet.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1net.ipv4.ip_forward = 1vm.swappiness=0EOF使之生效
  • 和我一起學k8s(二)二進位部署一套k8s集群
    環境準備1、軟體版本kubernetes v1.18.8docker v19.03.9-ceEtcd v3.4.9calico.tgz2、部署dockertar zxvf docker-19.03.9.tgzmv docker/* /usr/bin3、創建docker的systemd
  • 《蹲坑學K8S》之20-4:GlusterFS存儲
    GlusterFS 藉助 TCP/IP 或 InfiniBand RDMA 網絡將物理分布的存儲資源聚集在一起,使用單一全局命名空間來管理數據。GlusterFS 基於可堆疊的用戶空間設計,可為各種不同的數據負載提供優異的性能。
  • 《蹲坑學K8S》之20-3:Ceph存儲
    ceph目前Ceph官方提供三種部署Ceph集群的方法,分別是ceph-deploy,cephadm和手動安裝:ceph-deploy,一個集群自動化部署工具,使用較久,成熟穩定,被很多自動化工具所集成,可用於生產部署;cephadm,從Octopus開始提供的新集群部署工具,支持通過圖形界面或者命令行界面添加節點,目前不建議用於生產環境
  • 《蹲坑學Kubernetes》之:kubeadm部署Kubernetes-v1.18.6群集
    注意:在k8-smaster、k8s-node-1、k8s-node-2安裝Docker。-1和k8s-node-2中安裝Kubeadm。 4、創建kubernetes集群(1)查看該版本的容器鏡像版本[root@k8s-master ~] vim k8s-dowm-images.sh添加: 使用如下腳本下載國內鏡像,並修改tag為google的tagset -eKUBE_VERSION=v1.18.6KUBE_PAUSE_VERSION
  • 《蹲坑學kubernetes》之十九:網絡
    二、Kubernetes網絡有四種組建網絡場景:1、容器間通信這發生於Pod內,可以認為是本地host的流量。2、Pod間通信Pod是可以被Kubernetes創建和管理的最小可部署的計算單元。4、外部和內部服務間通信允許外部流量進入集群,主要是通過映射外部的負載均衡器顯示的發現集群中的服務。該映射允許Kube-intermediary使用集群的pod網絡對適當的pod進行外部請求。
  • k8s集群構建:官方推薦之KubeAdm安裝
    前面文章介紹了rancher安裝k8s集群方式,詳情參見()。本文將介紹官方推薦方式:kubeAdm安裝k8s集群。集群機器- 192.168.0.114 : master01節點。注意master節點CPU至少分配2核。
  • 乾貨|帶您了解k8s
    Docker的第三類編排工具:kubernetes(簡稱k8s):這個容器編排工具佔用了80%的市場份額。有了容器和容器編排技術,對持續集成(CI)、持續交付Delivery(CD)和持續部署Deployment(CD)的需求變為可能,這也就是DevOps的理念。注意:DevOps並不是一種技術,而是一種運動,一種文化。
  • Rancher Calico BGP 對接 F5
    Rancher Calico BGP 配置K8S 集群部署目前 Rancher UI 部署 Calico 網絡驅動暫不支持自定義高級配置,對於某些高級功能,需要通過手動修改網絡驅動工作負載配置來實現。但是,在下一次升級 K8S 集群的時候可能會導致網絡驅動自定義配置丟失。
  • 《蹲坑學kubernetes》之四:了解Kubernetes安裝部署方式
    在實際的應用中也會有不同的選擇,那麼你會選擇哪種方式部署Kubernetes呢?圖1:Kubernetes之Log本節內容提綱:安裝Minikube使用kubeadm方式安裝k8s二進位方式部署在實際應用中,針對Kubernetes的不同應用目的,選擇安裝部署的方式也不一樣。
  • 《蹲坑學K8S》之22-2:Kubernetes授權機制
    RBAC引入了4個新的頂級資源對象:Role、ClusterRole、RoleBinding、ClusterRoleBinding。同其他API資源對象一樣,用戶可以使用kubectl或者API調用等方式操作這些資源對象。
  • 《蹲坑學kubernetes》之17-14:ServerAccount
    《蹲坑學kubernetes》之17-14:ServerAccount API Server作為Kubernetes網關,是訪問和管理資源對象的唯一入口,其各種集群組件訪問資源都需要經過網關才能進行正常訪問和管理。