flannel,canal,网络控制
docker网络:
bridge 自连网络名称空间
joined 与另外容器共享使用网络名称空间
open 容器直接共享宿主机的网络名称空间
none 不使用任何网络名称空间
k8s网络通信模型
- 容器间网络通信:同一个pod内的多个容器间的通信,lo
- pod间通信: pod ip <--> pod ip 直连
- pod与service通信 pod ip <--> clusterip iptables实现
- service与集群外部客户端的通信 nodeport ingress loadblance实现
CNI 容器网络接口
- flannel 仅支持地址分配
- calico 支持地址分配 也支持网络策略
- canal flannel+calico
- kube-router
解决方案:
虚拟网桥
多路复用:MacVLAN
硬件交换:SR-IOR 虚拟出多个硬件网卡
名称空间隔离的是权限,不会隔离网络,pod与pod之间网络的隔离要用网络策略实现
flannel不支持网络策略
网络插件使用: kubelet /etc/cni/net.d/*** 比如 kubelet /etc/cni/net.d/10-flannel.conflist --help
flannel网络
默认vxlan作为后端传输机制
1.原生vxlan overray node 跨网段
2.Drirectrouting node即支持同一网段也支持跨网段overray, 跨网段由就用vxlan overray,同一网段就是直接路由,如果node间同一网段,就用直接路由模式,如果跨了网段,就自动降为vxlan overray,直接路由方式就是用的 host_gw,类似于桥接方式
host_gw: Host Gateway node仅支持同一网段,直接走node的node_gateway网关,node的物理网络IP作为路由,即直接路由
udp 普通报文
flannel.1 封装后端协议报文的
flannel网络配置参数
kubectl get configmaps -n kube-system
kubectl get configmaps -n kube-system kube-flannel-cfg -o yaml
Network: flannel使用的cidr格式的网络地址,用于为pod配置网络功能 10.244.0.0/16 -->master: 10.244.0.0/24 node1:10.244.1.0/24 .. node255:10.244.255.0/24
或者 10.0.0.0/8 --> 10.0.0.0/24 10.255.255.0/24
Subnetlen:把network切分子网供供给各节点使用时,使用多长的掩码进行切分,默认为24位;
Subnetmin: 10.244.10.0/24 起始子网
Subnetmax: 10.244.100.0/24 结束子网
Backend:后端通信方式 vxlan(vxlan和directrouting), host-gw, udp
查看网桥
yum install brctls-utils -y
brctl show cni0
到各node抓包分析
跨节点node的pod ping测试
yum install tcpdump -y
tcpdump -i cni0 icmp
pod -->node1下的cni0 --->node1下的flannel.1 -->node2下的flannel.1-->node2下的cni0 --> pod
ip route show
10.244.1.0/24 via 10.244.1.0 dev flannel.1 onlink
10.244.2.0/24 via 10.244.2.0 dev flannel.1 onlink
tcpdump -i flannel.1 -nn
抓包分析node间物理网络
tcpdump -i ens33 -nn host 192.168.81.30
12:18:23.231595 IP node2.55445 > node1.otv: OTV, flags [I] (0x08), overlay 0, instance 1
IP myapp-1.myapp-svc.default.svc.cluster.local > myapp-0.myapp-svc.default.svc.cluster.local: ICMP echo reply, id 3840, seq 20, length 64
看出是overlay网络,即用的vxlan模型 且有pod的通信包 即隧道转发
实验
将flannel改成vxlan-directrouting通信
1.通过json到config
mkdir flannel && cd flannel/
vim net-conf.json
{
"Network": "10.244.0.0/16",
"Backend": {
"Type": "vxlan",
"Directrouting": "true"
}
}
2.edit
kubectl -n kube-system edit configmaps kube-flannel-cfg
"Backend": {
"Type": "vxlan",
"Directrouting": true
}
ip route show 查看路由
flannel重读配置文件生效
3.重新声明yaml清单
vim kube-flannel.yml
net-conf.json: |
{
"Network": "10.244.0.0/16",
"Backend": {
"Type": "vxlan",
"Directrouting": true
}
}
kubectl delete -f kube-flannel.yml
kubectl apply -f kube-flannel.yml
ip route show
10.244.1.0/24 via 192.168.81.20 dev ens33
10.244.2.0/24 via 192.168.81.30 dev ens33 直接路由生效了
新建pod测试
kubectl delete -f deploy-demo.yaml
kubectl apply -f deploy-demo.yaml
kubectl exec -it myapp-deploy-55b78d8548-8dtpv -- /bin/sh
ping 10.244.2.131 ping另一节点新创建的pod
在node上抓包
tcpdump -i ens33 -nn host 192.168.81.30 已经按不到overay网络包了,说明走的直接路由, node的物理网络IP作为路由
将flannel改成vxlan-directrouting通信
vim kube-flannel.yml
net-conf.json: |
{
"Network": "10.244.0.0/16",
"Backend": {
"Type": "host-gw”
}
}
kubectl delete -f kube-flannel.yml
kubectl apply -f kube-flannel.yml
ip route show
10.244.1.0/24 via 192.168.81.20 dev ens33
10.244.2.0/24 via 192.168.81.30 dev ens33
canal部署
https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/flannel
kubectl apply -f https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/canal/rbac.yaml
kubectl apply -f https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/canal/canal.yaml
kubectl get pods -n kube-system
控制网络策略
kubectl explain networkpolicy
kubectl explain networkpolicy.spec
出站
kubectl explain networkpolicy.spec.egress
kubectl explain networkpolicy.spec.egress.ports
kubectl explain networkpolicy.spec.egress.to
入站
kubectl explain networkpolicy.spec.ingress
policyTypes <[]string>
kubectl explain networkpolicy.spec.policyTypes
ingress控制
mkdir networkpolicy && cd networkpolicy/
vim ingress-def.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-ingress
# namespace: dev
spec:
podSelector: {} 空,表示选名称空间中所有的pod
policyTypes: 定义使用哪个策略
- Ingress 表示启用ingress 如果没写ingress规则,表示拒绝所有ingress。如果policyType下面没写- engress,表示不控制engress,放开所有engress
创建ns
kubectl create namespace dev
kubectl create namespace prod
创建规则
kubectl apply -f ingress-def.yaml -n dev 外面指定namespace
查询规则
kubectl get networkpolicy -n dev
验证
vim pod-a.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod1
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
给dev空间创建一个pod
kubectl apply -f pod-a.yaml -n dev
curl 10.244.1.7 不能访问 在dev定义了ingress 拒绝了
kubectl apply -f pod-a.yaml -n prod
curl 10.244.1.8
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
vim ingress-def.yaml
spec:
podSelector: {}
ingress: 定义ingress规则
- {} 没写内容,表示放行所有
kubectl apply -f ingress-def.yaml -n dev
curl 10.244.1.7
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a> 又能访问了
打上标签
kubectl label pods pod1 app=myapp -n dev
vim allow-netpolicy-demo.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-maypp-ingress
spec:
podSelector: 选择控制哪些pod 通过pod标签
matchLabels:
app: myapp
ingress: ingress规则
- from: 远端的地址
- ipBlock: 地址块
cidr: 10.244.0.0/16 允许cidr类这个网段都放行
except: 除了这个
- 10.244.1.2/32
ports: 允许的端口
- protocol: TCP
port: 80 没写就表示所有端口都放行
创建规则
kubectl apply -f allow-netpolicy-demo.yaml -n dev
egress控制
cp ingress-def.yaml egress-def.yaml
vim egress-def.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-egress
spec:
podSelector: {}
policyTypes:
- Egress 使用出站规则 如果没定义egress,表示拒绝所有
网络访问控制规则在 prod空间生效
kubectl apply -f egress-def.yaml -n prod
测试
kubectl exec -it -n prod pod1 -- /bin/sh
ping 10.244.0.60 ping不出去,因为egress拒绝出站了
vim egress-def.yaml
spec:
podSelector: {}
egress: 定义了egress规则,写的为空,表示放行所有出去
- {}
policyTypes:
- Egress
kubectl apply -f egress-def.yaml -n prod
测试
kubectl exec -it -n prod pod1 -- /bin/sh
ping 10.244.0.60 能ping通
网络策略:
名称空间: 拒绝所有出站入站;放行所有本名称空间pod的出站入站规则
flannel,canal,网络控制的更多相关文章
- k8s集群Canal的网络控制 原
1 简介 直接上干货 public class DispatcherServlet extends HttpServlet { private Properties contextConfigProp ...
- 使用flannel+canal实现k8s的NetworkPolicy
目录 1.NetworkPolicy概述 2.NetworkPolicy策略模型 3.NetworkPolicy默认策略 4.NetworkPolicy的实现 5.使用flannel+canal实现k ...
- 【RL-TCPnet网络教程】第24章 RL-TCPnet之网络控制报文协议ICMP
第24章 RL-TCPnet之网络控制报文协议ICMP 本章节为大家讲解ICMP(Internet Control Message Protocol,网络控制报文协议),通过前面章节对TCP和 ...
- 【OpenStack云平台】网络控制节点 HA 集群配置
个人名片: 因为云计算成为了监控工程师 个人博客:念舒_C.ying CSDN主页️:念舒_C.ying 网络控制节点运行在管理网络和数据网络中,如果虚拟机实例要连接到互联网,网络控制节点也需要具备 ...
- flannel overlay网络浅析
Flannel基于UDP的网络实现 container-1的route表信息如下(b1): default via 100.96.1.1 dev eth0 100.96.1.0/24 dev eth0 ...
- 008-ICMP协议(网络控制文协议)
一.概述 ICMP是(Internet Control Message Protocol)Internet控制报文协议.它是TCP/IP协议簇的一个子协议,用于在IP主机.路由器之间传递控制消息.控制 ...
- docker使用 Flannel(etcd+flannel)网络
一.Flannel网络简介 Flannel是一种基于overlay网络的跨主机容器网络解决方案,也就是将TCP数据包封装在另一种网络包里面进行路由转发和通信,Flannel是CoreOS开发,专门用于 ...
- tc/traffic control 网络控制工具
第一个例子 增加延时 tc qdsic add dev enp0s3 root netem delay 200ms qdisc : queuing discipline, 当内核需要发送包到某个接口时 ...
- 通过python基于netconf协议获取网络中网元的配置数据,助力企业网络控制自动化轻松实现!
摘要:在当今信息化时代,大多数企业都需要网络支撑企业的ICT运行,提升企业运行效率,针对企业网络中的网元设备(包括交换机,路由器,防火墙等),很多企业希望根据自身的业务特点定制网络管理,比如可以实现网 ...
- 网络控制API 路由表 arp表 包括tcp的这些参数都是从哪里设置
路由表查看 arp缓存 都是走的什么接口?
随机推荐
- 刚刚!百度搜索“换脑”引爆AI圈,正式接入DeepSeek R1满血版
一.今天发现百度搜索出现已接入DeepSeek的提示,再也不用担心使用DeepSeek时出现"服务器繁忙,请稍后再试."的问题了. 在百度搜索首页出现[即刻体验AI搜索Deep ...
- RNN、lstm和GRU推导
RNN:(Recurrent Neural Networks)循环神经网络 第t层神经元的输入,除了其自身的输入xt,还包括上一层神经元的隐含层输出st−1 每一层的参数U,W,V都是共享的 lstm ...
- Flink - [03] API
使用scala编写flink api从不同的数据源(源端)读取数据,并进行无界流/有界流的数据处理,最终将处理好的数据sink到对应的目标端 一.maven配置 <?xml version=&q ...
- 开源一款数据转换扩展板-FreakStudio多米诺系列
原文链接: FreakStudio的博客 摘要 数据转换板通过I2C接口进行信号采集和输出,支持最多16通道输入和2通道输出.具备860Hz采样率和50KHz输出频率,采用16位ADC和12位DAC芯 ...
- 读论文-电子商务产品推荐的序列推荐系统综述与分类(A Survey and Taxonomy of Sequential Recommender Systems for E-commerce Product Recommendation)
前言 今天读的这篇文章是于2023年发表在"SN Computer Science"上的一篇论文,这篇文章主要对序列推荐系统进行了全面的调查和分类,特别是在电子商务领域的应用.文章 ...
- 一个nginx + vue下二级路径版本化方案
PS: 尽量不要做版本化!尽量不要做版本化!尽量不要做版本化! 过程说明: 1.arg_appver表示读取url上appver参数 2.对appver参数做变量映射得到alias_party1_te ...
- Windows 提权-RunAs
本文通过 Google 翻译 RunAs – Windows Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校正及个别注释补充. 导航 0 前言 ...
- 【目标检测】一、初始的R-CNN与SVM
1.流程 为什么要用SVM而不是CNN最后一层的softmax? 取什么模型必然是有标准衡量,这个流程取得是书上[4]写的,作者说他得实验证明SVM比FC的mAP要高,所以我流程暂且这样画了. R-C ...
- 【ABAQUS后处理】打印视口到文件
abaqus cae 允许您在画布上打印一个或多个视口的快照,并将图像直接发送到打印机或文件以供以后使用,例如包含在嵌入打印报告的演示文稿中或以 html 格式显示document 打印的图像将在画布 ...
- 基于React的虚拟滚动方案
基于React的虚拟滚动方案 在渲染列表时我们通常会一次性将所有列表项渲染到DOM中,在数据量大的时候这种操作会造成页面响应缓慢,因为浏览器需要处理大量的DOM元素.而此时我们通常就需要虚拟滚动来实现 ...