k8s系列---基于canal的网络策略
文章拷自:http://blog.itpub.net/28916011/viewspace-2215383/ 加上自己遇到的问题简单记录
安装文档:https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/flannel
我们知道flannel只能提供网络通讯,而不能提供网络策略。因此,我们本节学习canal,让它来提供网络策略,来配合flannel使用。
前提条件
1、kubelet必须配置为CNI网络插件(即--network-plugin-cni,默认新版本默认就是CNI)
2、kube-proxy必须以iptables模式启动,不能以ipvs方式启动;
3、kube-proxy不能以--masquerade-all方式启动,因为这和calico策略冲突;
4、k8s版本至少要v1.3.0
部署canal
1、
[root@master ~]# kubectl apply -f https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/canal/rbac.yaml
2、
[root@master ~]# kubectl apply -f https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/canal/canal.yaml
3、
[root@master ~]# kubectl get pods -n kube-system -o wide
NAME READY STATUS RESTARTS AGE IP NODE
canal-7q4k7 3/3 Running 0 4m 172.16.1.101 node1
canal-dk2tc 3/3 Running 0 4m 172.16.1.102 node2
canal-zr8l4 3/3 Running 0 4m 172.16.1.100 master
我这边部署完成之后,发现flannel的directrouting模式又没了。然后后面去pod内ping的时候发现跨node节点已经不通了。于是又把flannel删了重建,最后正常了。很奇怪的现象。还有就是有个最后他妈的卡住了,canal一直不running状态,node节点磁盘io跑满了,导致该node上的pod都无法连接。最后重启该node,就好了。
建立网络策略:
[root@master ~]# mkdir networkpolicy
[root@master ~]# cd networkpolicy/
[root@master networkpolicy]# vim ingress-def.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-ingress
spec:
podSelector: {} #pod选择器设置为空,表示选择所有pod,即控制整个名称空间
policyTypes:
- Ingress #表示只对ingress生效,但是我们上面又把podSelector设置为空,表示默认是ingress拒绝所有的
#但是我们这里面又没有加egress,所以默认egress是允许所有的
[root@master networkpolicy]# kubectl apply -f ingress-def.yaml -n dev #-n表示只对哪个名称空间生效
networkpolicy.networking.k8s.io/deny-all-ingress created
[root@master networkpolicy]# kubectl get netpol -n dev
NAME POD-SELECTOR AGE
deny-all-ingress <none> 1m
建立个容器,放在dev名称空间里面:
[root@master networkpolicy]# cat pod-a.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod1
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
[root@master networkpolicy]# kubectl apply -f pod-a.yaml -n dev
pod/pod1 created
root@master networkpolicy]# kubectl get pods -n dev -o wide
NAME READY STATUS RESTARTS AGE IP NODE
pod1 1/1 Running 0 1m 10.244.2.2 node2
[root@master networkpolicy]# curl 10.244.2.2 #看到我们在宿主机上访问不到dev名称空间里面的pod10.244.2.2,这是因为dev名称空间里面有个deny-all-ingress网络策略,拒绝任何入站请求导致的。
接下来我们在prod名称空间里面建立个pod:
[root@master networkpolicy]# kubectl apply -f pod-a.yaml -n prod
pod/pod1 created
[root@master networkpolicy]# kubectl get pods -n prod -o wide
NAME READY STATUS RESTARTS AGE IP NODE
pod1 1/1 Running 0 1m 10.244.2.3 node2
[root@master networkpolicy]# curl 10.244.2.4 #我们看到在宿主机上可以访问到prod名称空间里面的pod
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[root@master networkpolicy]# cat ingress-def.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-ingress
spec:
podSelector: {} #pod选择器设置为空,表示选择所有pod,即控制整个名称空间
ingress:
- {} #空表示允许所有入站访问
policyTypes:
- Ingress #表示只对ingress生效
#但是我们这里面又没有加egress,所以默认egress是允许所有的
[root@master networkpolicy]# kubectl apply -f ingress-def.yaml -n dev
networkpolicy.networking.k8s.io/deny-all-ingress configured
[root@master networkpolicy]# curl 10.244.2.2 #这时我们就能在宿主机上访问到dev名称空间里面的容器了
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
我们接下来再还原会原来的网络策略,即拒绝入所有入站请求:
[root@master networkpolicy]# cat ingress-def.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-ingress
spec:
podSelector: {} #pod选择器设置为空,表示选择所有pod,即控制整个名称空间
policyTypes:
- Ingress #表示只对ingress生效
#但是我们这里面又没有加egress,所以默认egress是允许所有的
[root@master networkpolicy]# kubectl apply -f ingress-def.yaml -n dev
networkpolicy.networking.k8s.io/deny-all-ingress unchanged
[root@master networkpolicy]# curl 10.244.2.2 #发现在宿主机上又不能访问访问到dev里面的pod了
下面我们给dev名称空间里面的pod1打个标签叫app=myapp
[root@master networkpolicy]# kubectl label pods pod1 app=myapp -n dev
pod/pod1 labeled
[root@master networkpolicy]# 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 #指定网段,允许从10.244.0.0/16入站到pod里面
except:
- 10.244.1.2/32 #排除这个地址
ports:
- protocol: TCP
port: 80
[root@master networkpolicy]# kubectl apply -f allow-netpol-demo.yaml -n dev
networkpolicy.networking.k8s.io/allow-myapp-ingress created
[root@master networkpolicy]# kubectl get netpol -n dev
NAME POD-SELECTOR AGE
allow-myapp-ingress app=myapp 1m
deny-all-ingress <none> 5h
[root@master networkpolicy]# curl 10.244.2.2 #看到加了allow-myapp-ingress网络策略后,立即就能访问dev里面的pod了
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
上面我们介绍了ingress入站规则,下面我们介绍egress出站规则。
[root@master networkpolicy]# cat egress-def.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-egress
spec:
podSelector: {} #pod选择器设置为空,表示选择所有pod,即控制整个名称空间
policyTypes:
- Egress #表示只对egress生效
[root@master networkpolicy]# kubectl apply -f egress-def.yaml -n prod
networkpolicy.networking.k8s.io/deny-all-egress created
[root@master ~]# kubectl get pods -n kube-system -o wide
NAME READY STATUS RESTARTS AGE IP NODE
canal-7q4k7 3/3 Running 0 6h 172.16.1.101 node1
canal-dk2tc 3/3 Running 0 6h 172.16.1.102 node2
canal-zr8l4 3/3 Running 0 6h 172.16.1.100 master
coredns-78fcdf6894-2l2cf 1/1 Running 18 24d 10.244.0.46 master
coredns-78fcdf6894-dkkfq 1/1 Running 17 24d 10.244.0.45 master
etcd-master 1/1 Running 18 24d 172.16.1.100 master
kube-apiserver-master 1/1 Running 19 24d 172.16.1.100 master
kube-controller-manager-master 1/1 Running 18 24d 172.16.1.100 master
[root@master networkpolicy]# kubectl get pods -n prod
NAME READY STATUS RESTARTS AGE
pod1 1/1 Running 0 1h
[root@master networkpolicy]# kubectl exec pod1 -it -n prod -- /bin/sh
/ # ping 10.244.0.45 #看到ping其他名称空间的容器被拒绝,这就是因为网络策略deny-all-egress起的作用,它表示拒绝容器所有出口流量
PING 10.244.0.45 (10.244.0.45): 56 data bytes
[root@master networkpolicy]# cat egress-def.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-egress
spec:
podSelector: {} #pod选择器设置为空,表示选择所有pod,即控制整个名称空间
egress:
- {} #表示允许所有egress出去的流量
policyTypes:
- Egress #表示只对egress生效
[root@master networkpolicy]# kubectl apply -f egress-def.yaml -n prod
[root@master networkpolicy]# kubectl exec pod1 -it -n prod -- /bin/sh #看到放行出站后,容器就可以ping通外部的容器了
/ # ping 10.244.0.45
PING 10.244.0.45 (10.244.0.45): 56 data bytes
64 bytes from 10.244.0.45: seq=0 ttl=62 time=0.227 ms
64 bytes from 10.244.0.45: seq=1 ttl=62 time=0.284 ms
我们为了更安全,我们可以设置每个名称空间拒绝所有入站,拒绝所有出站,然后再单独放行。不过,这样也出现一个问题,就是一个名称空间中,所有pod之间也不能通信了。所以还要加条策略就是允许本名称空间中的pod之间可以互相通信(放行所有出站目标本名称空间内的所有pod),但是不允许和外部名称空间之间进行通信。
k8s系列---基于canal的网络策略的更多相关文章
- kubernetes学习笔记之十三:基于calico的网络策略入门
一..安装calico [root@k8s-master01 ~]# kubectl apply -f https://docs.projectcalico.org/v3.3/getting-star ...
- k8s基于canel的网络策略
Kubernetes能够把集群中不同Node节点上的Pod连接起来,并且默认情况下,每个Pod之间是可以相互访问的.但在某些场景中,不同的Pod不应该互通,这个时候就需要进行访问控制.亲测:在kube ...
- k8s之网络插件flannel及基于Calico的网络策略
1.k8s网络通信 a.容器间通信:同一个pod内的多个容器间的通信,通过lo即可实现; b.pod之间的通信:pod ip <---> pod ip,pod和pod之间不经过任何转换即可 ...
- k8s集群Canal的网络控制 原
1 简介 直接上干货 public class DispatcherServlet extends HttpServlet { private Properties contextConfigProp ...
- Kubernetes 学习19基于canel的网络策略
一.概述 1.我们说过,k8s的可用插件有很多,除了flannel之外,还有一个流行的叫做calico的组件,不过calico在很多项目中都会有这个名字被应用,所以他们把自己称为project cal ...
- Kubernetes之canal的网络策略(NetworkPolicy)
安装要求: 1.我们这里安装的是3.3的版本.kubernetes的要求: 支持的版本 1.10 1.11 1.12 2.CNI插件需要启用,Calico安装为CNI插件.必须通过传递--networ ...
- k8s系列----索引
day1:k8s集群准备搭建和相关介绍 day2:k8spod介绍与创建 day3:k8sService介绍及创建 day4:ingress资源和ingress-controller day5:存储卷 ...
- Kubernetes学习之路(二十一)之网络模型和网络策略
目录 Kubernetes的网络模型和网络策略 1.Kubernetes网络模型和CNI插件 1.1.Docker网络模型 1.2.Kubernetes网络模型 1.3.Flannel网络插件 1.4 ...
- 041.Kubernetes集群网络-K8S网络策略
一 Kubernetes网络策略 1.1 策略说明 为实现细粒度的容器间网络访问隔离策略,Kubernetes发布Network Policy,目前已升级为networking.k8s.io/v1稳定 ...
随机推荐
- Spring学习记录5——数据库事务基础知识
何为数据库事务 “一荣共荣,一损共损”这句话很能体现事务的思想,很多复杂的事务要分步进行,但它们组成了一个整体,要么整体生效,要么整体失效.这种思想反映到数据库上,就是多条SQL语句,要么全部成功,要 ...
- DateTime.Now
// 2008年4月24日 System.DateTime.Now.ToString( " D " );// 2008-4-24 System.DateTime.Now.ToStr ...
- 一个按键搞定日常git操作
Git is a free and open source distributed version control system designed to handle everything from ...
- RabbitMQ入门(二)工作队列
在文章RabbitMQ入门(一)之Hello World,我们编写程序通过指定的队列来发送和接受消息.在本文中,我们将会创建工作队列(Work Queue),通过多个workers来分配耗时任务. ...
- python 进程Queue
1.作用:进程之间的数据交互 2.常用方法 """ 对象.put() 作用:放入队列一个数据 对象.get() 作用:取队列一个数据,若队列没有值,则阻塞 对象.empt ...
- Java入门 - 高级教程 - 01.数据结构
原文地址:http://www.work100.net/training/java-data-structure.html 更多教程:光束云 - 免费课程 数据结构 序号 文内章节 视频 1 概述 2 ...
- 一文带你了解 HTTP 黑科技
这是 HTTP 系列的第三篇文章,此篇文章为 HTTP 的进阶文章. 在前面两篇文章中我们讲述了 HTTP 的入门,HTTP 所有常用标头的概述,这篇文章我们来聊一下 HTTP 的一些 黑科技. HT ...
- Set,Multiset,Iterator(迭代器)详解
Set,Multiset,Iterator(迭代器) Iterator:迭代器 我们可以发现所谓一些数据结构比如说数组和链表,它们都有一些相似的性质.我们看下面两个例子: 数组:定义数组\(int~a ...
- 优雅写Java之三(IO与文本解析)
一.资源相关 二.路径与文件 读文件: String fileName = "str.txt"; Files.lines(Paths.get(fileName), Standard ...
- applyColorMap 在OpenCV中对灰度图进行颜色映射,实现数据的色彩化
什么是色彩映射: 说直白点就是将各种数据映射成颜色信息,例如:温度,高度,压力,密度,湿度,城市拥堵数据等等 色彩化后更加直观表达 在OpenCV里可以使用 Mat im_gray = imread( ...