我有两个命名空间:prod
和default
。
我想禁止访问这些命名空间中的资源(来自default
的资源无法访问来自prod
的资源,来自prod
的资源无法访问来自{ {1}})
但允许有机会访问这些资源以进行外部访问(进入)。
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
的 Pod可以访问给定名称空间内的其他Pod。
来自prod
的Pod无法访问default
内部的Pod。
当我尝试从浏览器访问该服务时,它被阻止。
当我尝试使用端口转发到prod
内部的服务时,一切正常。
答案 0 :(得分: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
-用于选择IN CURRENT名称空间中的Pod
namespaceSelector
-用于选择名称空间
namespaceSelector.podSelector
-用于在给定名称空间内选择容器
和我的问题:
ipBlock
-用于选择外部IP地址
它不适用于内部IP,因此对于我来说0.0.0.0/0
可以。
except
不会禁止内部流量。
答案 1 :(得分:0)
定义默认拒绝网络策略以拒绝所有入口类型流量。
部署另一个名为入口的命名空间
在入口名称空间中部署入口控制器
然后定义网络策略以允许从入口名称空间访问产品,以及另一个策略以允许从入口名称到默认访问。您应该可以通过入口控制器从外部访问prod和default