文章拷自: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的网络策略的更多相关文章

  1. kubernetes学习笔记之十三:基于calico的网络策略入门

    一..安装calico [root@k8s-master01 ~]# kubectl apply -f https://docs.projectcalico.org/v3.3/getting-star ...

  2. k8s基于canel的网络策略

    Kubernetes能够把集群中不同Node节点上的Pod连接起来,并且默认情况下,每个Pod之间是可以相互访问的.但在某些场景中,不同的Pod不应该互通,这个时候就需要进行访问控制.亲测:在kube ...

  3. k8s之网络插件flannel及基于Calico的网络策略

    1.k8s网络通信 a.容器间通信:同一个pod内的多个容器间的通信,通过lo即可实现; b.pod之间的通信:pod ip <---> pod ip,pod和pod之间不经过任何转换即可 ...

  4. k8s集群Canal的网络控制 原

    1 简介 直接上干货 public class DispatcherServlet extends HttpServlet { private Properties contextConfigProp ...

  5. Kubernetes 学习19基于canel的网络策略

    一.概述 1.我们说过,k8s的可用插件有很多,除了flannel之外,还有一个流行的叫做calico的组件,不过calico在很多项目中都会有这个名字被应用,所以他们把自己称为project cal ...

  6. Kubernetes之canal的网络策略(NetworkPolicy)

    安装要求: 1.我们这里安装的是3.3的版本.kubernetes的要求: 支持的版本 1.10 1.11 1.12 2.CNI插件需要启用,Calico安装为CNI插件.必须通过传递--networ ...

  7. k8s系列----索引

    day1:k8s集群准备搭建和相关介绍 day2:k8spod介绍与创建 day3:k8sService介绍及创建 day4:ingress资源和ingress-controller day5:存储卷 ...

  8. Kubernetes学习之路(二十一)之网络模型和网络策略

    目录 Kubernetes的网络模型和网络策略 1.Kubernetes网络模型和CNI插件 1.1.Docker网络模型 1.2.Kubernetes网络模型 1.3.Flannel网络插件 1.4 ...

  9. 041.Kubernetes集群网络-K8S网络策略

    一 Kubernetes网络策略 1.1 策略说明 为实现细粒度的容器间网络访问隔离策略,Kubernetes发布Network Policy,目前已升级为networking.k8s.io/v1稳定 ...

随机推荐

  1. Jquery电子签名制作_jSignature

    今天用Jquery的jSignature库制作一个电子签名 后台.net core上传到指定文件夹 下载jquery库 提取码:rd9g html @{ Layout = null; } <!D ...

  2. mysql的查询优化

    参考网站:http://www.liyblog.top/p/6 这里总结了52条对sql的查询优化,下面详细来看看,希望能帮助到你     1, 对查询进行优化,应尽量避免全表扫描,首先应考虑在 wh ...

  3. AVR单片机教程——蜂鸣器

    本文隶属于AVR单片机教程系列.   引子 定时/计数器(简称定时器)是单片机编程中至关重要的一部分,再简单的单片机也会带有定时器. 也许你会觉得我们已经在delay函数中接触过定时器了,然而并不是, ...

  4. AVR单片机教程——PWM调光

    本文隶属于AVR单片机教程系列.   PWM 两位数码管的驱动方式是动态扫描,每一位都只有50%的时间是亮的,我们称这个数值为其占空比.让引脚输出高电平点亮LED,占空比就是100%. 在驱动数码管时 ...

  5. C++ 引用分析

    引用 左值引用,建立既存对象的别名 右值引用,可用于为临时对象延长生命周期 转发引用,保持函数实参的类别 悬置引用,对象生命周期已经结束的引用,访问改引用为未定义行为 值类别,左值,纯右值,亡值 st ...

  6. 部署Maven项目到tomcat报错:java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderLi

    Maven项目下update maven后Eclipse报错:java.lang.ClassNotFoundException: ContextLoaderL     严重: Error config ...

  7. 各种反弹shell方法总结

    获取shell的方法总结: shell分为两种,一种是正向shell,另一种是反向shell.如果客户端连接服务器,客户端主动连接服务器,就称为正向shell.如果客户端连接服务器,服务器想要获得客户 ...

  8. Mysql Innodb cluster集群搭建

    之前搭建过一个Mysql Ndb cluster集群,但是mysql版本是5.7的,看到官网上mysql8的还是开发者版本,所以尝试搭建下mysql Innodb cluster集群. MySQL的高 ...

  9. Spring AOP源码分析--代理方式的选择

    能坚持别人不能坚持的,才能拥有别人未曾拥有的.关注编程大道公众号,让我们一同坚持心中所想,一起成长!! 年前写了一个面试突击系列的文章,目前只有redis相关的.在这个系列里,我整理了一些面试题与大家 ...

  10. C语言创建文件

    问题需求:使用程序创建一个文件(当该文件不存在时则创建). 代码如下: // 创建文件 void CreateFile() { //文件指针 FILE *fileP; char fileName[] ...