- 实现不同Namespace下微服务之间的安全通信:
- 创建NetworkPolicy资源:
- 首先确保目标Namespace中的Pod有合适的标签来标识。例如,假设在
namespace1
中有一个名为service1
的微服务,其Pod标签为app: service1
,在namespace2
中有一个名为service2
的微服务,其Pod标签为app: service2
。
- 在
namespace1
中创建一个NetworkPolicy
,允许来自namespace2
中service2
的访问。示例如下:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow - service2 - to - service1
namespace: namespace1
spec:
podSelector:
matchLabels:
app: service1
ingress:
- from:
- namespaceSelector:
matchLabels:
name: namespace2
podSelector:
matchLabels:
app: service2
ports:
- protocol: TCP
port: 80 # service1 监听的端口,根据实际情况调整
- 同理,在`namespace2`中也需要创建一个`NetworkPolicy`来允许`service1`对`service2`的反向访问(如果需要双向通信的话):
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow - service1 - to - service2
namespace: namespace2
spec:
podSelector:
matchLabels:
app: service2
ingress:
- from:
- namespaceSelector:
matchLabels:
name: namespace1
podSelector:
matchLabels:
app: service1
ports:
- protocol: TCP
port: 8080 # service2 监听的端口,根据实际情况调整
- 防止外部非授权访问:
- 默认拒绝所有外部访问:可以通过在每个Namespace中创建一个拒绝所有外部访问的
NetworkPolicy
。示例如下:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default - deny - external
namespace: namespace1 # 替换为实际Namespace名称
spec:
podSelector: {}
ingress: []
- 仅允许特定来源访问:如果有合法的外部来源(如特定的IP范围或其他可信Namespace),可以在上述默认拒绝策略之上,创建允许访问的
NetworkPolicy
。例如,允许来自特定IP范围192.168.1.0/24
的访问:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow - specific - ip - range
namespace: namespace1 # 替换为实际Namespace名称
spec:
podSelector:
matchLabels:
app: service1 # 替换为实际应用标签
ingress:
- from:
- ipBlock:
cidr: 192.168.1.0/24
ports:
- protocol: TCP
port: 80 # 替换为实际端口
- 如果涉及到集群外部的服务发现和访问,如使用Ingress:需要对Ingress资源进行严格配置,比如使用认证机制(如TLS、OAuth等),并且仅向可信的外部客户端暴露服务。同时,在Ingress的后端服务对应的Namespace中,结合
NetworkPolicy
限制仅允许Ingress Controller所在的Pod访问后端服务。例如:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow - ingress - to - service
namespace: namespace1 # 替换为实际Namespace名称
spec:
podSelector:
matchLabels:
app: service1 # 替换为实际应用标签
ingress:
- from:
- podSelector:
matchLabels:
app.kubernetes.io/name: nginx - ingress - controller # 假设Ingress Controller为Nginx,根据实际情况调整
ports:
- protocol: TCP
port: 80 # 替换为实际端口