网络策略-NetworkPolicy

1,NetworkPolicy

简介
为了实现细粒度的容器间往来访问隔离策略,Kubernetes 从 1.3 版本开始,由 SIG-Network 小组主导研发了 Network Policy 机制,目前已升级为 networking.k8s.io/v1 稳定版本。Network Policy 的主导功能是对 Pod 间的网络通信进行限制和准入控制,设置方式为将 Pod 的 Label 作为查询条件,设置允许访问或禁止访问的客户端 Pod 列表。目前查询条件可以作用于 Pod 和 Namespace 级别。

为了使用 Network Policy,Kubernetes 引入了一个新的资源对象 NetworkPolicy,供用户设置 Pod 间网络访问的策略。但仅定义一个网络策略是无法完成实际的网络隔离的,还需要一个策略控制器(Policy Controller)进行策略的实现。策略控制器由第三方网络组建提供,目前 Calico、Cilium、Kube-router、Romana、Weave Net 等开源项目均支持网络策略的实现。

Policy Controller 需要实现一个 API Listener,监听用户设置的 NetworkPolicy 定义,并将网络访问规则通过各 Node 的 Agent 进行实际设置(Agent 则需要通过 CNI 网络插件实现)。

隔离和非隔离的 Pod

默认情况下,Pod 是非隔离的,它们接受任何来源的流量。

Pod 在被某 NetworkPolicy 选中时进入被隔离状态。 一旦名称空间中有 NetworkPolicy 选择了特定的 Pod,该 Pod 会拒绝该 NetworkPolicy 所不允许的连接。 (名称空间下其他未被 NetworkPolicy 所选择的 Pod 会继续接受所有的流量)

网络策略不会冲突,它们是累积的。 如果任何一个或多个策略选择了一个 Pod, 则该 Pod 受限于这些策略的 入站(Ingress)/出站(Egress)规则的并集。因此评估的顺序并不会影响策略的结果。

为了允许两个 Pods 之间的网络数据流,源端 Pod 上的出站(Egress)规则和 目标端 Pod 上的入站(Ingress)规则都需要允许该流量。 如果源端的出站(Egress)规则或目标端的入站(Ingress)规则拒绝该流量, 则流量将被拒绝。
 

部署calic网络

wget https://docs.projectcalico.org/v3.9/manifests/calico.yaml
kubectl apply -f calico.yaml

[root@master ~]# kubectl get pods -n kube-system
NAME                                       READY   STATUS    RESTARTS   AGE
calico-kube-controllers-5fbfc9dfb6-jhddm   1/1     Running   0          16m
calico-node-2d28h                          1/1     Running   0          16m
calico-node-77rx5                          1/1     Running   0          16m
calico-node-xzrdh                          1/1     Running   0          16m
coredns-7ff77c879f-p4smr                   1/1     Running   0          18m
coredns-7ff77c879f-tn7w9                   1/1     Running   0          18m
etcd-master                                1/1     Running   0          18m
kube-apiserver-master                      1/1     Running   0          18m
kube-controller-manager-master             1/1     Running   0          18m
kube-proxy-8h5gh                           1/1     Running   0          18m
kube-proxy-97dzz                           1/1     Running   0          18m
kube-proxy-986fs                           1/1     Running   0          18m
kube-scheduler-master                      1/1     Running   0          18m

NetworkPolicy示例

参数说明:

podSelector:用于定义该网络策略作用的 Pod 方位,本例的选择条件为包含 "role=db" 标签的 Pod。

policyTypes:网络策略的类型,包括 ingress 和 egress 两种,用于设置目标 Pod 的入站和出站的网络限制。

ingress:定义允许访问目标 Pod 的入站白名单规则,满足 from 条件的客户端才能访问 ports 定义的目标 Pod 端口号。

- from:对符合条件的客户端 Pod 进行网络放行,规则包括基于客户端 Pod 的 Label、基于客户端 Pod 所在的 Namespace 的 Label 或者客户端的 IP 范围。

- ports:允许访问的目标 Pod 监听的端口号。

egress:定义目标 Pod 允许访问的 "出站" 白名单规则,目标 Pod 仅允许访问满足 to 条件的服务端 IP 范围和 ports 定义的端口号。

- to: 允许访问的服务端信息,可以基于服务端 Pod 的Label、基于服务端 Pod 所在的 Namespace 的 Label 或者服务端 IP 范围。

- ports:允许访问的服务端的端口号。
创建两个名称空间
[root@master ~]# kubectl create namespace dev 
namespace/dev created
[root@master ~]# kubectl create namespace prod
namespace/prod created

[root@master ~]# cat pods.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod1
spec:
  containers:
  - name: myapp 
    image: ikubernetes/myapp:v1
[root@master ~]# kubectl apply -f pods.yaml -n dev 
[root@master ~]# kubectl get pods -n dev -o wide
NAME   READY   STATUS    RESTARTS   AGE   IP                NODE     NOMINATED NODE   READINESS GATES
pod1   1/1     Running   0          57s   192.168.196.131   node01   <none>           <none>
[root@master ~]# cat ingres-def.yaml 
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata: 
  name: ingres
  namespace: dev
spec:
  podSelector: {}
  policyTypes: 
  - Ingress

测试:


image.png
将pod创建在prod中

[root@master ~]# kubectl apply -f pods.yaml -n prod
pod/pod1 created
[root@master ~]# kubectl get pods -n prod -owide
NAME   READY   STATUS    RESTARTS   AGE   IP               NODE     NOMINATED NODE   READINESS GATES
pod1   1/1     Running   0          14s   192.168.140.69   node02   <none>           
<none>

测试:
[root@master ~]# curl  192.168.140.69 
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>


上面的networkpolicy中定义了ingress要生效但是ingress没有定义规则就表示默认不允许任何人访问,egress没有定义默认所有的都可以访问

定义所有访问
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata: 
  name: ingres
  namespace: dev
spec:
  podSelector: {}
  ingress:
  - {}
  policyTypes: 
  - Ingress
  
[root@master ~]# kubectl apply  -f ingres-def.yaml 
networkpolicy.networking.k8s.io/ingres configured

测试:
[root@master ~]# curl 192.168.196.131
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

允许别人来放着这组pod
给pod打个标签
[root@master ~]# kubectl label pods pod1 app=myapp -n dev 
pod/pod1 labeled

vim allow-ingress.yaml

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy 
metadata: 
  name: allow-ingress
spec:
  podSelector:
    matchLabels:
      app: myapp
  ingress:
  - from:
    - ipBlock:
        cidr: 192.168.0.0/16
        except:
        - 192.168.1.12/32
    ports:
    - protocol: TCP
      port: 80

[root@master ~]# kubectl apply -f allow-ingress.yaml -n dev
[root@master ~]# kubectl get netpol -n dev
NAME            POD-SELECTOR   AGE
allow-ingress   app=myapp      65s
ingres          <none>         45m

官方文档:https://kubernetes.io/zh/docs/concepts/services-networking/network-policies/
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容