一、前提

上一节学习了flannel,但是我们应该了解flannel只能提供网络通讯,而不能提供网络策略。因此,我们本节学习canal,让它来提供网络策略,来配合flannel使用。

canal是calico的一个项目;

calico的网址:https://docs.projectcalico.org/v3.6/introduction/

Installing Calico for policy and flannel for networking:

https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/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

https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/flannel

部署:

(1)If your cluster has RBAC enabled, issue the following command to configure the roles and bindings that Calico requires.

kubectl apply -f https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/canal/rbac.yaml

(2)Issue the following command to install Calico.

kubectl apply -f https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/canal/canal.yaml

稍等片刻,查看:

[root@master ~]# kubectl get pods -n kube-system

Egres:出站,表示pod自己是客户端,访问别人。
     Ingress:入站,表示Pod自己是目标,别人来访问自己。
     通常,客户端的端口是随机的,服务端的端口是固定的。
     Network Policy:用来控制哪个pod来和外部或内部进行通信。
     podSelecto:pod选择器
     policyTypes:用来控制Ingres和Egres哪个生效。

使用:

(3)示例: ingress

建立两个namespace,在两个namespace里再创建pod,让两个namespace里的pod通信,并添加策略控制;

建立两个名称空间,一个模拟测试,一个模拟生产;

a、查看资源定义清单字段

[root@master ~]# kubectl explain networkpolicy

[root@master ~]# kubectl explain networkpolicy.spec

b、定义一个ingress,拒绝的所有的,只对特定的开放;

可以出去,但是别人不能进来

c、创建ingress

[root@master networkpolicy]# kubectl apply -f ingress-def.yaml -n dev    #-n表示只对哪个名称空间生效

查看

d、在dev命名空间中创建pod,看能不能被访问

[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     NOMINATED NODE   READINESS GATES
pod1   1/1     Running   0          9m5s   10.244.1.2   node01   <none>           <none>

[root@master networkpolicy]# curl 10.244.1.2       #测试证明不能被访问

e、在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 NOMINATED NODE READINESS GATES
pod1 / Running 31s 10.244.1.3 node01 <none> <none>
[root@master networkpolicy]# curl 10.244.1.3
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>  #可以访问到

f、下面改一下ingress资源定义清单,允许所有入站;

[root@master networkpolicy]# vim ingress-def.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-ingress
spec:
podSelector: {}
ingress:
- {}  #表示允许所有
policyTypes:
- Ingress
[root@master networkpolicy]# kubectl apply -f ingress-def.yaml -n dev
networkpolicy.networking.k8s.io/deny-all-ingress configured
[root@master networkpolicy]# kubectl get pods -n dev -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod1 / Running 28m 10.244.1.2 node01 <none> <none>
[root@master networkpolicy]# curl 10.244.1.2
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>  #
此时可以访问了
[root@master networkpolicy]# curl 10.244.1.3
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

g、将dev命令空间中的pod1打标,稍后设定能访问有此标签的pod的80端口;

[root@master networkpolicy]# kubectl label pods pod1 app=myapp -n dev  #打标签
pod/pod1 labeled
[root@master networkpolicy]# vim allow-netpol-demo.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-myapp-ingress
spec:
podSelector:
matchLabels:
app: myapp #选择有myapp标签的pod
ingress:
- from:
- ipBlock:
cidr: 10.244.0.0/ #允许这个网段的
except:
- 10.244.1.2/ #但是不允许这个地址
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 16s
deny-all-ingress <none> 76m
[root@master networkpolicy]#
[root@master networkpolicy]# curl 10.244.1.2 #访问
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

(4)egress

a、创建egress(拒绝所有),并生效到prod名称空间

[root@master networkpolicy]# vim egress-def.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-egress
spec:
podSelector: {}
policyTypes:
- Egress #拒绝所有出站流量 [root@master networkpolicy]# kubectl apply -f egress-def.yaml -n prod
networkpolicy.networking.k8s.io/deny-all-egress created
[root@master networkpolicy]# kubectl get pods -n prod
NAME READY STATUS RESTARTS AGE
pod1 / Running 63m
[root@master ~]# kubectl get pods -n kube-system -o wide |grep coredns
coredns-86c58d9df4-8lwrg / Running 74d 10.244.0.18 master <none> <none>
coredns-86c58d9df4-z66dd / Running 74d 10.244.0.19 master <none> <none> [root@master networkpolicy]# kubectl exec pod1 -it -n prod -- /bin/sh
/ # ping 10.244.0.18 #连入prod下的pod,ping coredns,发现ping不通

b、放行所有

[root@master networkpolicy]# vim egress-def.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-egress
spec:
podSelector: {}
egress:
- {} #允许所有出站流量
policyTypes:
- Egress [root@master networkpolicy]# kubectl apply -f egress-def.yaml -n prod
networkpolicy.networking.k8s.io/deny-all-egress configured
[root@master networkpolicy]#
[root@master networkpolicy]# kubectl exec pod1 -it -n prod -- /bin/sh #连入
/ # ping 10.244.0.18
PING 10.244.0.18 (10.244.0.18): data bytes
bytes from 10.244.0.18: seq= ttl= time=43.914 ms #可以ping通了
bytes from 10.244.0.18: seq= ttl= time=0.403 ms

 

为了安全,我们可以先设置每个名称空间拒绝所有入站、拒绝所有出站,然后单独放行;

但是这样也会有一个问题,就是同一名称空间的pod也不能通信;

所以还要加条策略就是允许本名称空间的pod之间可以互相通信(放行所有出站目标为本名称空间内的所有pod),但是不允许和外部名称空间之间进行通信;

k8s-基于canel的网络策略-十九的更多相关文章

  1. k8s基于canel的网络策略

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

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

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

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

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

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

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

  5. k8s系列---基于canal的网络策略

    文章拷自:http://blog.itpub.net/28916011/viewspace-2215383/ 加上自己遇到的问题简单记录 安装文档:https://docs.projectcalico ...

  6. canel的网络策略

    资源: https://docs.projectcalico.org/v3.2/getting-started/kubernetes/installation/flannel 基于pod Egress ...

  7. OpenStack 网络服务 Neutron 私有网络构建(十九)

    本章内容基于之前提供者网络构建的基础上进行改动,之前文章参考如下: Openstack 网络服务 Neutron介绍和控制节点部署 (九) Openstack 网络服务 Neutron计算节点部署(十 ...

  8. 使用kubectl管理k8s集群(二十九)

    前言 在搭建k8s集群之前,我们需要先了解下kubectl的使用,以便在集群部署出现问题时进行检查和处理.命令和语法记不住没有关系,但是请记住主要的语法和命令以及帮助命令的使用. 在下一篇,我们将讲述 ...

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

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

随机推荐

  1. flask如何处理并发

    1.使用自身服务器的多进程或者多线程,参考werkzeug的run_simple函数的入参.注意,进程和线程不能同时开启 2.使用gunicorn使用多进程,-w worker 进程数,类型于运行多个 ...

  2. scapy在wlan中的应用

    Scapy 又是scapy,这是python的一个网络编程方面的库,它在wlan中也有很强大的应用.一般我们买块网卡,然后aircrack-ng套件爆破一下邻居的密码,其实我们可以用scapy写一些有 ...

  3. Service具体解释(一):什么是Service

    < Service具体解释(一):什么是Service> < Service具体解释(二):Service生命周期> <Service具体解释(三):Service的使用 ...

  4. 前端高频面试题 JavaScript篇

    以下问题都来自于互联网前端面经分享,回答为笔者通过查阅资料加上自身理解总结,不保证解答的准确性,有兴趣讨论的同学可以留言或者私信讨论. 1.JS的异步机制? 2.闭包如何实现? 3.原型链.继承? 4 ...

  5. ubuntu 14.04安装nodejs

    http://stackoverflow.com/questions/32902699/cannot-install-ember-on-ubuntu-1404/33495134

  6. 安卓动态逆向分析工具--Andbug&Androguard

    工具使用方法: 转自: http://bbs.pediy.com/showthread.php?t=183412 https://testerhome.com/topics/3542 安装andbug ...

  7. poj 2264 Advanced Fruits(DP)

    Advanced Fruits Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1944   Accepted: 967   ...

  8. Codeforces Round #426 (Div. 2) D. The Bakery 线段树优化DP

    D. The Bakery   Some time ago Slastyona the Sweetmaid decided to open her own bakery! She bought req ...

  9. es 300G 数据删除 执行计划 curl REST 操作

    es 300G 数据删除 [es union_2017执行计划] [测试执行环境]线上D服务器[测试用例]get:curl -XGET ES:9200/_cat/indices?v post:curl ...

  10. Difference between exit() and sys.exit() in Python

    Difference between exit() and sys.exit() in Python - Stack Overflow https://stackoverflow.com/questi ...