k8s集群Canal的网络控制
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的网络控制相关推荐
- 总结 Underlay 和 Overlay 网络,在k8s集群实现underlay网络,网络组件flannel vxlan/ calico IPIP模式的网络通信流程,基于二进制实现高可用的K8S集群
1.总结Underlay和Overlay网络的的区别及优缺点 Overlay网络: Overlay 叫叠加网络也叫覆盖网络,指的是在物理网络的 基础之上叠加实现新的虚拟网络,即可使网络的中的容器可 ...
- 支撑 100Gbit/s K8s 集群的未来网络数据平面
总体原则:高度可扩展,极致性能. Cilium 数据平面的核心功能 Cilium + BIG TCP BIG TCP 设计目标 支持数据中心内的单个 socket 达到 100Gbps+ 带宽. 使用 ...
- Kubernetes全栈架构师(二进制高可用安装k8s集群扩展篇)--学习笔记
目录 二进制Metrics&Dashboard安装 二进制高可用集群可用性验证 生产环境k8s集群关键性配置 Bootstrapping: Kubelet启动过程 Bootstrapping: ...
- 搭建 K8S 环境:Centos7安装生产环境可用的K8S集群图文教程指南
搭建 K8S 环境:Centos7安装生产环境可用的K8S集群图文教程指南 一. K8S 简介 二. K8S 学习的几大拦路虎 2.1 K8S 安装对硬件要求比较高 2.2. K8S 对使用者来说要求 ...
- 从零开始在ubuntu上安装和使用k8s集群及报错解决
文章目录 安装docker 安装kubernetes 配置k8s集群 配置虚拟机网络 配置Master节点的k8s网络 拉取k8s需要的镜像 启动 kubeadm 和 kubelet 配置 node节 ...
- k8s多集群搭建istio共享控制平面(多网络)及部署grpc服务分流实践
个人博客原文:http://www.lampnick.com/php/913 本文目标 部署一个多集群的共享的istio服务网格 部署一套基于grpc的服务 对grpc服务进行流量管理 架构图如下 前 ...
- openstack vlan配置_为OpenStack和K8s集群提供无缝虚拟网络
在数据中心里,同时拥有OpenStack和Kubernetes集群的情况正变得越来越普遍. 一边是由OpenStack管理的虚拟机,另一边是由K8s控制的容器化工作负载.现实情况下,可能会发生虚拟机和 ...
- 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 ...
- 一次对K8S集群service的“非主流”访问方式引发的网络探究
一次对K8S集群service的"非主流"访问方式引发的网络探究 目录 一次对K8S集群service的"非主流"访问方式引发的网络探究 (一)"颇有 ...
- 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 ...
最新文章
- python官方文档中文下载-python中文官方文档 PDF 下载
- 构建之法第三章软件工程师的成长
- 安装ubuntu20.4+gtx1050+cuda11.3
- linux can t open sh,Linux python3 - Can't open lib 'SQL Server'
- 澳门大学健康科学学院生物信息核心实验中心高薪诚聘研究助理
- Windows删除删除文件提示无法读源文件或磁盘解决方法
- ansible批量安装服务器思路
- Spring_day2
- 使用Tensorflow进行脸部识别
- qq浏览器网页翻译_在线英文翻译、文档翻译,这几款翻译工具你值得拥有
- unity3d中串口的使用
- 暂且解决INSTALL_FAILED_SHARED_USER_INCOMPATIBLE错误
- 日本专利分类方法 FI 和 F-Term 分类号 检索
- 【宋红康 MySQL数据库 】【高级篇】【09】InnoDB的数据存储结构
- html5离散数学,离散数学怎样判断合取范式和析取范式
- 4个避免使用npm link的理由
- 微信小程序--解密用户信息
- php去掉二维数组中某key的值
- 阿里云创始人王坚:别人可以背弃理想,我不可以
- js控制html控件显示隐藏和是否可用
热门文章
- 一份Java面试宝典「Java核心知识点」囊括JVM,Spring等29个技术
- 或且非 java_Java且或非的符号
- oracle18c shard技术分享-安装部署
- 日立6TB充氦硬盘详细规格、实物照片
- WWW 2019 | HAN:异质图注意力网络
- 深度|加州大学Russell教授:人工智能基础概念与34个误区
- 华硕主板无盘启动bios设置_华硕主板bios设置图解教程
- Linux基础PHP网站搭建
- 浙江大学数据结构第一讲:1.1什么是数据结构
- 求一元多项式 P(x) = a0 + a1x + a2x^2 + ... + anx^n 的值P(x0)。