K8S⽹络插件-calico安装
本⽂参考:kubernetes进阶实战马永亮注
1、介绍
calico是⼀个三层的虚拟⽹络解决⽅案,他把每个节点都当做虚拟路由器,每个POD都是虚拟路由器下的的终端,各节点通过BGP协议⽣成路由规则,实现pod互通
与flannel相⽐calico⽀持⽹络策略,允许⽤户动态定义访问控制规则以管控进出容器的数据报⽂,为POD间通信按需设置安全策略calico默认使⽤IPIP,还⽀持XLAN 实现跨⽹段节点间POD的通信,BGP实现同⽹段节点之间的POD通信
2、calico部署
calico/node:每个节点服务器上的代理,提供felix、bird4、bird6和confd等守护进程,可以在每个节点上独⽴与k8s集部署,也可以以deamonset,运⾏在k8s集上(后⾯实例也才有这种⽅式)
calico/kube-controller:calico与k8s协同的插件
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
nodeselector跨⽹段节点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封装