阻止命名空间之间的访问,但允许访问外部流量
Block access between namespaces but allow access for external traffic
我有两个命名空间: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
的 Pods 可以访问给定命名空间内的另一个 pods。
来自 default
的 Pods 无法访问 prod
中的 pods。
当我尝试从浏览器访问该服务时,它被阻止了。
当我尝试使用端口转发到 prod
内的服务时 - 一切正常。
定义默认拒绝网络策略以拒绝所有入口类型的流量。
部署另一个名为 ingress 的命名空间
在入口命名空间中部署入口控制器
然后定义网络策略以允许从 ingress 命名空间访问 prod,另一个允许从 ingres 访问 default。您应该能够通过入口控制器从外部访问产品和默认值
问题出在网络策略的一部分。
---
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
- 用于选择 pods IN CURRENT 命名空间
namespaceSelector
- 用于选择命名空间
namespaceSelector.podSelector
- 用于在给定命名空间
中选择 pods
我的问题:
ipBlock
- 用于选择外部 IP 地址
它不适用于内部 IP,所以在我的情况下 0.0.0.0/0
就可以了。
except
不会禁止内部流量。
我有两个命名空间: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
的 Pods 可以访问给定命名空间内的另一个 pods。
来自 default
的 Pods 无法访问 prod
中的 pods。
当我尝试从浏览器访问该服务时,它被阻止了。
当我尝试使用端口转发到 prod
内的服务时 - 一切正常。
定义默认拒绝网络策略以拒绝所有入口类型的流量。
部署另一个名为 ingress 的命名空间
在入口命名空间中部署入口控制器
然后定义网络策略以允许从 ingress 命名空间访问 prod,另一个允许从 ingres 访问 default。您应该能够通过入口控制器从外部访问产品和默认值
问题出在网络策略的一部分。
---
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
- 用于选择 pods IN CURRENT 命名空间
namespaceSelector
- 用于选择命名空间
namespaceSelector.podSelector
- 用于在给定命名空间
我的问题:
ipBlock
- 用于选择外部 IP 地址
它不适用于内部 IP,所以在我的情况下 0.0.0.0/0
就可以了。
except
不会禁止内部流量。