www.cnblogs.com
Open in
urlscan Pro
121.40.43.188
Public Scan
Submitted URL: http://www.cnblogs.com/fawaikuangtu123/p/11296382.html
Effective URL: https://www.cnblogs.com/fawaikuangtu123/p/11296382.html
Submission: On February 21 via api from US — Scanned from DE
Effective URL: https://www.cnblogs.com/fawaikuangtu123/p/11296382.html
Submission: On February 21 via api from US — Scanned from DE
Form analysis
1 forms found in the DOMGET https://zzk.cnblogs.com/s
<form id="zzk_search" class="navbar-search" action="https://zzk.cnblogs.com/s" method="get">
<input name="w" id="zzk_search_input" placeholder="代码改变世界" type="text" tabindex="3">
<button type="submit" id="zzk_search_button">
<img src="/images/aggsite/search.svg" alt="搜索">
</button>
</form>
Text Content
* * 首页 * 新闻 * 博问 * 专区 * 闪存 * 班级 * * 我的博客 我的园子 账号设置 简洁模式 ... 退出登录 注册 登录 法外狂徒 卓越,源于拼搏,始于抉择。 * 博客园 * 首页 * 新随笔 * 联系 * 订阅 * 管理 随笔 - 136 文章 - 0 评论 - 0 阅读 - 28万 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与集群外部客户端的通信. ? 1 2 3 4 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,一个物理网卡可以虚拟出多个接口,这个性能最好. ? 1 2 3 4 5 6 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配置网络功能. ? 1 2 3 4 5 6 7 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(最慢) ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 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 ? 1 2 3 4 5 # 和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哪个生效. 创建两个名称空间,一个是测试,一个是生产 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 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出站规则 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 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/ 分类: docker&k8s 好文要顶 关注我 收藏该文 法外狂徒 关注 - 0 粉丝 - 30 +加关注 1 0 « 上一篇: k8s之dashboard认证、资源需求、资源限制及HeapSter » 下一篇: k8s之调度器、预选策略及优选函数 posted @ 2019-08-03 21:27 法外狂徒 阅读(5239) 评论(0) 编辑 收藏 举报 刷新评论刷新页面返回顶部 登录后才能查看或发表评论,立即 登录 或者 逛逛 博客园首页 【推荐】华为有奖活动:新年盲盒等你取,开发者认证有“福”礼 【推荐】百度智能云 2022 开年见礼,开发者上云优惠专场在等你 【推荐】华为开发者专区,与开发者一起构建万物互联的智能世界 编辑推荐: · ASP.NET Core 6框架揭秘实例演示[05]:依赖注入基本编程模式 · 走进Task(2):Task 的回调执行与 await · 戏说领域驱动设计(五)——子域 · 什么是向上管理 · 从 MVC 到 DDD 的架构演进 最新新闻: · 逗!EA内部复盘《2042》惨败原因,结果玩成“花式甩锅大会” · 我找到了在 GitHub 上获得高星的秘密 · 14 岁时,我成为了最年轻的 Kaggle 竞赛大师 · Rust 拖慢开发速度?2021 年 Rust 调查报告出炉 · 腾讯新成立XR业务团队,含XR硬件及游戏工作室,发力全真互联网! » 更多新闻... 公告 昵称: 法外狂徒 园龄: 4年2个月 粉丝: 30 关注: 0 +加关注 < 2022年2月 > 日 一 二 三 四 五 六 30 31 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 1 2 3 4 5 6 7 8 9 10 11 12 搜索 常用链接 * 我的随笔 * 我的评论 * 我的参与 * 最新评论 * 我的标签 随笔分类 * docker&k8s(24) * ELK(11) * Jenkins(13) * linux运维(34) * python(21) * shell(11) * web前端(3) * 数据库(11) * 杂篇(5) 随笔档案 * 2019年10月(2) * 2019年8月(10) * 2019年6月(10) * 2019年5月(15) * 2019年2月(15) * 2019年1月(16) * 2018年12月(11) * 2018年11月(15) * 2018年10月(16) * 2018年9月(12) * 2018年8月(1) * 2018年1月(1) * 2017年12月(7) * 2017年11月(5) 相册 * just_pic(1) 阅读排行榜 * 1. 解释Crypto模块怎么就这么"皮"?No module named "Crypto"(69274) * 2. k8s之helm入门(16729) * 3. k8s之ingress及ingress controller(14361) * 4. jenkins配置Maven的私有仓库Nexus(13687) * 5. CentOS6、CentOS7配置Base源和epel源(11088) 推荐排行榜 * 1. 解释Crypto模块怎么就这么"皮"?No module named "Crypto"(17) * 2. k8s之helm入门(3) * 3. jenkins集群节点构建maven(几乎是坑最多的)(2) * 4. 《流畅的Python》一副扑克牌中的难点(2) * 5. k8s之网络插件flannel及基于Calico的网络策略(1) Copyright © 2022 法外狂徒 Powered by .NET 6 on Kubernetes