K8S網絡插件-calico安裝


本文參考:kubernetes進階實戰 馬永亮注

1、介紹

calico是一個三層的虛擬網絡解決方案,他把每個節點都當做虛擬路由器,每個POD都是虛擬路由器下的的終端,各節點通過BGP協議生成路由規則,實現pod互通

與flannel相比calico支持網絡策略,允許用戶動態定義訪問控制規則以管控進出容器的數據報文,為POD間通信按需設置安全策略

calico默認使用IPIP,還支持XLAN 實現跨網段節點間POD的通信,BGP實現同網段節點之間的POD通信

具體信息:https://projectcalico.docs.tigera.io/about/about-calico

2、calico部署

calico/node:每個節點服務器上的代理,提供felix、bird4、bird6和confd等守護進程,可以在每個節點上獨立與k8s集群部署,也可以以deamonset,運行在k8s集群上(后面實例也才有這種方式)

calico/kube-controller:calico與k8s協同的插件

獲取清單文件:curl https://docs.projectcalico.org/manifests/calico.yaml -O

2.1、清單中的重要配置:

主要配置在calico.yaml 中的calico-node deamonset中環境變量設置

CALICO_IPV4POOL_IPIP:啟用IPIP隧道配置

Always:全流量使用IPIP隧道轉發

Cross-SubNet:跨網段節點使用IPIP隧道轉發,同一網段節點使用BGP路由直接轉發

Never:不啟用IPIP

CALICO_IPV4POOL_VXLAN::啟用VXLAN配置

Always:全流量使用VXLAN隧道轉發

Cross-SubNet:跨網段節點使用VXLAN隧道轉發,同一網段節點使用BGP路由直接轉發

Never:不啟用VXLAN

2.2、配置POD網段和網卡

在calico-node 容器中設置環境變量:

container:

    env:

     - name: IP_AUTODETECTION_METHOD

        value: interface=ens37

     - name: CALICO_IPV4POOL_CIDR

value: "10.200.0.0/16"    #注意和安裝k8s集群時為pod分配的網段一致

             - name: CALICO_IPV4POOL_BLOCK_SIZE
               value: "24"   #以該掩碼位數,給節點分配POD網段,默認值為26

 3、實驗

環境:

kube-master01: 10.0.2.200/24

kube-node01: 10.0.2.201/24

kube-node02: 10.0.2.202/24

kube-node04: 10.0.1.204/24

測試應用

kind: Namespace
apiVersion: v1
metadata:
  name: test
  namespace: test

---
kind: Deployment
apiVersion: apps/v1
metadata:
  name: test
  namespace: test
spec:
  replicas: 4
  selector:
    matchLabels:
      app: demo
  template:
    metadata:
      name: demo
      namespace: test
      labels:
        app: demo
    spec:
      containers:
      - name: demov10
        image: ikubernetes/demoapp:v1.0
        imagePullPolicy: Always
        ports:
        - name: demov10
          containerPort: 80
          protocol: TCP
        resources:
          limits:
            cpu: 100m
            memory: 100Mi
          requests:
            cpu: 50m
            memory: 50Mi
test.yaml

3.1、CALICO_IPV4POOL_VXLAN 設置為:cross-subnet

CALICO_IPV4POOL_IPIP設置為:Nerver

每個節點一個calico-node pod

外加一個calico-kube-controllers pod

可以看出各節點獲得的POD網段如下:

kube-master01:10.200.235.0/244

kube-node01:10.200.2.0/24

kube-node02: 10.200.175.0/24

kube-node04: 10.200.255.0/24

每個節點會生成一個calico.vxlan 接口,用於跨網段節點的POD間通信

10.20.255.0在kube-node04 10.0.1.204與其余三個節點不在一個網絡,通過vxlan通信,其余節點間pod通信,直接通過BGP路由通信

3.2、CALICO_IPV4POOL_VXLAN 設置為:Nerver

CALICO_IPV4POOL_IPIP設置為:ross-subnet

跨網段節點POD使用IPIP,同網段節點POD直接通過BGP路由

每個節點都會產生一個tunl0用於IPIP封裝,供跨網段節點間POD通新,同網段節點間的POD通信,直接通過BGP路由

在node節點會為每一個POD生成一個接口和POD對應

跨網段節點間POD通信

kube-node01上的pod訪問kube-node04上的pod

分別在kube-node04的ens37和tunl0口抓包分析:

 

可以看到外層IP時節點IP,內層IP為POD的IP,tunl0上也能抓到POD IP通信的報文

同一網段節點POD通信

kube-node01上的pod訪問kube-node02上的pod

在kube-node02 ens37上抓包,可以看到報文未經過IPIP封裝

 

如果集群節點超過50個,calico節點基於kubernetes API存取數據會增加API Server的通信壓力。calico提供了置清單,https://docs.projectcalico.org.manifests/calico-typha.yaml,主要添加了deployment/calico-typha和service/calico-typha兩個資源,將節點和Kubernetes API的通信集中起來,統一與API Server進行交互,減小API Server 維護鏈接的開銷 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM