1

我有两个命名空间:proddefault. 我想禁用对这些命名空间内资源的访问(来自defaultNS 的资源无法访问来自 的资源,来自的prod资源prod无法访问来自 的资源default)但允许有机会访问这些资源以获取外部流量(入口)。

# namespaces.yaml

---
kind: Namespace
apiVersion: v1
metadata:
  name: prod
  labels:
    tier: prod

---
kind: Namespace
apiVersion: v1
metadata:
  name: default
  labels:
    tier: infra
# network-policies.yaml

---
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: network
  namespace: prod
spec:
  podSelector: {}
  ingress:
    - from:
      - podSelector: {}
---
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: network
  namespace: default
spec:
  podSelector: {}
  ingress:
    - from:
      - namespaceSelector:
          matchLabels:
            tier: dev
      - namespaceSelector:
          matchLabels:
            tier: rc
# services.yaml

---
apiVersion: v1
kind: Service
metadata:
  name: {{ include "conference.appService" . }}
  labels:
    app: {{ include "conference.name" . }}
    release: {{ .Release.Name }}
spec:
  type: NodePort
  ports:
    - name: http
      port: 80
      targetPort: http
      protocol: TCP
  selector:
    app: {{ include "conference.name" . }}
    release: {{ .Release.Name }}
    role: app

来自prod的 Pod 可以访问给定命名空间内的其他 Pod。来自default的 Pod 无法访问内部的 pod prod

当我尝试从浏览器访问该服务时,它被阻止了。当我尝试使用端口转发到内部服务时prod- 一切正常。

4

2 回答 2

1

问题出在网络策略的一部分。

---
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: network
  namespace: default
spec:
  podSelector: {}
  ingress:
    - from:
      - ipBlock:
          cidr: 0.0.0.0/0
      - podSelector: {}
      - namespaceSelector:
          matchLabels:
            tier: dev
      - namespaceSelector:
          matchLabels:
            tier: rc
  egress:
    - {}

这个选择器的主要思想是: podSelector- 用于选择 CURRENT 命名空间中的 pod namespaceSelector- 用于选择命名空间 namespaceSelector.podSelector- 用于选择给定命名空间内的 pod

我的问题:

ipBlock- 用于选择外部 IP 地址

它不适用于内部 IP,所以在我的情况下0.0.0.0/0可以。 except不会禁止内部流量。

于 2019-05-13T20:45:43.063 回答
0

定义默认拒绝网络策略以拒绝所有入口类型的流量。

部署另一个名为 ingress 的命名空间

在入口命名空间中部署入口控制器

然后定义网络策略以允许从 ingress 命名空间访问 prod,并定义另一个网络策略以允许从 ingres 访问 default。您应该能够通过入口控制器从外部访问 prod 和 default

于 2019-05-13T18:24:05.510 回答