2019独角兽企业重金招聘Python工程师标准>>>

1 简介

Canal 是calico和flannel的结合,我们因为Calico不仅能够提供很好的网络性能,还能有网络规则控制,但是我们很多时候使用的Flannel网络,他的缺点就是没有网络控制只能提供网络服务,所以Canal诞生了,为Falanel提供了网络控制。

网络策略 控制出站: egress 控制进站: ingress 可以以ip地址块定义规则,也可以基于命名空间规则定义,还可以对pod定义规则

2 部署Canal

curl \
https://docs.projectcalico.org/v3.6/getting-started/kubernetes/installation/hosted/canal/canal.yaml \
-O
kubectl apply -f canal.yaml
1)canal默认控制的是10.244.0.0/16 ,如果你在安装k8s集群是设置的pod网络不是此段网络,则你需要修改配置文件
2)我们采用的和k8s集群公用etcd的方式创建查看创建的pod
# kubectl get pods -n kube-system
NAME                                    READY   STATUS    RESTARTS   AGE
canal-9lmw8                             2/2     Running   0          4m50s
canal-ln6kg                             2/2     Running   0          4m50s
canal-mx6tn                             2/2     Running   0          4m50s
coredns-fb8b8dccf-lfbkh                 1/1     Running   2          10d
coredns-fb8b8dccf-t2kdz                 1/1     Running   2          10d
etcd-master-1                           1/1     Running   2          10d
kube-apiserver-master-1                 1/1     Running   2          10d
kube-controller-manager-master-1        1/1     Running   2          10d
kube-flannel-ds-amd64-df7gk             1/1     Running   3          9d
kube-flannel-ds-amd64-dzxfd             1/1     Running   3          9d
kube-flannel-ds-amd64-mgw2m             1/1     Running   2          9d
kube-proxy-47d6q                        1/1     Running   2          10d
kube-proxy-jztrs                        1/1     Running   3          10d
kube-proxy-rt4xx                        1/1     Running   3          10d
kube-scheduler-master-1                 1/1     Running   2          10d
kubernetes-dashboard-5f7b999d65-8h79h   1/1     Running   0          21h

3 创建两个实验的空间

kubectl create namespace shengchan
kubectl create namespace test

4 创建网络规则测试

默认ingress 和 engress可以一起使用,当这两规则同时存在那么将使用policyTypes做具体的规则指向
例如:创建一个policy默认拒绝所有在空间shengchan的入站规则# cat ingress-deny.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: deny-all-ingressnamespace: shengchan
spec: podSelector: {}policyTypes:- Ingresskubectl apply ingress-deny.yaml创建一组属于shengchan空间的pod
# cat pod-networkpolicy1.yaml
apiVersion: v1
kind: Pod
metadata:name: pod-test
spec:containers:- name: pod-test-policyimage: nginx:1.10kubectl apply -f pod-networkpolicy1.yaml  -n shengchan创建一组属于test空间的pod
kubectl apply -f pod-networkpolicy1.yaml  -n test分别查看两组pod的IP地址# kubectl get pods -o wide  -n shengchan
NAME       READY   STATUS    RESTARTS   AGE   IP           NODE    NOMINATED NODE   READINESS GATES
pod-test   1/1     Running   0          16s   10.244.1.2   node2   <none>           <none>[root@master-1 ~]# kubectl get pods -o wide  -n test
NAME       READY   STATUS    RESTARTS   AGE   IP           NODE    NOMINATED NODE   READINESS GATES
pod-test   1/1     Running   0          9s    10.244.2.2   node1   <none>           <none>在宿主机上面分别ping这两个ip
# ping 10.244.1.2 -c 1
PING 10.244.1.2 (10.244.1.2) 56(84) bytes of data.
^C
--- 10.244.1.2 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms# ping 10.244.2.2 -c 1
PING 10.244.2.2 (10.244.2.2) 56(84) bytes of data.
64 bytes from 10.244.2.2: icmp_seq=1 ttl=63 time=0.660 ms--- 10.244.2.2 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.660/0.660/0.660/0.000 ms此时发现属于shengchan空间的pod是被拒绝访问的,属于test空间的pod正常访问
此时我们是基于名称空间级别的入站网络访问策略

5 将上面的默认拒绝策略放行

修改配置文件
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: deny-all-ingressnamespace: shengchan
spec: podSelector: {}ingress:- {}policyTypes:- Ingress
kubectl apply -f ingress-deny.yaml

再次测试10.244.1.2

[root@master-1 ~]# curl -I 10.244.1.2
HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Sat, 27 Apr 2019 16:58:04 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 31 Jan 2017 15:01:11 GMT
Connection: keep-alive
ETag: "5890a6b7-264"
Accept-Ranges: bytes[root@master-1 ~]# curl -I 10.244.2.2
HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Sat, 27 Apr 2019 16:58:07 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 31 Jan 2017 15:01:11 GMT
Connection: keep-alive
ETag: "5890a6b7-264"
Accept-Ranges: bytes说明我们的网络策略放行成功

6 放行特定的入站

以标签的形式进行划分pod入站规则是否被放行

1)回复默认拒绝所有
[root@master-1 ~]# cat ingress-deny.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: deny-all-ingressnamespace: shengchan
spec: podSelector: {}policyTypes:- Ingresskubectl apply -f ingress-deny.yaml2)给shengchan pod打一个标签
kubectl label pods pod-test app=hello -n shengchan
3)创建一个新的规则
# vim ingress-allow.yml apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: allow-hello-ingressnamespace: shengchan
spec:podSelector:matchLabels:app: helloingress:- from:- ipBlock:cidr: 10.244.0.0/16except:- 10.244.2.2/32ports:- protocol: TCPport: 80解释: 我们重新定义了一个policy,通过标签匹配到我们已有的pod(我们一已有的pod是拒绝所有访问的),定义ingres规则,如果不通过from方式定义默认是所有网段都可以访问到拥有这个标签的pod为了测试我们使用from方式去拒绝10.244.0.0但是会放行10.244.2.2因为我们有这个ip的pod创建万郴更可以进行测试ports就是指定特定开放的端口
4)创建之前进行访问测试
# kubectl get pods -n shengchan -o wide
NAME       READY   STATUS    RESTARTS   AGE   IP           NODE    NOMINATED NODE   READINESS GATES
pod-test   1/1     Running   0          62m   10.244.1.2   node2   <none>           <none>
# curl 10.244.1.2
说明无法访问
5)创建之后测试
kubectl apply -f ingress-allow.yml [root@master-1 ~]# curl -I 10.244.1.2
HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Sat, 27 Apr 2019 17:32:15 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 31 Jan 2017 15:01:11 GMT
Connection: keep-alive
ETag: "5890a6b7-264"
Accept-Ranges: bytes
说明已经放行
至于对于10.244.0.0网段的限制有兴趣可以测试一下

6 egress出站规则

1)设置一个拒绝所有出站policy
cat egress.yml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: deny-all-egressnamespace: test
spec: podSelector: {}policyTypes:- Egresskubectl apply -f egress.yml2)创建一个test命名空间下的pods
kubectl apply -f pod-networkpolicy1.yaml -n test
3)查看podIP并进去容器去测试ping一个正常的podip
[root@master-1 ~]# kubectl get pods -o wide
NAME                        READY   STATUS    RESTARTS   AGE    IP            NODE    NOMINATED NODE   READINESS GATES
net-test-5764c456cb-2c9df   1/1     Running   24         24h    10.244.2.22   node1   <none>           <none>
net-test-5764c456cb-ng6vh   1/1     Running   46         6d5h   10.244.1.21   node2   <none>           <none>[root@master-1 ~]# kubectl get pods -o wide -n test
NAME       READY   STATUS    RESTARTS   AGE   IP           NODE    NOMINATED NODE   READINESS GATES
pod-test   1/1     Running   0          86m   10.244.2.2   node1   <none>           <none>kubectl exec -it pod-test -n test -- /bin/bashroot@pod-test:/# ping 10.244.1.21
PING 10.244.1.21 (10.244.1.21): 56 data bytes
^C--- 10.244.1.21 ping statistics ---
3 packets transmitted, 0 packets received, 100% packet loss说明此时已经应用策略
4)修改配置文件放行所有出站
# cat egress.yml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: deny-all-egressnamespace: test
spec: podSelector: {}egress:- {}policyTypes:- Egresskubectl apply -f egress.yml
测试:
root@pod-test:/# ping 10.244.1.21 -c 1
PING 10.244.1.21 (10.244.1.21): 56 data bytes
64 bytes from 10.244.1.21: icmp_seq=0 ttl=62 time=0.939 ms
--- 10.244.1.21 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.939/0.939/0.939/0.000 ms
此时说明已经放行成功

7 更加复杂的policy规则需要根据不同的环境规划进行深入探究,其所有都规则都体现在配置文件中

转载于:https://my.oschina.net/54188zz/blog/3043290

k8s集群Canal的网络控制相关推荐

  1. 总结 Underlay 和 Overlay 网络,在k8s集群实现underlay网络,网络组件flannel vxlan/ calico IPIP模式的网络通信流程,基于二进制实现高可用的K8S集群

    1.总结Underlay和Overlay网络的的区别及优缺点 Overlay网络:  Overlay 叫叠加网络也叫覆盖网络,指的是在物理网络的 基础之上叠加实现新的虚拟网络,即可使网络的中的容器可 ...

  2. 支撑 100Gbit/s K8s 集群的未来网络数据平面

    总体原则:高度可扩展,极致性能. Cilium 数据平面的核心功能 Cilium + BIG TCP BIG TCP 设计目标 支持数据中心内的单个 socket 达到 100Gbps+ 带宽. 使用 ...

  3. Kubernetes全栈架构师(二进制高可用安装k8s集群扩展篇)--学习笔记

    目录 二进制Metrics&Dashboard安装 二进制高可用集群可用性验证 生产环境k8s集群关键性配置 Bootstrapping: Kubelet启动过程 Bootstrapping: ...

  4. 搭建 K8S 环境:Centos7安装生产环境可用的K8S集群图文教程指南

    搭建 K8S 环境:Centos7安装生产环境可用的K8S集群图文教程指南 一. K8S 简介 二. K8S 学习的几大拦路虎 2.1 K8S 安装对硬件要求比较高 2.2. K8S 对使用者来说要求 ...

  5. 从零开始在ubuntu上安装和使用k8s集群及报错解决

    文章目录 安装docker 安装kubernetes 配置k8s集群 配置虚拟机网络 配置Master节点的k8s网络 拉取k8s需要的镜像 启动 kubeadm 和 kubelet 配置 node节 ...

  6. k8s多集群搭建istio共享控制平面(多网络)及部署grpc服务分流实践

    个人博客原文:http://www.lampnick.com/php/913 本文目标 部署一个多集群的共享的istio服务网格 部署一套基于grpc的服务 对grpc服务进行流量管理 架构图如下 前 ...

  7. openstack vlan配置_为OpenStack和K8s集群提供无缝虚拟网络

    在数据中心里,同时拥有OpenStack和Kubernetes集群的情况正变得越来越普遍. 一边是由OpenStack管理的虚拟机,另一边是由K8s控制的容器化工作负载.现实情况下,可能会发生虚拟机和 ...

  8. K8s基础12——etcd数据备份与恢复、集群版本升级、网络策略

    文章目录 一.etcd备份与恢复 1.1 kubeadm部署方式 1.1.1 备份 1.1.2 恢复 1.2 单etcd二进制部署方式 1.2.1 部署 1.2.2 备份 1.2.3 恢复 1.2.4 ...

  9. 一次对K8S集群service的“非主流”访问方式引发的网络探究

    一次对K8S集群service的"非主流"访问方式引发的网络探究 目录 一次对K8S集群service的"非主流"访问方式引发的网络探究 (一)"颇有 ...

  10. Kubernetes(k8s)集群部署七、k8s网络通信+service扩展ingress(TLS,认证,地址重写)calico网络插件(允许指定pod访问服务,禁止其他namespace访问服务)

    k8s网络通信 k8s网络通信 1.容器间通信 2.pod之间的通信 2.1同一节点的pod 2.2不同节点的pod之间的通信 flannel网络原理 flannel支持多种后端: 3.pod和ser ...

最新文章

  1. python官方文档中文下载-python中文官方文档 PDF 下载
  2. 构建之法第三章软件工程师的成长
  3. 安装ubuntu20.4+gtx1050+cuda11.3
  4. linux can t open sh,Linux python3 - Can't open lib 'SQL Server'
  5. 澳门大学健康科学学院生物信息核心实验中心高薪诚聘研究助理
  6. Windows删除删除文件提示无法读源文件或磁盘解决方法
  7. ansible批量安装服务器思路
  8. Spring_day2
  9. 使用Tensorflow进行脸部识别
  10. qq浏览器网页翻译_在线英文翻译、文档翻译,这几款翻译工具你值得拥有
  11. unity3d中串口的使用
  12. 暂且解决INSTALL_FAILED_SHARED_USER_INCOMPATIBLE错误
  13. 日本专利分类方法 FI 和 F-Term 分类号 检索
  14. 【宋红康 MySQL数据库 】【高级篇】【09】InnoDB的数据存储结构
  15. html5离散数学,离散数学怎样判断合取范式和析取范式
  16. 4个避免使用npm link的理由
  17. 微信小程序--解密用户信息
  18. php去掉二维数组中某key的值
  19. 阿里云创始人王坚:别人可以背弃理想,我不可以
  20. js控制html控件显示隐藏和是否可用

热门文章

  1. 一份Java面试宝典「Java核心知识点」囊括JVM,Spring等29个技术
  2. 或且非 java_Java且或非的符号
  3. oracle18c shard技术分享-安装部署
  4. 日立6TB充氦硬盘详细规格、实物照片
  5. WWW 2019 | HAN:异质图注意力网络
  6. 深度|加州大学Russell教授:人工智能基础概念与34个误区
  7. 华硕主板无盘启动bios设置_华硕主板bios设置图解教程
  8. Linux基础PHP网站搭建
  9. 浙江大学数据结构第一讲:1.1什么是数据结构
  10. 求一元多项式 P(x) = a0 + a1x + a2x^2 + ... + anx^n 的值P(x0)。