Kubernetes网络-Calico

#https://www.tigera.io/project-calico/

    Calico: 
        Overlay:
            IPIP: 原生支持的隧道协议 
            VXLAN:后来添加支持的隧道协议
        Underlay: 
            三层路由:
                路由表的生成:通过BGP协议学习生成
                    要求底层网络支持BGP报文
                依赖于:部署应用程序,Daemon,从而将宿主机增强为支持BGP协议的路由器

Calico 
    后端: 
        隧道: 
            vxlan:完全不依赖于BGP
                vxlan.calico 
                    二层隧道:内部封装的是二层的帧;
            ipip:依赖于BGP
                tunl0
                    三层隧道:内部封装的三层IP报文;
        路由: 
            bgp: iBGP 
        混合模式:
            ipip, bgp

        原生支持NetworkPolicy API 

        CRD: 
            增强版的NetworkPolicy
            有一些,是提供Calico的自身维护和管理接口
                地址池:

        kubectl命令管理

        Calico也额外提供了专用客户端:calicoctl

        为Pod创建一个veth pair:
            一端注入到Pod的网络名称空间中,作为网络接口使用;
            另一端,保留在宿主机之上,直接作为专用于同该Pod通信的接口使用;而没有将其关联至一个专用的虚拟网桥上;

        默认使用的网络:
            192.168.0.0/16

            # Enable IPIP
            - name: CALICO_IPV4POOL_IPIP
              value: "Always"

              取值:
                Always:总是使用IPIP隧道协议封装跨节点的Pod间通信报文;
                Cross-Subnet:
                    跨子的节点上的Pod间通信报文,使用IPIP隧道协议封装;
                    同一个二层网络中的节点上的Pod间的通信报文,直接使用路由模式;
                        路由表的生成:基于BGP协议进行;
                Never:不使用IPIP隧道;

    部署要点:
        部署于kube-system名称空间中;
            calico-node:
                Felix 
                BIRD 
            calico-kube-controllers:
                功能之一:NetworkPolicy的Controller;

#IPIP模式-通过隧道协议传输

#默认安装好calico会安装很多crd 
[root@k8s-master01 ~]# kubectl get node k8s-master01 -o yaml
ippools.crd.projectcalico.org                          2024-01-05T04:21:29Z

#查看默认配置calico ippools使用参数
#默认是分配子网为26位的      blockSize: 26
[root@k8s-master01 ~]# kubectl get ippools
NAME                  AGE
default-ipv4-ippool   44d

[root@k8s-master01 ~]# kubectl get ippools -o yaml
apiVersion: v1
items:
- apiVersion: crd.projectcalico.org/v1
  kind: IPPool
  metadata:
    annotations:
      projectcalico.org/metadata: '{"uid":"0f4974f6-6a3f-40e7-af7a-f3005b301a0b","creationTimestamp":"2024-01-05T04:21:33Z"}'
    creationTimestamp: "2024-01-05T04:21:33Z"
    generation: 1
    name: default-ipv4-ippool
    resourceVersion: "6813"
    uid: 6e35e972-911f-4ede-8056-46a7d50111fd
  spec:
    blockSize: 26
    cidr: 172.16.0.0/16
    ipipMode: Always
    natOutgoing: true
    nodeSelector: all()
    vxlanMode: Never
kind: List
metadata:
  resourceVersion: ""

#IPIP模式
#    ipipMode: Always
    ipipMode: Always

#安装calicoctl
#https://docs.tigera.io/calico/3.26/operations/calicoctl/install
#curl -L https://github.com/projectcalico/calico/releases/download/v3.26.4/calicoctl-linux-amd64 -o calicoctl
[root@k8s-master01 ~]# mv calicoctl-linux-amd64 calicoctl
[root@k8s-master01 ~]# chmod a+x calicoctl
[root@k8s-master01 ~]# mv calicoctl /usr/bin/
[root@k8s-master01 ~]# chmod +x ./calicoctl
[root@k8s-master01 ~]# calicoctl node status
Calico process is running.

IPv4 BGP status
+----------------+-------------------+-------+----------+-------------+
|  PEER ADDRESS  |     PEER TYPE     | STATE |  SINCE   |    INFO     |
+----------------+-------------------+-------+----------+-------------+
| 192.168.40.112 | node-to-node mesh | up    | 02:05:49 | Established |
+----------------+-------------------+-------+----------+-------------+

IPv6 BGP status
No IPv6 peers found.

#实验
#创建3个pod 
[root@k8s-master01 ~]# kubectl create deployment demoapp --image=ikubernetes/demoapp:v1.0 --replicas=3
[root@k8s-master01 ~]# kubectl get pods -o wide
NAME                      READY   STATUS    RESTARTS   AGE   IP              NODE           NOMINATED NODE   READINESS GATES
demoapp-7c58cd6bb-75pf8   1/1     Running   0          72s   172.16.32.129   k8s-master01   <none>           <none>
demoapp-7c58cd6bb-dlv2l   1/1     Running   0          72s   172.16.58.203   k8s-node02     <none>           <none>
demoapp-7c58cd6bb-kqtrf   1/1     Running   0          72s   172.16.58.202   k8s-node02     <none>           <none>

#查看node2路由表 会生成相应记录 tunl0 表示隧道接口 
#172.16.32.128   192.168.40.101  255.255.255.192 UG    0      0        0 tunl0 表示到达172.16.32.128 需要网关192.168.40.101 通过tunl0隧道转发
[root@k8s-node02 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.40.2    0.0.0.0         UG    100    0        0 ens33
172.16.32.128   192.168.40.101  255.255.255.192 UG    0      0        0 tunl0
172.16.58.192   0.0.0.0         255.255.255.192 U     0      0        0 *
172.16.58.199   0.0.0.0         255.255.255.255 UH    0      0        0 cali4373dce91d4
172.16.58.200   0.0.0.0         255.255.255.255 UH    0      0        0 cali3d006ffa41c
172.16.58.201   0.0.0.0         255.255.255.255 UH    0      0        0 cali190b13b1251
172.16.58.202   0.0.0.0         255.255.255.255 UH    0      0        0 cali69ecdd194dd
172.16.58.203   0.0.0.0         255.255.255.255 UH    0      0        0 calieaff9349a21
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
192.168.40.0    0.0.0.0         255.255.255.0   U     100    0        0 ens33

#查看报文
#master上访问 node2上服务 
[root@k8s-master01 ~]# kubectl exec -it demoapp-7c58cd6bb-75pf8 /bin/sh
[root@demoapp-7c58cd6bb-75pf8 /]# while true ;do curl 172.16.58.203;done

#node2抓包[root@k8s-node02 ~]# tcpdump -i ens33 -nn host 192.168.40.112 | grep 172.16.58.203.80
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
21:34:43.726299 IP 192.168.40.101 > 192.168.40.112: IP 172.16.32.129.36092 > 172.16.58.203.80: Flags [S], seq 4140346692, win 28800, options [mss 1440,sackOK,TS val 1467744 ecr 0,nop,wscale 7], length 0 (ipip-proto-4)
21:34:43.726467 IP 192.168.40.112 > 192.168.40.101: IP 172.16.58.203.80 > 172.16.32.129.36092: Flags [S.], seq 12199371, ack 4140346693, win 28560, options [mss 1440,sackOK,TS val 1509355 ecr 1467744,nop,wscale 7], length 0 (ipip-proto-4)
21:34:43.726704 IP 192.168.40.101 > 192.168.40.112: IP 172.16.32.129.36092 > 172.16.58.203.80: Flags [.], ack 1, win 225, options [nop,nop,TS val 1467744 ecr 1509355], length 0 (ipip-proto-4)
21:34:43.726743 IP 192.168.40.101 > 192.168.40.112: IP 172.16.32.129.36092 > 172.16.58.203.80: Flags [P.], seq 1:78, ack 1, win 225, options [nop,nop,TS val 1467745 ecr 1509355], length 77: HTTP: GET / HTTP/1.1 (ipip-proto-4)
21:34:43.726804 IP 192.168.40.112 > 192.168.40.101: IP 172.16.58.203.80 > 172.16.32.129.36092: Flags [.], ack 78, win 224, options [nop,nop,TS val 1509355 ecr 1467745], length 0 (ipip-proto-4)
21:34:43.727617 IP 192.168.40.112 > 192.168.40.101: IP 172.16.58.203.80 > 172.16.32.129.36092: Flags [P.], seq 1:18, ack 78, win 224, options [nop,nop,TS val 1509356 ecr 1467745], length 17: HTTP: HTTP/1.0 200 OK (ipip-proto-4)
21:34:43.727752 IP 192.168.40.112 > 192.168.40.101: IP 172.16.58.203.80 > 172.16.32.129.36092: Flags [FP.], seq 18:270, ack 78, win 224, options [nop,nop,TS val 1509356 ecr 1467745], length 252: HTTP (ipip-proto-4)
21:34:43.727850 IP 192.168.40.101 > 192.168.40.112: IP 172.16.32.129.36092 > 172.16.58.203.80: Flags [.], ack 18, win 225, options [nop,nop,TS val 1467746 ecr 1509356], length 0 (ipip-proto-4)
21:34:43.727903 IP 192.168.40.101 > 192.168.40.112: IP 172.16.32.129.36092 > 172.16.58.203.80: Flags [F.], seq 78, ack 271, win 234, options [nop,nop,TS val 1467746 ecr 1509356], length 0 (ipip-proto-4)
21:34:43.727922 IP 192.168.40.112 > 192.168.40.101: IP 172.16.58.203.80 > 172.16.32.129.36092: Flags [.], ack 79, win 224, options [nop,nop,TS val 1509356 ecr 1467746], length 0 (ipip-proto-4)
21:34:44.230982 IP 192.168.40.101 > 192.168.40.112: IP 172.16.32.129.36098 > 172.16.58.203.80: Flags [S], seq 3334202967, win 28800, options [mss 1440,sackOK,TS val 1468249 ecr 0,nop,wscale 7], length 0 (ipip-proto-4)
21:34:44.231097 IP 192.168.40.112 > 192.168.40.101: IP 172.16.58.203.80 > 172.16.32.129.36098: Flags [S.], seq 892723298, ack 3334202968, win 28560, options [mss 1440,sackOK,TS val 1509860 ecr 1468249,nop,wscale 7], length 0 (ipip-proto-4)
21:34:44.231326 IP 192.168.40.101 > 192.168.40.112: IP 172.16.32.129.36098 > 172.16.58.203.80: Flags [.], ack 1, win 225, options [nop,nop,TS val 1468249 ecr 1509860], length 0 (ipip-proto-4)
21:34:44.231332 IP 192.168.40.101 > 192.168.40.112: IP 172.16.32.129.36098 > 172.16.58.203.80: Flags [P.], seq 1:78, ack 1, win 225, options [nop,nop,TS val 1468249 ecr 1509860], length 77: HTTP: GET / HTTP/1.1 (ipip-proto-4)
21:34:44.231385 IP 192.168.40.112 > 192.168.40.101: IP 172.16.58.203.80 > 172.16.32.129.36098: Flags [.], ack 78, win 224, options [nop,nop,TS val 1509860 ecr 1468249], length 0 (ipip-proto-4)
21:34:44.232227 IP 192.168.40.112 > 192.168.40.101: IP 172.16.58.203.80 > 172.16.32.129.36098: Flags [P.], seq 1:18, ack 78, win 224, options [nop,nop,TS val 1509861 ecr 1468249], length 17: HTTP: HTTP/1.0 200 OK (ipip-proto-4)
21:34:44.232353 IP 192.168.40.112 > 192.168.40.101: IP 172.16.58.203.80 > 172.16.32.129.36098: Flags [FP.], seq 18:270, ack 78, win 224, options [nop,nop,TS val 1509861 ecr 1468249], length 252: HTTP (ipip-proto-4)
21:34:44.232359 IP 192.168.40.101 > 192.168.40.112: IP 172.16.32.129.36098 > 172.16.58.203.80: Flags [.], ack 18, win 225, options [nop,nop,TS val 1468250 ecr 1509861], length 0 (ipip-proto-4)
21:34:44.232522 IP 192.168.40.101 > 192.168.40.112: IP 172.16.32.129.36098 > 172.16.58.203.80: Flags [F.], seq 78, ack 271, win 234, options [nop,nop,TS val 1468251 ecr 1509861], length 0 (ipip-proto-4)
21:34:44.232559 IP 192.168.40.112 > 192.168.40.101: IP 172.16.58.203.80 > 172.16.32.129.36098: Flags [.], ack 79, win 224, options [nop,nop,TS val 1509861 ecr 1468251], length 0 (ipip-proto-4)
21:34:44.735428 IP 192.168.40.101 > 192.168.40.112: IP 172.16.32.129.36102 > 172.16.58.203.80: Flags [S], seq 3038711296, win 28800, options [mss 1440,sackOK,TS val 1468754 ecr 0,nop,wscale 7], length 0 (ipip-proto-4)
21:34:44.735533 IP 192.168.40.112 > 192.168.40.101: IP 172.16.58.203.80 > 172.16.32.129.36102: Flags [S.], seq 1616882981, ack 3038711297, win 28560, options [mss 1440,sackOK,TS val 1510364 ecr 1468754,nop,wscale 7], length 0 (ipip-proto-4)
21:34:44.735671 IP 192.168.40.101 > 192.168.40.112: IP 172.16.32.129.36102 > 172.16.58.203.80: Flags [.], ack 1, win 225, options [nop,nop,TS val 1468754 ecr 1510364], length 0 (ipip-proto-4)
21:34:44.735734 IP 192.168.40.101 > 192.168.40.112: IP 172.16.32.129.36102 > 172.16.58.203.80: Flags [P.], seq 1:78, ack 1, win 225, options [nop,nop,TS val 1468754 ecr 1510364], length 77: HTTP: GET / HTTP/1.1 (ipip-proto-4)
21:34:44.735750 IP 192.168.40.112 > 192.168.40.101: IP 172.16.58.203.80 > 172.16.32.129.36102: Flags [.], ack 78, win 224, options [nop,nop,TS val 1510364 ecr 1468754], length 0 (ipip-proto-4)
21:34:44.736745 IP 192.168.40.112 > 192.168.40.101: IP 172.16.58.203.80 > 172.16.32.129.36102: Flags [P.], seq 1:18, ack 78, win 224, options [nop,nop,TS val 1510365 ecr 1468754], length 17: HTTP: HTTP/1.0 200 OK (ipip-proto-4)
21:34:44.736872 IP 192.168.40.112 > 192.168.40.101: IP 172.16.58.203.80 > 172.16.32.129.36102: Flags [FP.], seq 18:270, ack 78, win 224, options [nop,nop,TS val 1510365 ecr 1468754], length 252: HTTP (ipip-proto-4)
21:34:44.736895 IP 192.168.40.101 > 192.168.40.112: IP 172.16.32.129.36102 > 172.16.58.203.80: Flags [.], ack 18, win 225, options [nop,nop,TS val 1468755 ecr 1510365], length 0 (ipip-proto-4)
21:34:44.737004 IP 192.168.40.101 > 192.168.40.112: IP 172.16.32.129.36102 > 172.16.58.203.80: Flags [F.], seq 78, ack 271, win 234, options [nop,nop,TS val 1468755 ecr 1510365], length 0 (ipip-proto-4)
21:34:44.737050 IP 192.168.40.112 > 192.168.40.101: IP 172.16.58.203.80 > 172.16.32.129.36102: Flags [.], ack 79, win 224, options [nop,nop,TS val 1510366 ecr 1468755], length 0 (ipip-proto-4)
21:34:45.241346 IP 192.168.40.101 > 192.168.40.112: IP 172.16.32.129.36104 > 172.16.58.203.80: Flags [S], seq 78945047, win 28800, options [mss 1440,sackOK,TS val 1469259 ecr 0,nop,wscale 7], length 0 (ipip-proto-4)
21:34:45.241470 IP 192.168.40.112 > 192.168.40.101: IP 172.16.58.203.80 > 172.16.32.129.36104: Flags [S.], seq 2262026023, ack 78945048, win 28560, options [mss 1440,sackOK,TS val 1510870 ecr 1469259,nop,wscale 7], length 0 (ipip-proto-4)
21:34:45.241869 IP 192.168.40.101 > 192.168.40.112: IP 172.16.32.129.36104 > 172.16.58.203.80: Flags [.], ack 1, win 225, options [nop,nop,TS val 1469260 ecr 1510870], length 0 (ipip-proto-4)

#CrossSubnet模式-通过路由模式传输

#删除之前的pod
[root@k8s-master01 ~]# kubectl delete deployment demoapp

#获取ippools 修改  ipipMode: CrossSubnet
[root@k8s-master01 ~]# kubectl get ippools default-ipv4-ippool -o yaml > default-ipv4-ippool.yaml
[root@k8s-master01 ~]# vim default-ipv4-ippool.yaml
[root@k8s-master01 ~]# cat default-ipv4-ippool.yaml
apiVersion: crd.projectcalico.org/v1
kind: IPPool
metadata:
  annotations:
    projectcalico.org/metadata: '{"uid":"0f4974f6-6a3f-40e7-af7a-f3005b301a0b","creationTimestamp":"2024-01-05T04:21:33Z"}'
  creationTimestamp: "2024-01-05T04:21:33Z"
  generation: 1
  name: default-ipv4-ippool
  resourceVersion: "6813"
  uid: 6e35e972-911f-4ede-8056-46a7d50111fd
spec:
  blockSize: 26
  cidr: 172.16.0.0/16
  ipipMode: CrossSubnet
  natOutgoing: true
  nodeSelector: all()
  vxlanMode: Never

[root@k8s-master01 ~]# kubectl apply -f default-ipv4-ippool.yaml

#再次创建pod
[root@k8s-master01 ~]#  kubectl create deployment demoapp --image=ikubernetes/demoapp:v1.0 --replicas=3
deployment.apps/demoapp created
[root@k8s-master01 ~]# kubectl get pods -o wide
NAME                      READY   STATUS    RESTARTS   AGE   IP              NODE           NOMINATED NODE   READINESS GATES
demoapp-7c58cd6bb-5ttrh   1/1     Running   0          9s    172.16.58.205   k8s-node02     <none>           <none>
demoapp-7c58cd6bb-qz2qc   1/1     Running   0          9s    172.16.32.130   k8s-master01   <none>           <none>
demoapp-7c58cd6bb-wp2kt   1/1     Running   0          9s    172.16.58.204   k8s-node02     <none>           <none>

#查看路由表 没有隧道了

[root@k8s-node02 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.40.2    0.0.0.0         UG    100    0        0 ens33
172.16.32.128   192.168.40.101  255.255.255.192 UG    0      0        0 ens33
172.16.58.192   0.0.0.0         255.255.255.192 U     0      0        0 *
172.16.58.199   0.0.0.0         255.255.255.255 UH    0      0        0 cali4373dce91d4
172.16.58.200   0.0.0.0         255.255.255.255 UH    0      0        0 cali3d006ffa41c
172.16.58.201   0.0.0.0         255.255.255.255 UH    0      0        0 cali190b13b1251
172.16.58.204   0.0.0.0         255.255.255.255 UH    0      0        0 cali2d72f58ef6e
172.16.58.205   0.0.0.0         255.255.255.255 UH    0      0        0 cali0cc8fa4c25b
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
192.168.40.0    0.0.0.0         255.255.255.0   U     100    0        0 ens33

 

posted @ 2024-02-19 10:07  しみずよしだ  阅读(30)  评论(0)    收藏  举报