首页 > 解决方案 > 阻止所有流量流向选定标签的网络策略

问题描述

在我们的集群中,我们在不同的节点池中运行两个版本的 API。现在我们每个版本的微服务流量从 pod1 > service1 > service2 > pod2 路由。我想使用网络策略来证明我们的 API 可以防止一个版本的 API 中的 Pod 与另一个版本通信。

下面是我为 1.1 版编写的网络策略示例。但是,这似乎阻碍了 1.1 节点池中的所有流量。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: networkpolicy-v1-1
  namespace: default
spec:
  podSelector:
    matchLabels:
      version: v1-1
  policyTypes:
    - Ingress
    - Egress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          version: v1-1
  egress: 
  - {} 

这是describe pod <podname>显示标签匹配的输出。

Name:         adduser-v1-1-696467d46-zkvq9
Namespace:    default
Labels:       app=adduser-v1-1
              pod-template-hash=696467d46
              version=v1-1

只是为了确认,我将以下语句添加到上面 pod 中运行的代码中。我能够在没有网络策略的情况下看到日志记录语句。当策略处于活动状态时,请求超时,并且找不到日志记录语句。

@api.route('/customer/add', methods=['POST'])
def create_customer():
    logger.info("inside create customer")

值得一提的是,我们的服务是:

apiVersion: v1
kind: Service
metadata:
  name: adduser-v1-1
spec:
  ports:
  - port: 80
    targetPort: 8081
    protocol: TCP
    name: http
  selector:
    app: adduser-v1-1
  type: LoadBalancer

编辑

澄清一下:在我上面的示例中, pod1 > service1 > service2 > pod2 所有 pod 和服务 1 和 2 都在同一个节点池中,并且 pod 1 和 2 都包含 label version=v1-1。例子:

我希望这些 pod 能够相互交谈:

吊舱1

Labels:       app=adduser-v1-1
              pod-template-hash=687b4f6b8d
              version=v1-1

豆荚2

Labels:       app=authuser-v1-1
              pod-template-hash=5449f9bd6d
              version=v1-1

虽然这些 pod 应该被网络策略阻止

吊舱1

Labels:       app=adduser-v1-1
              pod-template-hash=687b4f6b8d
              version=v1-1

吊舱 2

Labels:       app=authuser-v2-0
              pod-template-hash=bd87f9d55
              version=v2-0

标签: kubernetesgoogle-kubernetes-enginekubernetes-networkpolicy

解决方案


上述网络策略 networkpolicy-v1-1 将只允许从 pod1(版本:v1-1)到 pod1(版本:v1-1)的入口流量,它不会允许任何其他入口流量,但允许所有传出流量,这是故意的吗?如果要实施 pod1 > service1 > service2 > pod2,那么下面的网络策略会有所帮助。下面将确保 pod2 只会接收来自 POD1 的流量

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: networkpolicy-v2-2
  namespace: default
spec:
  podSelector:
    matchLabels:
      version: v2-2
  policyTypes:
    - Ingress
    - Egress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          version: v1-1
  egress: 
  - {} 

推荐阅读