docker网络:

bridge 自连网络名称空间

joined 与另外容器共享使用网络名称空间

open 容器直接共享宿主机的网络名称空间

none 不使用任何网络名称空间

k8s网络通信模型

  1. 容器间网络通信:同一个pod内的多个容器间的通信,lo
  2. pod间通信: pod ip <--> pod ip 直连
  3. pod与service通信 pod ip <--> clusterip   iptables实现
  4. service与集群外部客户端的通信 nodeport ingress loadblance实现

CNI 容器网络接口

  1. flannel 仅支持地址分配
  2. calico 支持地址分配 也支持网络策略
  3. canal  flannel+calico
  4. 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,网络控制的更多相关文章

  1. k8s集群Canal的网络控制 原

    1 简介 直接上干货 public class DispatcherServlet extends HttpServlet { private Properties contextConfigProp ...

  2. 使用flannel+canal实现k8s的NetworkPolicy

    目录 1.NetworkPolicy概述 2.NetworkPolicy策略模型 3.NetworkPolicy默认策略 4.NetworkPolicy的实现 5.使用flannel+canal实现k ...

  3. 【RL-TCPnet网络教程】第24章 RL-TCPnet之网络控制报文协议ICMP

    第24章     RL-TCPnet之网络控制报文协议ICMP 本章节为大家讲解ICMP(Internet Control Message Protocol,网络控制报文协议),通过前面章节对TCP和 ...

  4. 【OpenStack云平台】网络控制节点 HA 集群配置

    个人名片: 因为云计算成为了监控工程师‍ 个人博客:念舒_C.ying CSDN主页️:念舒_C.ying 网络控制节点运行在管理网络和数据网络中,如果虚拟机实例要连接到互联网,网络控制节点也需要具备 ...

  5. flannel overlay网络浅析

    Flannel基于UDP的网络实现 container-1的route表信息如下(b1): default via 100.96.1.1 dev eth0 100.96.1.0/24 dev eth0 ...

  6. 008-ICMP协议(网络控制文协议)

    一.概述 ICMP是(Internet Control Message Protocol)Internet控制报文协议.它是TCP/IP协议簇的一个子协议,用于在IP主机.路由器之间传递控制消息.控制 ...

  7. docker使用 Flannel(etcd+flannel)网络

    一.Flannel网络简介 Flannel是一种基于overlay网络的跨主机容器网络解决方案,也就是将TCP数据包封装在另一种网络包里面进行路由转发和通信,Flannel是CoreOS开发,专门用于 ...

  8. tc/traffic control 网络控制工具

    第一个例子 增加延时 tc qdsic add dev enp0s3 root netem delay 200ms qdisc : queuing discipline, 当内核需要发送包到某个接口时 ...

  9. 通过python基于netconf协议获取网络中网元的配置数据,助力企业网络控制自动化轻松实现!

    摘要:在当今信息化时代,大多数企业都需要网络支撑企业的ICT运行,提升企业运行效率,针对企业网络中的网元设备(包括交换机,路由器,防火墙等),很多企业希望根据自身的业务特点定制网络管理,比如可以实现网 ...

  10. 网络控制API 路由表 arp表 包括tcp的这些参数都是从哪里设置

    路由表查看 arp缓存 都是走的什么接口?

随机推荐

  1. WPF DevExpress GridColumn ComboBox 显示选择内容的 TooTip

    实现显示当前选择的ComboBox中项的ToolTip信息: 1. 设置 GridColumn 的 CellTemplate 为 ComboBoxEdit , 然后自定义他的 ItemContaine ...

  2. Python实现URL自动转二维码的高效方法

    Python实现URL自动转二维码的高效方法 安装包依赖 pip install qrcode pip install pillow 程序 import qrcode data = "htt ...

  3. QT5笔记: 8. QT的全局变量(基本数据类型、函数、宏)

    这个头文件中存放着QT类库的一些全局定义,一般Qt类的头文件会包含这个头文件: 基本数据类型 函数 宏 数据类型:保证跨平台时各数据类型长度统一 函数定义(一些数学函数未在QtGlobal中,而是在Q ...

  4. Typecho自定义右键菜单美化和禁用F12

    右键美化 使用右键美化,请禁用 HoerMouse 鼠标美化插件,否则貌似没效果 Joe主题在后台-外观设置-设置外观-全局设置-自定义<body></body>标签内填入如下 ...

  5. AGC015D题解

    简要题意 给定一个区间 \([l,r]\),从中选出若干整数按位或,求可能出现的数的方案数. 数据范围:\(1\le l\le r\le2^{60}\). 思路 首先对于 \([l,r]\) 里的数全 ...

  6. 【刚度矩阵推导】2d frame 单元

    2d frame 单元是x-y平面上的单元,每个节点上有2个平移自由度的和一个转动自由度.局部坐标系下,单元位移向量为: \( u=[ u_1 ,u_2 ,u_3, u_4, u_5, u_6]^{T ...

  7. AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现

    引言 在当今这个数据爆炸的时代,信息的快速存储与高效检索已经成为技术领域的核心挑战.随着人工智能(AI)和机器学习(ML)的迅猛发展,向量存储和相似性搜索技术逐渐崭露头角,成为处理海量数据的利器.对于 ...

  8. 错误修正记录:对应的VMware Tools脚本未能成功运行

    起因 装了台式机,想把笔记本里的vmware虚拟机迁移过来:复制过来后开机就出现这种情况,点开机.挂起.关机等操作会报错,然后无法挂起(再点一次就行) 或者使用下方的选项,而非上方包装过的功能,似乎也 ...

  9. glib-2.60在win64,msys2下编译

    前阵子,工作原因,需要在win7 64下的msys2来编译glib,下面是一些踩过的坑: 事先声明一下,这些个解决方式及纯粹是为了编译通过,可能有些做法不太适合一些需要正常使用的场合,烦请各位注意下. ...

  10. 探秘Transformer系列之(15)--- 采样和输出

    探秘Transformer系列之(15)--- 采样和输出 目录 探秘Transformer系列之(15)--- 采样和输出 0x00 概述 0x01 Generator 1.1 Linear 1.2 ...