ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Kubernetes NetworkPolicy总结

2022-09-10 18:01:57  阅读:221  来源: 互联网

标签:总结 run NetworkPolicy Kubernetes web1 podSelector pod 80


  默认情况,集群外部主机可以访问集群内部应用,集群内部应用也可以访问集群外部主机,各个namespace之间没有做任何的隔离策略。

       基于calico组件实现网络策略,flannel组件则无法实现。

       基于NetworkPolicy在三层 (网络层)或四层(传输层)控制拒绝或允许请求流量。

       允许或拒绝特定的pod请求目的namespace中的目的pod的所有或指定端口。

       允许或拒绝特定的namespace请求目的namespace中的所有或特定的pod所有或指定端口。

       允许或拒绝特定的源IP范围或IP地址请求目的pod的所有或特定端口。

 

官网示例:

  https://kubernetes.io/zh/docs/concepts/services-networking/network-policies/

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
  namespace: default
spec:
  podSelector:
    matchLabels:
      role: db
  policyTypes:
    - Ingress
    - Egress
  ingress:
    - from:
        - ipBlock:
            cidr: 172.17.0.0/16
            except:
              - 172.17.1.0/24
        - namespaceSelector:
            matchLabels:
              project: myproject
        - podSelector:
            matchLabels:
              role: frontend
      ports:
        - protocol: TCP
          port: 6379
  egress:
    - to:
        - ipBlock:
            cidr: 10.0.0.0/24
      ports:
        - protocol: TCP
          port: 5978

 

必需字段:

与所有其他的Kubernetes配置一样,NetworkPolicy需要apiVersion、kind和metadata字段。关于配置文件操作的一般信息,请参考配置Pod以使用 ConfigMap, 和对象管理。

 

spec

NetworkPolicy规约中包含了在一个名字空间中定义特定网络策略所需的所有信息。

 

podSelector

每个NetworkPolicy都包括一个podSelector,它对该策略所适用的一组Pod 进行选择,只允许与被限制的pod同处于一个名称空间下的pod可以对被限制的pod进行访问。示例中的策略选择带有"role=db"标签的Pod。空的podSelector选择针对该pod的名字空间下的所有Pod可以对其访问。

 

namespaceSelector

此选择器将选择特定的名字空间,应将所有Pod用作其入站流量来源或出站流量目的地。

 

policyTypes:

  每个NetworkPolicy都包含一个policyTypes列表,其中包含Ingress或Egress 或两者兼具。policyTypes字段表示给定的策略是应用于进入所选Pod的入站流量还是来自所选Pod的出站流量,或两者兼有。如果NetworkPolicy未指定 policyTypes则默认情况下始终设置Ingress;如果NetworkPolicy有任何出口规则的话则设置Egress。

 

ingress:

  每个NetworkPolicy可包含一个ingress规则的白名单列表。每个规则都允许同时匹配from和ports部分的流量。示例策略中包含一条简单的规则:它匹配某个特定端口,来自三个来源中的一个,第一个通过ipBlock指定,第二个通过 namespaceSelector指定,第三个通过podSelector指定。

 

egress:

  每个NetworkPolicy可包含一个egress规则的白名单列表。每个规则都允许匹配to和port部分的流量。该示例策略包含一条规则,该规则将指定端口上的流量匹配到10.0.0.0/24中的任何目的地。

 

所以,该网络策略示例:

  隔离"default"名字空间下"role=db"的Pod(如果它们不是已经被隔离的话)。

  

  (Ingress规则)允许以下Pod连接到"default"名字空间下的带有"role=db"标签的所有Pod的6379 TCP端口:

    • "default"名字空间下带有"role=frontend"标签的所有Pod
    • 带有"project=myproject"标签的所有名字空间中的Pod
    • IP地址范围为17.0.0–172.17.0.255和172.17.2.0–172.17.255.255 (即,除了172.17.1.0/24之外的所有172.17.0.0/16)

 

(Egress规则)允许“default”命名空间中任何带有标签“role=db”的Pod 到CIDR 10.0.0.0/24下5978 TCP端口的连接。

 

选择器 to 和 from 的行为

  可以在ingress的from部分或egress的to部分中指定四种选择器:

  podSelector: 此选择器将在与NetworkPolicy相同的名字空间中选择特定的 Pod,应将其允许作为入站流量来源或出站流量目的地。非明确允许的pod,同namespace也无法访问。

  namespaceSelector此选择器将选择特定的名字空间,应将所有Pod用作其入站流量来源或出站流量目的地。

  namespaceSelector和podSelector一个指定namespaceSelector和podSelector 的to/from条目选择特定名字空间中的特定Pod。

  不允许从宿主机访问目标pod。

 

ipBlock:

  此选择器将选择特定的IP CIDR范围以用作入站流量来源或出站流量目的地。这些应该是集群外部IP,因为Pod IP存在时间短暂的且随机产生。

  集群的入站和出站机制通常需要重写数据包的源 IP 或目标 IP。在发生这种情况时,不确定在NetworkPolicy处理之前还是之后发生,并且对于网络插件、云提供商、Service实现等的不同组合,其行为可能会有所不同。

  对入站流量而言,这意味着在某些情况下,可以根据实际的原始源 IP 过滤传入的数据包,而在其他情况下,NetworkPolicy所作用的源IP则可能是 LoadBalancer或Pod的节点等。

  对于出站流量而言,这意味着从Pod到被重写为集群外部IP的Service IP的连接可能会或可能不会受到基于ipBlock的策略的约束。

 

准备实验环境

创建命名空间
[root@master10 manifests]/ kubectl config set-context --namespace web --current 
Context "kubernetes-admin@kubernetes" modified.

创建pod web1
[root@master10 manifests]/ kubectl run web1 --image=nginx --image-pull-policy=IfNotPresent
pod/web1 created

生成发布文件
[root@master10 manifests]/ kubectl exec -it web1 -- bash
root@web1:/ echo Hello web1 > /usr/share/nginx/html/index.html 
root@web1:/ 
exit

创建pod web2
[root@master10 manifests] kubectl run web2 --image=nginx --image-pull-policy=IfNotPresent
pod/web2 created

验证创建的pod
[root@master10 manifests] kubectl get pods --show-labels 
NAME   READY   STATUS    RESTARTS   AGE     LABELS
test   1/1     Running   0          5m37s   run=test
web1   1/1     Running   0          18m     run=web1
web2   1/1     Running   0          17m     run=web2

生成发布文件
[root@master10 manifests] kubectl exec -it web2 -- bash
root@web2:/ echo Hello web2 > /usr/share/nginx/html/index.html
root@web2:/
exit

创建service web1和web2
[root@master10 manifests] kubectl expose pod web1 --port=80 --target-port=80 --type=NodePort

[root@master10 manifests] kubectl expose pod web2 --port=80 --target-port=80 --type=NodePort

[root@master10 manifests] kubectl get svc
NAME   TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
web1   NodePort   10.100.150.156   <none>        80:31972/TCP   2m9s
web2   NodePort   10.108.8.97      <none>        80:31354/TCP   111s

创建测试pod,验证访问web1和web2 pod
[root@master10 manifests] kubectl run test --image=nginx --image-pull-policy=IfNotPresent
pod/test created

[root@master10 manifests] kubectl exec -it test -- curl web1
Hello web1
[root@master10 manifests] kubectl exec -it test -- curl web2
Hello web2
[root@master10 manifests] kubectl exec -it web2 -- curl web1
Hello web1

  

  集群访问:

 

  集群节点外部访问:

 

 

根据标签限定

  示例1:

  对namespace web 下的 run:web1 这个pod进行限制

       只允许 run:test这个标签的pod可以访问 web1的80端口

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: my-network-policy
  namespace: web
spec:
  podSelector:
    matchLabels:
      run: web1
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          run: test
    ports:
    - protocol: TCP
      port: 80

 

  创建策略

[root@master10 networkpolicy] kubectl create -f networkpolicy.yaml 
networkpolicy.networking.k8s.io/my-network-policy created

 

  查看策略

[root@master10 networkpolicy] kubectl describe networkpolicies.networking.k8s.io 
Name:         my-network-policy
Namespace:    web
Created on:   2022-07-04 11:37:06 +0800 CST
Labels:       <none>
Annotations:  <none>
Spec:
  PodSelector:     run=web1
  Allowing ingress traffic:
    To Port: 80/TCP
    From:
      PodSelector: run=test
  Not affecting egress traffic
  Policy Types: Ingress

 

  示例2

       允许同一namespce中所有pod访问具有标签run:web1的pod 80 端口

       matchLabels中不使用任何标签,则允许同一ns中所有pod

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: my-network-policy
  namespace: web
spec:
  podSelector:
    matchLabels:
      run: web1
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels:
    ports:
    - protocol: TCP
      port: 80

       也可以写成 - podSelector: {},省略matchlabels:

 

根据ns限定

  用于限定,来源于其他namespace中pod。

 

  示例1

  允许具有标签project: myproject的namespace中所有pod,访问当前ns中具有标签run: web1的pod 80端口。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: my-network-policy
  namespace: web
spec:
  podSelector:
    matchLabels:
      run: web1
  policyTypes:
  - Ingress
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          project: myproject
    ports:
    - protocol: TCP
      port: 80

 

  给network-test这个ns添加标签project=myproject,此时该ns中pod可以访问web1.web

kubectl label ns network-test project=myproject

  

  示例2

  允许所有namespace中所有pod,访问当前ns中具有标签run: web1的pod 80端口。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: my-network-policy
  namespace: web
spec:
  podSelector:
    matchLabels:
      run: web1
  policyTypes:
  - Ingress
  ingress:
  - from:
    - namespaceSelector: {}
    ports:
    - protocol: TCP
      port: 80

 

根据pod IP限定

  示例1

  允许网段172.17.0.0/16但不包括子网172.17.1.0/24中主机,访问具有标签 run: web1 的pod 80端口。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: my-network-policy
  namespace: web
spec:
  podSelector:
    matchLabels:
      run: web1
  policyTypes:
  - Ingress
  ingress:
  - from:
    - ipBlock:
        cidr: 172.17.0.0/16
        except:
        - 172.17.1.0/24
    ports:
    - protocol: TCP
      port: 80

 

不限定端口

  示例:

       允许具有run:test标签的pod对名为web的ns下的web1进行访问,不限制端口。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: my-network-policy
  namespace: web
spec:
  podSelector:
    matchLabels:
      run: web1
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          run: test

 

限定端口范围

  允许被限制的pod,同一ns下的run:test标签的pod可以访问被限制pod的32000-32768端口。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: my-network-policy
  namespace: web
spec:
  podSelector:
    matchLabels:
      run: web1
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          run: test
    ports:
    - protocol: TCP
      port: 32000
      endPort: 32768

 

限制pod出口访问

       1、Egress-podSelector-Pod出口方向目的IP及目的端口限制-只允许访问指定的10.0.0.0/24和12.0.0.0/24地址段范围的服务端口80和服务端口53

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: my-network-policy
  namespace: web
spec:
  podSelector:
    matchLabels:
      run: web1
  policyTypes:
  - Egress
  egress:
  - to:
    - ipBlock:
        cidr: 10.0.0.0/24
    - ipBlock:
        cidr: 12.0.0.0/24
    ports:
    - protocol: TCP
      port: 80
    - protocol: UDP
      port: 53
    - protocol: TCP
      port: 53

 

  2、对pod web1出口限制仅能访问web2的80和53 dns端口服务

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: my-network-policy
  namespace: web
spec:
  podSelector:
    matchLabels:
      run: web1
  policyTypes:
  - Egress
  egress:
  - to:
    - podSelector:
        matchLabels:
          run: we2
    ports:
    - protocol: TCP
      port: 80
    - protocol: TCP
      port: 53
    - protocol: UDP
      port: 53

 

  3、限制pod web只能访问标签为project=myproject的ns下的pod资源的80和53端口服务

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: my-network-policy
  namespace: web
spec:
  podSelector:
    matchLabels:
      run: web1
  policyTypes:
  - Egress
  egress:
  - to:
    - namespaceSelector:
        matchLabels:
          project: myproject
    ports:
    - protocol: TCP
      port: 80
    - protocol: TCP
      port: 53
    - protocol: UDP
      port: 53

 

默认策略

  允许所有入站流量

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-all-ingress
spec:
  podSelector: {}
  ingress:
  - {}
  policyTypes:
  - Ingress

 

 

  拒绝所有入站流量

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-ingress
spec:
  podSelector: {}
  policyTypes:
  - Ingress

 

 

拒绝所有出站流量

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-egress
spec:
  podSelector: {}
  policyTypes:
  - Egress

 

允许所有出站流量

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-all-egress
spec:
  podSelector: {}
  egress:
  - {}
  policyTypes:
  - Egress

 

  拒绝所有入站和出站流量

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-all
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  - Egress

 

标签:总结,run,NetworkPolicy,Kubernetes,web1,podSelector,pod,80
来源: https://www.cnblogs.com/punchlinux/p/16677939.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有