43、K8S-网络机制之网络策略、流量管控、NetworkPolicy、GlobalNetworkPolicy

发布时间 2023-04-04 12:44:31作者: 小粉优化大师

Kubernetes学习目录

1、基础知识

1.1、k8s策略

1.1.1、想象中的策略

到现在为止,我们之前操作过的k8s资源对象中,跟策略相关的无非就是
权限认证 - 权限认证主要是与用户登录和资源使用有关系
命名空间 - 命名空间可以将我们相关的资源进行隔离,但是我们可以通过 "命名空间.资源对象" 的方式来进行资源通信。
 
而实际上,k8s中对于资源控制的策略要远远的超出我们之前的理解。

1.1.2、k8s的资源策略体系

在k8s的从策略体系中,策略的内容非常庞大,不过我们可以根据自己的理解,抽取出来最主要的四个方面:
1、资源的使用限制 - limit range
2、资源的应用配额 - resource quota
3、资源的安全控制 - podsecritypolicy
4、资源的网络策略 - network policy,主要来管控资源的 通信流量的

1.1.3、转换规则策略不同

这里的策略也会被k8s集群中的控制器转换成内核的iptables的规则,只不过与service转换的规则不同。
service会被转换成iptables的net 或 mangle 表的规则
资源策略中的规则会被转换成 iptables的filter表上的规则

1.1.4、网络策略

为了使用Network Policy,Kubernetes引入了一个新的资源对象Network Policy,供用户设置
Pod间网络访问的策略。但仅定义一个网络策略是无法完成实际的网络隔离的,还需要一个策略控制器
(Policy Controller)进行策略的实现。
 网络策略功能由网络插件实现,支持网络策略的插件有 Calico、Canal、kube-router等,在k8s环
境中,专门基于这些策略管理软件的操作对象叫策略控制器,最常见的是networkpolicies。
 策略控制器用于监控指定区域创建对象(pod)时所生成的新API端点,并按需为其附加网络策略。
 对于Pod对象来说,网络流量分为 流入(Ingress)和流出(Egress)两个方向,每个方向包含允许和禁
止两种控制策略,默认情况下,所有的策略都是允许的,应用策略后,所有未经明确允许的流量都将拒绝。

1.1.5、网络策略图

相关术语:
Pod组,NetworkPolicy通过Pod选择器选定的一组Pod
Egress,出站流量,由流量的目标网络端口 to 和端口 ports 定义
Ingress,入站流量,由流量发出的源站点 from 和流量的目标端口定义
Selector: 选择pod对象的一种机制:

基于命名空间选择pod、基于网段来选择pod、基于pod标签来选择pod

1.2、配置解析

1.2.1、实践细节

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

 

1.2.2、策略图

1.2.3、资源对象属性解析

apiVersion: networking.k8s.io/v1    # 资源隶属的API群组及版本号
kind: NetworkPolicy                 # 资源类型的名称,名称空间级别的资源;
metadata:                           # 资源元数据
  name <string>                     # 资源名称标识
  namespace <string>                # NetworkPolicy是名称空间级别的资源
spec:                               # 期望的状态
  podSelector <Object>              # 当前规则生效的一组目标Pod对象,必选字段;空值表示当前名称空间中的所有Pod资源
  policyTypes <[]string>            # Ingress表示生效ingress字段;Egress表示生效egress字段,同时提供表示二者均有效
  ingress <[]Object>                # 入站流量源端点对象列表,白名单,空值表示“所有”
  - from <[]Object>                 # 具体的端点对象列表,空值表示所有合法端点
  - ipBlock <Object>                # IP地址块范围内的端点,不能与另外两个字段同时使用
  - namespaceSelector <Object>      # 匹配的名称空间内的端点
    podSelector <Object>            # 由Pod标签选择器匹配到的端点,空值表示<none>
  ports <[]Object>                  # 具体的端口对象列表,空值表示所有合法端口
  egress <[]Object>                 # 出站流量目标端点对象列表,白名单,空值表示“所有”
  - to <[]Object>                   # 具体的端点对象列表,空值表示所有合法端点,格式同
ingres.from;
  ports <[]Object>                  # 具体的端口对象列表,空值表示所有合法端口

注意:
    入栈和出栈哪个策略生效,由 policyTypes 来决定。
    如果仅配置了podSelector,表明,当前限制仅限于当前的命名空间

2、创建NetworkPolicy-实践

2.1、创建网络策略

2.1.1、定义资源配置清单

kubectl apply -f - <<'EOF'
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: 10.244.0.0/16
        except:
        - 10.244.1.0/24
    - namespaceSelector:
        matchLabels:
          project: develop
    - podSelector:
        matchLabels:
          arch: frontend
    ports:
    - protocol: TCP
      port: 6379
  egress:
  - to:
    - ipBlock:
        cidr: 10.244.0.0/24
    ports:
    - protocol: TCP
      port: 3306
EOF

2.1.2、查询网络策略控制器

master1 ~]# kubectl get networkpolicies
NAME                  POD-SELECTOR   AGE
test-network-policy   role=db        15s

2.2、创建deployment控制器

2.2.1、定义资源配置清单

kubectl apply -f - <<EOF
apiVersion: v1
kind: Namespace
metadata:
  name: develop
  labels:
    kubernetes.io/metadata.name: develop
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: pod-deployment
  name: pod-deployment
  namespace: develop
spec:
  replicas: 3
  selector:
    matchLabels:
      app: pod-deployment
  template:
    metadata:
      labels:
        app: pod-deployment
    spec:
      containers:
      - image: 192.168.10.33:80/k8s/pod_test:v0.1
        name: pod-test
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: pod-deployment
  name: pod-deployment
  namespace: develop
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: pod-deployment
  type: ClusterIP
EOF

2.2.2、查询是否创建成功

master1 ~]# kubectl -n develop get pod -o wide
NAME                              READY   STATUS    RESTARTS   AGE   IP            NODE    NOMINATED NODE   READINESS GATES
pod-deployment-59c85b5d69-fmxfd   1/1     Running   0          12m   10.244.3.9    node1   <none>           <none>
pod-deployment-59c85b5d69-qr26z   1/1     Running   0          12m   10.244.3.10   node1   <none>           <none>
pod-deployment-59c85b5d69-zgbf4   1/1     Running   0          12m   10.244.4.7    node2   <none>           <none>

master1 ~]# kubectl -n develop get deployments.apps 
NAME             READY   UP-TO-DATE   AVAILABLE   AGE
pod-deployment   3/3     3            3           12m

master1 ~]# kubectl -n develop get service
NAME             TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
pod-deployment   ClusterIP   10.111.188.179   <none>        80/TCP    12m

2.3、访问 SVC IP地址 测试是否正常

master1 ~]# curl 10.111.188.179 
kubernetes pod-test v0.1!! ClientIP: 192.168.10.26, ServerName: pod-deployment-59c85b5d69-qr26z, ServerIP: 10.244.3.10!

master1 ~]# curl 10.111.188.179 
kubernetes pod-test v0.1!! ClientIP: 192.168.10.26, ServerName: pod-deployment-59c85b5d69-fmxfd, ServerIP: 10.244.3.9!

master1 ~]# curl 10.111.188.179 
kubernetes pod-test v0.1!! ClientIP: 192.168.10.26, ServerName: pod-deployment-59c85b5d69-qr26z, ServerIP: 10.244.3.10!

master1 ~]# curl 10.111.188.179 
kubernetes pod-test v0.1!! ClientIP: 192.168.10.26, ServerName: pod-deployment-59c85b5d69-zgbf4, ServerIP: 10.244.4.7!

3、流量管控

3.1、流量管控策略-设置默认拒绝所有pod

3.1.1、定义资源配置清单

kubectl apply -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-all-ingress
  namespace: develop
spec:
  podSelector: {}
  policyTypes: ["Ingress", "Egress"]
EOF

配置解析:
这里面的 podSelector 值为空,表示当前命名空间中所有的pod
policyType中指明了 Ingress 和 Egress。但是没有定义任何ingress字段,表示不允许所有pod有流量通过

3.1.2、查看创建的资源

master1 ~]# kubectl get networkpolicies -n develop 
NAME               POD-SELECTOR   AGE
deny-all-ingress   <none>         22s

3.1.3、访问所有的pod和svc IP地址,访问不了

master1 ~]# kubectl get pods -n develop  -o wide
NAME                              READY   STATUS    RESTARTS   AGE   IP            NODE    NOMINATED NODE   READINESS GATES
pod-deployment-59c85b5d69-fmxfd   1/1     Running   0          20m   10.244.3.9    node1   <none>           <none>
pod-deployment-59c85b5d69-qr26z   1/1     Running   0          20m   10.244.3.10   node1   <none>           <none>
pod-deployment-59c85b5d69-zgbf4   1/1     Running   0          20m   10.244.4.7    node2   <none>           <none>

[root@master1 ~]# kubectl get svc -n develop 
NAME             TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
pod-deployment   ClusterIP   10.111.188.179   <none>        80/TCP    23m

# 访问SVC IP地址,都是访问不了
[root@master1 ~]# curl --connect-timeout 2 10.111.188.179
curl: (28) Connection timed out after 2001 milliseconds

# 访问POD IP地址,都是访问不了
master1 ~]# curl --connect-timeout 2 10.244.3.9
curl: (28) Connection timed out after 2001 milliseconds

master1 ~]# curl --connect-timeout 2 10.244.3.10
curl: (28) Connection timed out after 2002 milliseconds

master1 ~]# curl --connect-timeout 2 10.244.4.7
curl: (28) Connection timed out after 2001 milliseconds

3.1.4、删除创建的networkpolicies 

# 删除掉,继续下一个示例
kubectl -n develop delete networkpolicies deny-all-ingress

3.1.5、总结

所有pod都不能相互访问

3.2、流量管控策略-设置默认允许所有pod

3.2.1、定义资源配置清单

kubectl apply -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-all-ingress
  namespace: develop
spec:
  podSelector: {}
  policyTypes: ["Ingress", "Egress"]
  egress:
  - {}
  ingress:
  - {}
EOF

配置解析:
在下面分别指定了egress和ingress,虽然没有配置,表示所有的pod都不采用默认拒绝策略 -- 全部接收请求

3.2.2、查看创建的资源

master1 ~]# kubectl -n develop get networkpolicies
NAME                POD-SELECTOR   AGE
allow-all-ingress   <none>         9m19s

3.2.3、访问所有的pod和svc IP地址,可以访问了

master1 ~]# kubectl -n develop get pod -o wide
NAME                              READY   STATUS    RESTARTS   AGE   IP            NODE    NOMINATED NODE   READINESS GATES
pod-deployment-59c85b5d69-fmxfd   1/1     Running   0          31m   10.244.3.9    node1   <none>           <none>
pod-deployment-59c85b5d69-qr26z   1/1     Running   0          31m   10.244.3.10   node1   <none>           <none>
pod-deployment-59c85b5d69-zgbf4   1/1     Running   0          31m   10.244.4.7    node2   <none>           <none>

master1 ~]# kubectl -n develop get svc
NAME             TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
pod-deployment   ClusterIP   10.111.188.179   <none>        80/TCP    31m

master1 ~]# curl 10.111.188.179
kubernetes pod-test v0.1!! ClientIP: 192.168.10.26, ServerName: pod-deployment-59c85b5d69-zgbf4, ServerIP: 10.244.4.7!

aster1 ~]# curl 10.244.3.9
kubernetes pod-test v0.1!! ClientIP: 192.168.10.26, ServerName: pod-deployment-59c85b5d69-fmxfd, ServerIP: 10.244.3.9!

master1 ~]# curl 10.244.3.10
kubernetes pod-test v0.1!! ClientIP: 192.168.10.26, ServerName: pod-deployment-59c85b5d69-qr26z, ServerIP: 10.244.3.10!

master1 ~]# curl 10.244.4.7
kubernetes pod-test v0.1!! ClientIP: 192.168.10.26, ServerName: pod-deployment-59c85b5d69-zgbf4, ServerIP: 10.244.4.7!

3.2.4、删除创建的networkpolicies 

# 删除掉,继续下一个示例
kubectl -n develop delete networkpolicies allow-all-ingress

3.2.5、总结

所有的pod都可以相互访问

3.3、流量管控策略-设置只允许当前命名空间所有流量允许访问

3.3.1、定义资源配置清单

kubectl apply -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-all-ingress
  namespace: develop
spec:
  podSelector: {}
  policyTypes: ["Ingress", "Egress"]
  egress:
  - to:
    - podSelector: {}
  ingress:
  - from:
    - podSelector: {}
EOF

配置解析:
虽然设置了egress和ingress属性,但是下面的podSelector没有选择节点,表示只有当前命名空间所有节点不受限制

3.3.2、查看创建的资源

master1 ~]# kubectl -n develop get networkpolicies
NAME                POD-SELECTOR   AGE
allow-all-ingress   <none>         13m
deny-all-ingress    <none>         22m

3.3.3、进入kube-system命令空间POD,访问不了svc ip

master2 ~]# kubectl get svc -n develop
NAME             TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
pod-deployment   ClusterIP   10.111.188.179   <none>        80/TCP    48m

master1 ~]# kubectl get pods -o wide -n develop 
NAME                              READY   STATUS    RESTARTS   AGE   IP            NODE    NOMINATED NODE   READINESS GATES
pod-deployment-59c85b5d69-fmxfd   1/1     Running   0          59m   10.244.3.9    node1   <none>           <none>
pod-deployment-59c85b5d69-qr26z   1/1     Running   0          59m   10.244.3.10   node1   <none>           <none>
pod-deployment-59c85b5d69-zgbf4   1/1     Running   0          59m   10.244.4.7    node2   <none>           <none>

# 命名空间:kube-system,svc访问不了
master1 ~]# kubectl run pod-test --image=192.168.10.33:80/k8s/my_nginx:v1 -n kube-system --rm -it --command -- /bin/bash
root@pod-test:/# curl --connect-timeout 2 10.111.188.179
curl: (28) Connection timed out after 2001 milliseconds

3.3.4、进入develop命令空间POD,可以访问svc ip

master2 ~]# kubectl get svc -n develop
NAME             TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
pod-deployment   ClusterIP   10.111.188.179   <none>        80/TCP    48m

master1 ~]# kubectl get pods -o wide -n develop 
NAME                              READY   STATUS    RESTARTS   AGE   IP            NODE    NOMINATED NODE   READINESS GATES
pod-deployment-59c85b5d69-fmxfd   1/1     Running   0          59m   10.244.3.9    node1   <none>           <none>
pod-deployment-59c85b5d69-qr26z   1/1     Running   0          59m   10.244.3.10   node1   <none>           <none>
pod-deployment-59c85b5d69-zgbf4   1/1     Running   0          59m   10.244.4.7    node2   <none>           <none>


# 命名空间:develop,svc是可以访问的
root@pod-test:/# curl --connect-timeout 2 10.111.188.179
kubernetes pod-test v0.1!! ClientIP: 10.244.4.17, ServerName: pod-deployment-59c85b5d69-qr26z, ServerIP: 10.244.3.10!

3.3.5、删除创建的networkpolicies 

# 删除掉,继续下一个示例
kubectl -n develop delete networkpolicies deny-all-ingress

3.3.6、总结

只有同名空间的资源可以正常访问,而跨ns的资源是无法被访问

3.4、流量管控策略-使用标签选择器限制访问

当前仅容器隧道网络模型的集群支持网络策略(NetworkPolicy)。

更多参考华为云文档:https://support.huaweicloud.com/usermanual-cce/cce_01_0059.html

3.4.1、定义资源配置清单

kubectl apply -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-all-ingress
  namespace: develop
spec:
  podSelector: {}
  policyTypes: ["Ingress", "Egress"]
  egress:
  - to:
    - podSelector: {}
  ingress:
  - from:
    - ipBlock:
        cidr: 10.244.0.0/16
        except:
        - 10.244.4.16/32
    - podSelector:
        matchLabels:
          run: pod-test1
    ports:
    - protocol: TCP
      port: 80
EOF

配置解析:
1、虽然设置了egress和ingress属性,但是spec.podSelector没有选择节点,表示只有当前命名空间所有节点不受限制,如果配置的话,就是限定哪些pod的入口。
2、通过标签选择可访问的入口“run: pod-test1”。

2.4.2、查询创建结果

master1 ~]# kubectl -n develop get networkpolicies
NAME               POD-SELECTOR   AGE
deny-all-ingress   <none>         37s

3.4.3、运行pod

kubectl run my-web-test --image=192.168.10.33:80/k8s/pod_test:v0.1 -n develop

master1 ~]# kubectl get pods -o wide
NAME       READY   STATUS    RESTARTS   AGE   IP            NODE    NOMINATED NODE   READINESS GATES
pod-test   1/1     Running   0          42s   10.244.4.43   node2   <none>           <none>

3.4.4、创建两个不同标签的pod

master1 ~]# kubectl run pod-test --image=192.168.10.33:80/k8s/my_nginx:v1 -n develop --rm -it --command -- /bin/bash
master1 ~]# kubectl run pod-test1 --image=192.168.10.33:80/k8s/my_nginx:v1 -n develop --rm -it --command -- /bin/bash

3.4.5、查询pod的创建结果

master3 ~]# kubectl get pod -n develop --show-labels
NAME                              READY   STATUS    RESTARTS   AGE    LABELS
pod-test                          1/1     Running   0          111s   run=pod-test
pod-test1                         1/1     Running   0          100s   run=pod-test1

3.4.6、在两个pod中分别访问svc ip

root@pod-test1 # curl 10.96.80.213
kubernetes pod-test v0.1!! ClientIP: 10.244.5.18, ServerName: pod-deployment76dd67889b-s4m69, ServerIP: 10.244.6.11!
root@pod-test1 # nslookup 10.96.80.213
;; connection timed out; no servers could be reached
root@pod-test # curl 10.96.80.213
curl: (28) Failed to connect to 10.96.80.213 port 80: Operation timed out
结果显示:
 在 pod-test 中无法执行 curl 10.96.80.213
 pod-test1 可以正常访问svc的ip地址,由于出栈的时候没有办法对dns域名进行解析,所以无法curl域名

3.4.7、修改资源配置清单-解决DNS无法解析的问题

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: egress-controller
  namespace: develop
spec:
  podSelector:
    matchLabels:
      run: pod-test1
  policyTypes: ["Egress"]
  egress:
  - to: 
    ports:
    - protocol: UDP
      port: 53
  - to:
    - podSelector:
        matchLabels:
          run: pod-test1
    ports:
    - protocol: TCP
      port: 80 

3.4.8、删除创建的networkpolicies 

# 删除掉,继续下一个示例
kubectl -n develop delete networkpolicies deny-all-ingress

3.5、流量管控策略-使用命名空间限制访问

3.5.1、需求

大量的规则,会导致我们无法正常工作,或者艰难工作。
 - 多个规则可能导致冲突、重复
 - 多个规则的先后执行顺序导致结果不一样
所以我们在定制规则的时候,最好放到一个配置文件中。或者所有的规则都是经过精心管理和模块化管理的时候。而名称空间的控制就属于一种模块化管理方式。

3.5.2、查看命名空间的标签

master1 ~]# kubectl get ns --show-labels
NAME              STATUS   AGE   LABELS
default           Active   23h   kubernetes.io/metadata.name=default
develop           Active   23m   kubernetes.io/metadata.name=develop
kube-node-lease   Active   23h   kubernetes.io/metadata.name=kube-node-lease
kube-public       Active   23h   kubernetes.io/metadata.name=kube-public
kube-system       Active   23h   kubernetes.io/metadata.name=kube-system

3.5.3、定义资源配置清单

kubectl apply -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: ingress-controller
  namespace: develop
spec:
  podSelector: {}
  policyTypes: ["Ingress"]
  ingress:
  - from:
    - namespaceSelector:
        matchExpressions:
        - key: kubernetes.io/metadata.name
          operator: In
          values: [develop, kube-system, logs]
  - from:
    - namespaceSelector:
        matchExpressions:
        - {key: kubernetes.io/metadata.name, operator: NotIn, values: ["default"]}
EOF

3.5.4、查看pod和svc ip地址

master1 ~]# kubectl get pod -o wide -n develop 
NAME                              READY   STATUS    RESTARTS   AGE   IP            NODE    NOMINATED NODE   READINESS GATES
pod-deployment-59c85b5d69-4jd2h   1/1     Running   0          28m   10.244.4.31   node2   <none>           <none>
pod-deployment-59c85b5d69-7fnhh   1/1     Running   0          28m   10.244.3.22   node1   <none>           <none>
pod-deployment-59c85b5d69-hj5nq   1/1     Running   0          28m   10.244.3.23   node1   <none>           <none>
pod-test                          1/1     Running   0          20m   10.244.3.24   node1   <none>           <none>

master1 ~]# kubectl get svc -o wide -n develop 
NAME             TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE   SELECTOR
pod-deployment   ClusterIP   10.98.89.69   <none>        80/TCP    28m   app=pod-deployment

3.5.5、使用default,测试访问不了

master1 ~]# kubectl run pod-test --image=192.168.10.33:80/k8s/my_nginx:v1 -n develop --rm -it --command -- /bin/bash
root@pod-test:/#  curl --connect-timeout 2 10.98.89.69
kubernetes pod-test v0.1!! ClientIP: 10.244.4.35, ServerName: pod-deployment-59c85b5d69-7fnhh, ServerIP: 10.244.3.22!

3.5.6、使用develop,测试可以访问

master1 ~]# kubectl run pod-test --image=192.168.10.33:80/k8s/my_nginx:v1 --rm -it --command -- /bin/bash
root@pod-test:/#  curl --connect-timeout 2 10.98.89.69
curl: (28) Connection timed out after 2001 milliseconds

3.5.7、删除创建的networkpolicies 

# 删除掉,继续下一个示例
kubectl -n develop delete networkpolicies ingress-controller

4、Calico之GlobalNetworkPolicy-实践

4.1、基础知识

4.1.1、问题

尽管k8s自己的NetworkPolicy功能上日渐丰富,但k8s自己的NetworkPolicy资源仍然具有相当的
局限性,例如它没有明确的拒绝规则、缺乏对选择器高级表达式的支持、不支持应用层规则,以及没有集群范围的网络策略等。
根据我们的实践可知,每个networkpolicy都是以当前命名空间为中心,进行的网络策略控制。如果命 名空间过多的话,会导致我们无法正常工作,或者艰难工作。 而这属于k8s网络管控的固有缺陷。

4.1.2、资源对象

我们安装完毕calico之后,会自动生成一些自定义的资源对象,这些资源对象包括NetworkPolicy和GlobalNetworkPolicy等. 

master1 ~]# kubectl api-resources  | grep -i globalnetworkpolicies
globalnetworkpolicies                          crd.projectcalico.org/v1               false        GlobalNetworkPolicy

4.1.3、GlobalNetworkPolicy与NetworkPolicy对比

其中的NetworkPolicy CRD比Kubernetes NetworkPolicy API提供了更大的功能集,包括支持拒绝规则、规则解析级别以及应用层规则等,但相关的规则需要由calicoctl创建。
以GlobalNetworkPolicy为例,它支持使用selector、serviceAccountSelector或namespaceSelector来选定网络策略的生效范围,默认为all(),即集群上的所有端点。
 
高级场景:
转发流量、防御DOS

资源                       解析
NetworkPolicy             简称 np ;是命名空间级别资源。规则应用于与标签选择器匹配的endpoint的集合
GlobalNetworkPolicy       简称 gnp / gnps 与 NetworkPolicy 功能一样,是整个集群级别的资源

4.2、根据命名空间限制网络

4.2.1、定义资源配置清单

# 限定命令空间标签为name=develop的网络策略,允许标签name=develop和name=kube-system访问
kubectl apply -f - <<EOF
apiVersion: crd.projectcalico.org/v1
kind: GlobalNetworkPolicy
metadata:
  name: namespaces-default
spec:
  order: 0.0
  namespaceSelector: name in {"develop"}
  types: ["Ingress", "Egress"]
  ingress:
  - action: Allow
    source:
      namespaceSelector: name in {"develop","kube-system"}
  egress:
  - action: Allow
EOF
重点解析:
namespaceSelector: name
in {"develop","kube-system"},此处的name表示命令空间的LABELS里面的name=develop所以,需要生效的话,需要给命令空间先打标签,否则会无效。

4.2.2、查询创建的结果

master1 ~]# kubectl get globalnetworkpolicies.crd.projectcalico.org  -A
NAME                 AGE
namespaces-default   4s

4.2.3、给命名空间kube-system、develpo打标签

kubectl label ns develop name=develop
kubectl label ns kube-system name=kube-system

master1 ~]# kubectl get ns -o wide --show-labels
NAME              STATUS   AGE   LABELS
default           Active   36h   kubernetes.io/metadata.name=default
develop           Active   12h   kubernetes.io/metadata.name=develop,name=develop
kube-node-lease   Active   36h   kubernetes.io/metadata.name=kube-node-lease
kube-public       Active   36h   kubernetes.io/metadata.name=kube-public
kube-system       Active   36h   kubernetes.io/metadata.name=kube-system,name=kube-system

# 删除标签的方法
kubectl label ns develop name-
kubectl label ns kube-system name-

4.2.4、运行pod

master1 ~]# kubectl run pod-test --image=192.168.10.33:80/k8s/pod_test:v0.1 -n develop
pod/pod-test created

master1 ~]# kubectl get pods
NAME       READY   STATUS    RESTARTS   AGE   IP            NODE    NOMINATED NODE   READINESS GATES
pod-test   1/1     Running   0          99s   10.244.4.37   node2   <none>           <none>

4.2.5、运行default命令空间测试-访问不了

master1 ~]# kubectl run nginx-test --image=192.168.10.33:80/k8s/my_nginx:v1 -n default --rm -it --command -- /bin/bash
root@nginx-test:/# curl --connect-timeout 2 10.244.3.43
curl: (28) Connection timed out after 2001 milliseconds

4.2.6、运行kube-system命令空间测试-可以访问

master1 ~]# kubectl run nginx-test --image=192.168.10.33:80/k8s/my_nginx:v1 -n kube-system --rm -it --command -- /bin/bash
root@nginx-test:/# curl --connect-timeout 2 10.244.3.43
kubernetes pod-test v0.1!! ClientIP: 10.244.4.75, ServerName: pod-test, ServerIP: 10.244.3.43!

4.2.7、运行develop命令空间测试-可以访问

master1 ~]# kubectl run nginx-test --image=192.168.10.33:80/k8s/my_nginx:v1 -n develop --rm -it --command -- /bin/bash
root@nginx-test:/# curl --connect-timeout 2 10.244.3.43
kubernetes pod-test v0.1!! ClientIP: 10.244.4.74, ServerName: pod-test, ServerIP: 10.244.3.43!