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

Form analysis 1 forms found in the DOM

GET 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