k8s之网络插件flannel及基于Calico的网络策略
1.k8s网络通信
a.容器间通信:同一个pod内的多个容器间的通信,通过lo即可实现;
b.pod之间的通信:pod ip <---> pod ip,pod和pod之间不经过任何转换即可通信;
c.pod和service通信:pod ip <----> cluster ip(即service ip)<---->pod ip,它们通过iptables或ipvs实现通信,ipvs取代不了iptables,因为ipvs只能做负载均衡,而做不了nat转换;
d.Service与集群外部客户端的通信.
kubectl get configmap -n kube-system
kubectl get configmap kube-proxy -o yaml -n kube-system
看到mode是空的,把它改为ipvs就可以
k8s靠CNI接口接入其他插件来实现网络通讯.目前比较流行的插件有flannet、callco、canel.
这些插件使用的解决方案有如下方式:
a.虚拟网桥:虚拟网卡,多个容器共用一个虚拟网卡进行通信;
b.多路复用:MacVLAN,多个容器共用一个物理网卡进行通信;
c.硬件交换:SR-LOV,一个物理网卡可以虚拟出多个接口,这个性能最好.
CNI插件存放位置
cat /etc/cni/net.d/10-flannel.conflist
flanel只支持网络通讯,但是不支持网络策略;
callco网络通讯和网络策略都支持;canel:flanel+callco
可以部署flanel提供网络通讯,再部署一个callco只提供网络策略,而不用canel.
mtu:是指一种通信协议的某一层上面所能通过的最大数据包大小.
通过ifconfig可以看到flannel.1的地址是10.244.1.0,子网掩码是255.255.255.255,mtu是1450,正常mtu是1500,mtu要留出一部分做封装叠加,额外开销使用.
两个节点上的pod可以借助flannel隧道进行通信,默认使用VxLAN协议,有额外开销,所以性能有点低;
flannel第二种协议叫host-gw(host gateway),即Node节点把自己的网络接口当做pod的网关使用,从而使不同节点上的node进行通信,性能比VxLAN高,因为它没有额外开销,不过有个缺点,就是各node节点必须在同一个网段中;
如果两个pod所在节点在同一个网段中,可以让VxLAN也支持host-gw的功能,即直接通过物理网卡的网关路由转发,而不用隧道flannel叠加,从而提高了VxLAN的性能,这种flannel的功能叫directrouting,如果不在同一网段,则使用VxLAN叠加隧道.
network:flannel使用CIDR格式的网络地址,用于为pod配置网络功能.
kubectl get configmap -n kube-system kube-flannel-cfg -o json -n kube-system
1)10.244.0.0/16--->
master: 10.244.0.0./24
node01: 10.244.1.0/24
....
node255: 10.244.255.0/24
可以支持256个节点
2)SubnetLen:把network切分为子网供各节点使用时,使用多长的掩码进行切分,默认为24位;
3)SubnetMin:指明子网中的地址段最小多少可以分给子网使用,比如可以限制10.244.10.0/24,这样0~9就不让用;
4)SubnetMax:表示最多使用多少个,比如10.244.100.0/24;
5)Backend:Vxlan,host-gw,udp(最慢)
kubectl edit configmap kube-flannel-cfg -n kube-system {
"Network": "10.244.0.0/16",
"Backend": {
"Type": "vxlan",
"Directrouting": true # 加一行这个
}
}
# 不要通过这种方式修改配置,应该在第一次安装flannel时就加上这一行,否则就需要卸载掉已安装的flannel,
修改下载好的配置文件,重新apply,才能实现同网段通过物理网卡实现网络通信.
route -n
10.244.1.0 10.244.1.0 255.255.255.0 UG 0 0 0 flannel.1
10.244.2.0 10.244.2.0 255.255.255.0 UG 0 0 0 flannel.1
# 没改之前,同一网段的不同节点通信是靠叠加网络,改完生效之后,这两个节点通信就是host-gw-用网卡通信
route -n
10.244.1.0 10.0.0.20 255.255.255.0 UG 0 0 0 eth0
10.244.2.0 10.0.0.30 255.255.255.0 UG 0 0 0 eth0
2.Calico演示
安装文档:https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/flannel
# 和k8s使用同一套API数据存储
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
Egress:出站,表示pod自己是客户端,访问别人;
Ingress:入站,表示Pod自己是目标,别人来访问自己;通常,客户端的端口是随机的,服务端的端口是固定的;
Network Policy:用来控制哪些pod和外部或内部进行通信;
podSelector:pod选择器; policyTypes:用来控制Ingres和Egres哪个生效.
创建两个名称空间,一个是测试,一个是生产
kubectl create namespace dev
kubectl create namespace prod
mkdir networkpolicy && cd networkpolicy/
cat ingress-def.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-ingress
spec:
podSelector: {}
policyTypes:
- Ingress # pod选择器设置为空,表示选择所有pod,即控制整个名称空间
# 只写了ingress生效,又把podSelector设置为空,表示拒绝其它名称空间访问,拒绝所有入站请求
# 没有加egress,所以默认egress是允许本名称空间所有pod出站
kubectl apply -f ingress-def.yaml -n dev
# 在dev名称空间创建一个pod
cat pod-a.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod1
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
kubectl apply -f pod-a.yaml -n dev
# 拒绝任何入站请求
curl 10.244.2.2
# 将ingress设置为空,表示允许所有入站访问
cat ingress-def.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-ingress
spec:
podSelector: {}
ingress:
- {}
policyTypes:
- Ingress # 给dev名称空间里面的pod1打个标签app=myapp
cat allow-netpol-demo.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-myapp-ingress
spec:
podSelector:
matchLabels:
app: myapp
ingress:
- from:
- ipBlock:
cidr: 10.244.0.0/16
except:
- 10.244.1.2/32
ports:
- protocol: TCP
port: 80 # cidr:指定网段,允许从10.244.0.0/16网段访问指定标签的pod
# except:排除某些地址
kubectl apply -f allow-netpol-demo.yaml -n dev
kubectl get netpol -n dev
egress出站规则
cat egress-def.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-egress
spec:
podSelector:
policyTypes:
- Egress
kubectl apply -f egress-def.yaml -n prod
# ping其他名称空间的容器没反应,是因为网络策略deny-all-egress起了作用
kubectl exec pod1 -it -n prod -- /bin/sh
# 允许所有egress出站
cat egress-def.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-egress
spec:
podSelector: {}
egress:
- {}
policyTypes:
- Egress
参考博客:http://blog.itpub.net/28916011/viewspace-2215295/
参考博客:http://blog.itpub.net/28916011/viewspace-2215383/
k8s之网络插件flannel及基于Calico的网络策略的更多相关文章
- K8S(03)核心插件-Flannel网络插件
系列文章说明 本系列文章,可以基本算是 老男孩2019年王硕的K8S周末班课程 笔记,根据视频来看本笔记最好,否则有些地方会看不明白 需要视频可以联系我 K8S核心网络插件Flannel 目录 系列文 ...
- kubernetes学习笔记之十三:基于calico的网络策略入门
一..安装calico [root@k8s-master01 ~]# kubectl apply -f https://docs.projectcalico.org/v3.3/getting-star ...
- 3.kubernetes的CNI网络插件-Flannel
目录 1.1.K8S的CNI网络插件-Flannel 1.1.1.集群规划 1.1.2.下载软件.解压.软链接 1.1.3.最终目录结构 1.1.4.拷贝证书 1.1.5.创建配置 1.1.6.创建启 ...
- kubernetes进阶(二)核心网络插件Flannel
网络插件Flannel介绍:https://www.kubernetes.org.cn/3682.html 首先,flannel利用Kubernetes API或者etcd用于存储整个集群的网络配置, ...
- kubernetes 配置网络插件 flannel
概述 在学习docker时知道docker有四种常用的网络模型 bridge:桥接式网络 joined:联盟式网络,共享使用另外一个容器的网络名称空间 opened:容器直接共享使用宿主机的网络名称空 ...
- Kubernetes 学习18配置网络插件flannel
一.概述 1.我们在学习docker时知道docker有四种常用的网络模型 a.bridge:桥接式网络 b.joined:联盟式网络,共享使用另外一个容器的网络名称空间 b.opened:容器直接共 ...
- 第十章 Kubernetes的CNI网络插件--flannel
1.简介 1.1前言 Kubernetes设计了网络模型,但却将它的实现讲给了网络插件,CNI网络插件最重要的功能就是实现Pod资源能够跨主机通信 常见的CNI网络插件如下: Flannel: Cac ...
- k8s系列---网络插件flannel
跨节点通讯,需要通过NAT,即需要做源地址转换. k8s网络通信: 1) 容器间通信:同一个pod内的多个容器间的通信,通过lo即可实现: 2) pod之间的通信,pod ip <---> ...
- Kubernetes网络插件Flannel的三种工作模式
跨主机通信的一个解决方案是Flannel,由CoreOS推出,支持3种实现:UDP.VXLAN.host-gw 一.UDP模式(性能差) 核心就是通过TUN设备flannel0实现(TUN设备是工作在 ...
随机推荐
- adb的一些命令
adb pull <手机路径> <本机路径> 从手机中拉取信息到本地电脑上 adb push <本机路径> <手机路径> 从本地电脑推送信息到手机上
- Leetcode题目283.移动零(简单)
题目描述: 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序. 示例: 输入: [0,1,0,3,12] 输出: [1,3,12,0,0] 说明: 必须在原 ...
- 最全的tcpdump使用详解
简介 用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具. tcpdump可以将网络中传送的数据包的 ...
- SQL-W3School-高级:SQL CHECK 约束
ylbtech-SQL-W3School-高级:SQL CHECK 约束 1.返回顶部 1. SQL CHECK 约束 CHECK 约束用于限制列中的值的范围. 如果对单个列定义 CHECK 约束,那 ...
- 05-06 Flutter JSON和序列化反序列化、创建模型类转换Json数据、轮播图数据渲染:Flutter创建商品数据模型 、请求Api接口渲染热门商品 推荐商品
Config.dart class Config{ static String domain='http://jd.itying.com/'; } FocusModel.dart class Focu ...
- JAVA 基础编程练习题41 【程序 41 猴子分桃】
41 [程序 41 猴子分桃] 题目:海滩上有一堆桃子,五只猴子来分.第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把 多的一个扔入海中,拿走了一份.第二只猴子把剩下的桃子又平均分成五份,又多了 ...
- JAVA 基础编程练习题21 【程序 21 求阶乘】
21 [程序 21 求阶乘] 题目:求 1+2!+3!+...+20!的和 程序分析:此程序只是把累加变成了累乘. package cskaoyan; public class cskaoyan21 ...
- Jmeter 逻辑控制器 之 Include Controller
一.认识 Include Controller Include Controller :译为包含控制器,用来添加 Test Fragment(测试片段).具体是什么意思呢,我们先来了解下 Test F ...
- Leetcode 69. Sqrt(x)及其扩展(有/无精度、二分法、牛顿法)详解
Leetcode 69. Sqrt(x) Easy https://leetcode.com/problems/sqrtx/ Implement int sqrt(int x). Compute an ...
- 【AMAD】django-compressor -- 将JS和CSS文件压缩为一个缓存文件
简介 个人评分 简介 django-compressor1的example: {% load compress %} {% compress css %} <link rel="sty ...