文章拷自: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. Epplus Excel 导入 MSSQL 数据库

    效果: 下载EXE     源码

  2. Excel-条件格式

    今天运用了一下条件格式中的自建规则进行公式筛选, 设置格式那里一定要将$P$8修改为$P8 然后双击修改后的第一项进行单元格的自动填充

  3. Mklink 转移文件/文件夹

    使用Mklink可以创建一个目录链接,从而完美转移文件/文件夹 MS官方文档 https://docs.microsoft.com/en-us/windows-server/administratio ...

  4. MNIST数据集

    一.MNIST数据集分类简单版本 import tensorflow as tffrom tensorflow.examples.tutorials.mnist import input_data # ...

  5. linux ftp 服务器 ,web 服务器 配置

    ftp服务器配置: 1:vsftpd.conf 2;vsftpd.ftpusers 3:vsftpd.user_list web服务器配置: apache 配置

  6. jquery的版本 纵多 , 各个版本的插件的融合 ,

    有些插件在哪些版本下没有 插件之间因为版本冲突 是得不偿失的事情

  7. 小白学Java:内部类

    目录 小白学Java:内部类 内部类的分类 成员内部类 局部内部类 静态内部类 匿名内部类 内部类的继承 内部类有啥用 小白学Java:内部类 内部类是封装的一种形式,是定义在类或接口中的类. 内部类 ...

  8. Java多线程:实现API接口创建线程方式详解

    先看例子: /**实现Runnable接口创建线程步骤: * 1.创建一个实现Runnable接口的类 * 2.重写Runnable类中抽象的run()方法 * 3.创建实现类的对象 * 4.声明Th ...

  9. tomcat性能优化梳理

    tomcat性能优化 Tomcat本身优化 Tomcat内存优化 启动时告诉JVM我要一块大内存(调优内存是最直接的方式) 我们可以在 tomcat 的启动脚本 catalina.sh 中设置 jav ...

  10. Docker底层架构之命名空间

    前言 命名空间是 Linux 内核一个强大的特性.每个容器都有自己单独的命名空间,运行在其中的 应用都像是在独立的操作系统中运行一样.命名空间保证了容器之间彼此互不影响.相应的命名空间功能如下: pi ...