OpenShift 4 - 通过NetworkPolicy配置Pod访问策略(附视频)

76 篇文章 6 订阅
6 篇文章 0 订阅

OpenShift 4.x HOL教程汇总
说明:本文已经在OpenShift 4.14环境中验证

NetworkPolicy简介

NetworkPolicy 是 Kubernetes 和 OpenShift 定义通过网络访问 Pod 的安全策略,利用它可以在不通的 Project 和 Pod 之间定义细粒度的应用访问策略。在 NetworkPolicy 中以白名单的方式定义了针对“XXX项目”的“XXXPod”可以让“XXX项目”的“XXXPod”通过“XXX端口”访问。在 NetworkPolicy 白名单以外的 Pod 之间的访问都是无法联通的。

应用环境和测试方法

部署测试应用

创建如下资源:

$ oc new-project project1
$ oc label namespace project1 name=project1
$ oc new-project project2
$ oc label namespace project2 name=project2
$ oc new-project project3
$ oc label namespace project3 name=project3
$ oc new-app -n project1 openshiftroadshow/parksmap --name=web-db
$ oc new-app -n project1 openshiftroadshow/parksmap --name=web
$ oc new-app -n project1 openshiftroadshow/parksmap --name=db
$ oc new-app -n project1 openshiftroadshow/parksmap --name=mail
$ oc new-app -n project1 openshiftroadshow/parksmap --name=foobar
$ oc new-app -n project1 openshiftroadshow/parksmap --name=foo
$ oc new-app -n project1 openshiftroadshow/parksmap --name=bar
$ oc new-app -n project1 openshiftroadshow/parksmap --name=api
$ oc new-app -n project1 openshiftroadshow/parksmap --name=monitoring
$ oc new-app -n project1 openshiftroadshow/parksmap --name=project1-app
$ oc new-app -n project2 openshiftroadshow/parksmap --name=project2-app
$ oc new-app -n project3 openshiftroadshow/parksmap --name=project3-app

测试验证

通过以下方法验证可从应用的Pod中访问到同一项目或不同项目的应用Service地址。以下是从project2的project2-app的Pod经过project1的project1-app的Service的CLUSTER-IP访问project1-app的Pod的说明。

$ APP_NAME=project1-app
$ CLUSTER_IP=$(oc get svc ${APP_NAME} -o jsonpath={.spec.clusterIP} -n project1)
$ POD_NAME=$(oc get pod -o custom-columns=project:metadata.name --no-headers -n project2)
$ oc exec ${POD_NAME} -n project2 -- curl -Is ${CLUSTER_IP}:8080
HTTP/1.1 200
Last-Modified: Mon, 01 Apr 2019 16:54:28 GMT
Accept-Ranges: bytes
Content-Type: text/html;charset=UTF-8
Content-Language: en-US
Content-Length: 13338
Date: Sat, 23 Apr 2022 16:13:57 GMT

NetworkPolicy策略

说明:以下 NetworkPolicy 策略提供了 OpenShift 控制台的配置截图或 editor.cilium.io 的配置截图。

拒绝所有Pod直接访问

在这里插入图片描述

  1. 创建NetworkPolicy策略实施于project1。注意:为了不相互影响,需要将其它策略删除。
$ cat << EOF | oc apply -f -
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: deny-all-ingress
  namespace: project1
spec:
  # 当前 namespace 中的所有 pod
  podSelector: {}
  # 因为没有定义 ingress,所以所有 ingress 都不被允许
  policyTypes:
    - Ingress
EOF

或按下图在 OpenShift 控制台上配置NetworkPolicy策略。
在这里插入图片描述

  1. 使用前面的 “测试验证”步骤确认已经无法从任何项目的Pod访问到project1-app1的Service了。

拒绝有 Pod 的 Egress 流量

  1. 创建NetworkPolicy策略,拒绝 project1 项目中所有Pod 的 Egress 流量。
$ cat << EOF | oc apply -f -
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-all-egress
  namespace: project1
spec:
  podSelector: {}
  policyTypes:
  - Egress
EOF

在这里插入图片描述

  1. 通过“测试验证”步骤确认无法从 project1 的任何 Pod 访问 www.baidu.com。

只允许来自相同项目的Pod访问

在这里插入图片描述

  1. 创建 NetworkPolicy 策略实施于project1。注意:为了不相互影响,需要将其它策略删除。
$ cat << EOF | oc apply -f -
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: allow-same-namespace
  namespace: project1
spec:
  # 当前 namespace 中的所有 pod
  podSelector: {}
  # 可以接收来自当前 namespace 中所有 pod 的 ingress 访问
  ingress:
    - from:
        - podSelector: {}
  policyTypes:
    - Ingress
EOF

在这里插入图片描述

  1. 通过“测试验证”步骤确认只能从project1的Pod访问project1-app的Service了。

只允许来自同一项目的指定Pod访问

在这里插入图片描述

  1. 创建NetworkPolicy策略实施于project1。注意:为了不相互影响,需要将其它策略删除。
$ cat << EOF | oc apply -f -
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: allow-mail-access-db
  namespace: project1
spec:
  # 当前 namespace 中有 app=db 标签的 pod
  podSelector:
    matchLabels:
      app: db
  # 可以接收来自当前 namespace 中有 app=mai 标签的 pod 的 ingress 访问
  ingress:
    - from:
        - podSelector:
            matchLabels:
              app: mail
  policyTypes:
    - Ingress
EOF

在这里插入图片描述
在这里插入图片描述

  1. 通过“测试验证”步骤确认只能从mail访问db的Service了。

允许从所有项目访问

在这里插入图片描述

  1. 创建NetworkPolicy策略实施于project1。注意:为了不相互影响,需要将其它策略删除。
$ cat << EOF | oc apply -f -
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-from-all-namespace
  namespace: project1
spec:
  # 当前 namespace 中有 app=web-db 标签的 pod
  podSelector:
    matchLabels:
      app: web-db
  # 可以接收来自所有 namespace 的 pod 的 ingress 访问
  ingress:
    - from:
        - namespaceSelector: {}
  policyTypes:
    - Ingress
EOF

在这里插入图片描述
在这里插入图片描述

  1. 通过“测试验证”步骤确认只能从其它项目的Pod访问web-db的Service了。

只允许从指定的项目访问

在这里插入图片描述

  1. 创建NetworkPolicy策略实施于project1。注意:为了不相互影响,需要将其它策略删除。
$ cat << EOF | oc apply -f -
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-from-project2
  namespace: project1
spec:
  # 当前 namespace 中有 app=web 标签的 pod
  podSelector:
    matchLabels:
      app: web
  # 可以接收来自标签中有 name=project2 的 namespace 里包含的 pod 的 ingress 访问
  ingress:
    - from:
        - namespaceSelector:
            matchLabels:
              name: project2
  policyTypes:
    - Ingress
EOF

在这里插入图片描述
在这里插入图片描述

  1. 通过“测试验证”步骤确认只能从project2项目的Pod访问project1项目web的Service了。

只允许从指定项目的指定Pod访问

  1. 创建NetworkPolicy策略实施于project1。注意:为了不相互影响,需要将其它策略删除。
$ cat << EOF | oc apply -f -
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-from-project2-mail
  namespace: project1
spec:
  # 当前 namespace 中有 app=db 标签的 pod
  podSelector:
    matchLabels:
      app: db
  # 可以接收来自标签中有 name=project2 的 namespace 里包含 app=mail 标签的 pod 的 ingress 访问
  ingress:
    - from:
        - namespaceSelector:
            matchLabels:
              name: project2
          podSelector:
            matchLabels:
              app: mail
  policyTypes:
    - Ingress
EOF

在这里插入图片描述
在这里插入图片描述

  1. 通过“测试验证”步骤确认只能从project2项目中mail的Pod访问project1项目web的Service了。

注意:以上代码的namespaceSelector和podSelector是“并且”的关系。而以下代码namespaceSelector和podSelecto是“或者”的关系。

spec:
  # 当前 namespace 中有 app=db 标签的 pod
  podSelector:
    matchLabels:
      app: db
  # 可以接收来自标签中有 name=project2 的 namespace 中所有 pod 的 ingress 访问,或当前 namespace 中有 app=mail 标签的 pod 的 ingress 访问
  ingress:
    - from:
        - namespaceSelector:
            matchLabels:
              name: project2
    - from:
        - podSelector:
            matchLabels:
              app: mail
  policyTypes:
    - Ingress

在这里插入图片描述
在这里插入图片描述

只允许从指定的端口访问

在这里插入图片描述

  1. 创建NetworkPolicy策略实施于project1。注意:为了不相互影响,需要将其它策略删除l。
$ cat << EOF | oc apply -f -
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-port
  namespace: project1
spec:
  # 当前 namespace 中有 app=api 标签的 pod
  podSelector:
    matchLabels:
      app: api
  # 可以从 80/443 端口接收来自当前 namespace 中有 app=monitoring 标签的 pod 的 ingress 访问
  ingress:
    - from:
        - podSelector:
            matchLabels:
              app: monitoring
      ports:
        - protocol: TCP
          port: 80
        - protocol: TCP
          port: 443
EOF

在这里插入图片描述

混合策略

如果一个Pod被不同的NetworkPolicy定义了访问策略,则这些访问策略的全集适用于这个Pod。

演示视频

视频

其它参考

  • https://kubernetes.io/docs/concepts/services-networking/network-policies/
  • https://blog.openshift.com/whats-new-in-openshift-3-5-network-policy-tech-preview/
  • https://editor.cilium.io/
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值