我有两个命名空间:prod
和default
。我想禁用对这些命名空间内资源的访问(来自default
的资源NS无法访问来自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无权访问prod
中的pod。
当我尝试从浏览器访问服务时,它被阻止了。当我尝试使用端口转发到prod
中的服务时-一切正常。
问题部分在于网络政策。
---
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
-用于选择podINCURRENT命名空间namespaceSelector
-用于选择命名空间namespaceSelector. podSelector
-用于选择给定命名空间内的pod
而我的问题:
ipBlock
-用于选择EXTERNALIP地址
它不适用于内部IP,所以在我的例子中,0.0.0.0/0
是可以的。除了
不会禁止内部流量。
定义默认拒绝网络策略以拒绝所有入口类型的流量。
部署另一个名为ingress的命名空间
在入口命名空间中部署入口控制器
然后定义网络策略以允许从ingress命名空间访问prod,并定义另一个策略以允许从ingres访问default。您应该能够通过入口控制器在外部访问prod和default