文章拷自: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. selenium chrome headless无界面引擎

    注意:PhantomJS已被舍弃 chrome headless 在打开浏览器之前添加参数 import time import sys from selenium import webdriver ...

  2. Java入门 - 高级教程 - 06.邮件收发

    原文地址:http://www.work100.net/training/java-email.html 更多教程:光束云 - 免费课程 邮件收发 序号 文内章节 视频 1 概述 2 发送一封简单的邮 ...

  3. Promise.finally

    const Gen = (time) => { return new Promise((resolve, reject) => { setTimeout(function () { if( ...

  4. Add Scaffold

  5. 废旧手机改造之给你的手机安装win10系统

    最近又开始琢磨把我这个即将退出的二手手机再利用一下 发现了一个不错的软件 先上图 是不是感觉逼格很高啊 点击下面链接即可下载使用 https://www.lanzous.com/i4gpsib 欢迎交 ...

  6. CTRL_IKun团队项目总结

    1. 团队项目-总结 这个作业属于哪个课程 课程链接 这个作业要求在哪里 作业要求 团队名称 CTRP-lkun 这个作业的目标 团队项目总结,每个人的收获和感悟 Github地址 Github 2. ...

  7. Python 判断小数的函数

    需求分析:1.小数点个数可以使用.count()方法2.按照小数点进行分割 例如: 1.98 [1,98]3.正小数:小数点左边是整数,右边也是整数 可以使用.isdigits()方法4.负小数:小数 ...

  8. Python和JS实现的Web SSH工具webssh,牛逼

    这个工具是使用Python开发,可以从下面地址了解详情. 官网:https://pypi.org/project/webssh/ webssh这个工具可以干啥: 在linux机器上安装python环境 ...

  9. c/python 的区别

    c             python                                                                                ...

  10. git hub安装

    windows下GitHub的安装.配置以及项目的上传过程详细介绍 阅读目录 概要 操作必备 GitHub的安装 Git的初始配置 本地Git与远程GitHub连接的建立 将本地项目上传到GitHub ...