脚本中实现了 calico 和 flannel 这两种主流的网络插件,选择其中一种部署即可
1、calico
Calico是一个三层的虚拟网络解决方案,它把每个节点都当作虚拟路由器(vRouter),并把每个节点上的Pod都当作是节点路由器
后的一个终端设备并为其分配一个IP地址。各节点路由器通过BGP协议学习生成路由规则,从而实现不同节点上Pod间的互联互通。
BGP是互联网上一个核心的去中心化自治路由协议,它通过维护IP路由表或前缀
表来实现自治系统(AS)之间的可达性,通常作为大规模数据中心维护不同的自治系统之间路由信息的矢量路由协议。Linux内核原生支持BGP,因而我们可轻易把一台Linux主机配置成为边界网关。
Calico把Kubernetes集群环境中的每个节点上的Pod所组成的网络视为一个自治系统,而每个节点也就自然由各自的Pod对象组成虚拟网络,进而形成自治系统的边界网关。各节点间通过BGP协议交换路由信息并生成路由规则。
但考虑到并非所有网络都能支持BGP,而且BGP路由模型要求所有节点必须要位于同一个二层网络,所以Calico还支持基于IPIP和VXLAN的Overlay网络模型,它们的工作模式与Flannel的VXLAN和IPIP模型并无显著不同。
类似Flannel在VXLAN后端启用DirectRouting时的网络模型,Calico也支持混合使用路由和Overlay网络模型,BGP路由模型用于二层网络的高性能通信,IP-IP或VXLAN)用于跨子网的节点间报文转发。
ansible_k8s]# ansible-playbook -i example/hosts.multi-node 09.kube-calico.yml
PLAY [kube_node] ********************************************************************************************************
TASK [Copy calicoctl] ***************************************************************************************************
ok: [192.168.36.151]
ok: [192.168.36.154]
ok: [192.168.36.152]
ok: [192.168.36.155]
ok: [192.168.36.153]
PLAY [kube_client] ******************************************************************************************************
TASK [Gathering Facts] **************************************************************************************************
ok: [localhost]
TASK [kube-calico : Prepare k8s install dirs] ***************************************************************************
ok: [localhost]
TASK [kube-calico : Create calico yaml] *********************************************************************************
ok: [localhost] => (item=calico.yaml)
TASK [kube-calico : deploy calico] **************************************************************************************
ok: [localhost] => {
"msg": " kubectl apply -f /root/k8s-ansible/example/yaml/calico/calico.yaml "
}
TASK [kube-calico : Copy calicoctl] *************************************************************************************
ok: [localhost]
PLAY RECAP **************************************************************************************************************
192.168.36.151 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.36.152 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.36.153 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.36.154 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.36.155 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
localhost : ok=5 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
# 部署 calico 插件
ansible_k8s]# kubectl apply -f /root/k8s-ansible/example/yaml/calico/calico.yaml
poddisruptionbudget.policy/calico-kube-controllers configured
serviceaccount/calico-kube-controllers unchanged
serviceaccount/calico-node unchanged
serviceaccount/calico-cni-plugin unchanged
configmap/calico-config unchanged
customresourcedefinition.apiextensions.k8s.io/bgpconfigurations.crd.projectcalico.org configured
customresourcedefinition.apiextensions.k8s.io/bgpfilters.crd.projectcalico.org configured
customresourcedefinition.apiextensions.k8s.io/bgppeers.crd.projectcalico.org configured
customresourcedefinition.apiextensions.k8s.io/blockaffinities.crd.projectcalico.org configured
customresourcedefinition.apiextensions.k8s.io/caliconodestatuses.crd.projectcalico.org configured
customresourcedefinition.apiextensions.k8s.io/clusterinformations.crd.projectcalico.org configured
customresourcedefinition.apiextensions.k8s.io/felixconfigurations.crd.projectcalico.org configured
customresourcedefinition.apiextensions.k8s.io/globalnetworkpolicies.crd.projectcalico.org configured
customresourcedefinition.apiextensions.k8s.io/globalnetworksets.crd.projectcalico.org configured
customresourcedefinition.apiextensions.k8s.io/hostendpoints.crd.projectcalico.org configured
customresourcedefinition.apiextensions.k8s.io/ipamblocks.crd.projectcalico.org configured
customresourcedefinition.apiextensions.k8s.io/ipamconfigs.crd.projectcalico.org configured
customresourcedefinition.apiextensions.k8s.io/ipamhandles.crd.projectcalico.org configured
customresourcedefinition.apiextensions.k8s.io/ippools.crd.projectcalico.org configured
customresourcedefinition.apiextensions.k8s.io/ipreservations.crd.projectcalico.org configured
customresourcedefinition.apiextensions.k8s.io/kubecontrollersconfigurations.crd.projectcalico.org configured
customresourcedefinition.apiextensions.k8s.io/networkpolicies.crd.projectcalico.org configured
customresourcedefinition.apiextensions.k8s.io/networksets.crd.projectcalico.org configured
clusterrole.rbac.authorization.k8s.io/calico-kube-controllers unchanged
clusterrole.rbac.authorization.k8s.io/calico-node unchanged
clusterrole.rbac.authorization.k8s.io/calico-cni-plugin unchanged
clusterrolebinding.rbac.authorization.k8s.io/calico-kube-controllers unchanged
clusterrolebinding.rbac.authorization.k8s.io/calico-node unchanged
clusterrolebinding.rbac.authorization.k8s.io/calico-cni-plugin unchanged
daemonset.apps/calico-node configured
deployment.apps/calico-kube-controllers unchanged
[root@docker k8s-ansible]# kubectl get po -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system calico-kube-controllers-84c5fc758f-m4rvb 1/1 Running 6 (8m20s ago) 10d
kube-system calico-node-7spmb 1/1 Running 6 (8m8s ago) 10d
kube-system calico-node-b8bsq 1/1 Running 6 (8m19s ago) 10d
kube-system calico-node-fjk6b 1/1 Running 7 (7m55s ago) 10d
kube-system calico-node-m8xll 1/1 Running 10 (8m1s ago) 10d
kube-system calico-node-pn2tj 1/1 Running 7 (8m19s ago) 10d
kube-system kube-lb-rocky01.example.io 1/1 Running 14 (7m55s ago) 13d
kube-system kube-lb-rocky02.example.io 1/1 Running 14 (8m1s ago) 13d
kube-system kube-lb-rocky03.example.io 1/1 Running 10 (8m8s ago) 13d
kube-system kube-lb-rocky04.example.io 1/1 Running 10 (8m19s ago) 13d
kube-system kube-lb-rocky05.example.io 1/1 Running 10 (8m19s ago) 13d
ansible_k8s]# calicoctl get node -owide
NAME ASN IPV4 IPV6
rocky01.example.io (64512) 192.168.36.151/24
rocky02.example.io (64512) 192.168.36.152/24
rocky03.example.io (64512) 192.168.36.153/24
rocky04.example.io (64512) 192.168.36.154/24
rocky05.example.io (64512) 192.168.36.155/24
2、flannel
Flannel在每个主机上运行一个名为flanneld的二进制代理程序,它负责从预留的网络中按照指定或默认的掩码长度为当前节点申请分配一个子网,并将网络配置、已分配的子网和辅助数据(例如主机的公网IP等)存储在Kubernetes API或etcd之中。
Flannel使用称为后端的容器网络机制转发跨节点的Pod报文,它目前支持的主流后端如下。
- vxlan:使用Linux内核中的vxlan模块封装隧道报文,以Overlay网络模型支持跨节点的Pod间互联互通;同时,该后端类型支持直接路由模式(脚本中默认已添加
DirectRouting
配置),在该模式下,位于同一二层网络内节点之上的Pod间通信可通过路由模式直接发送,而跨网络的节点之上的Pod间通信仍要使用VXLAN隧道协议转发;因而,VXLAN隶属于Overlay网络模型,或混合网络模型;vxlan后端模式中,flanneld监听UDP的8472端口发送的封装数据包。 - host-gw:即Host GateWay,它类似于VXLAN中的直接路由模式,但不支持跨网络的节点,因此这种方式强制要求各节点本身必须在同一个二层网络中,不太适用于较大的网络规模;host-gw有着较好的转发性能,且易于设定,推荐对报文转发性能要求较高的场景使用。
- udp:使用常规UDP报文封装完成隧道转发,性能较前两种方式低很多,它仅在不支持前两种后端的环境中使用;UDP后端模式中,flanneld监听UDP的8285端口发送的封装报文。
ansible_k8s]# ansible-playbook -i example/hosts.multi-node 09.kube-flannel.yml
PLAY [kube_client] *************************************************************************************************
TASK [Gathering Facts] *********************************************************************************************
ok: [localhost]
TASK [kube-flannel : Prepare k8s install dirs] *********************************************************************
ok: [localhost]
TASK [Create kube-flannel.yml] *************************************************************************************
ok: [localhost]
TASK [deploy kube-flannel] *****************************************************************************************
ok: [localhost] => {
"msg": " kubectl apply -f /root/k8s-ansible/example/yaml/kube-flannel.yml "
}
PLAY RECAP *********************************************************************************************************
localhost : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
# 部署 flannel
ansible_k8s]# kubectl apply -f /root/k8s-ansible/example/yaml/kube-flannel.yml