如何让Namespace2中的Pod访问Namespace1内的Service?
跨Namespace访问Kubernetes服务的配置方案
问题场景
我们有两个Namespace:namespace1和namespace2。namespace1中暴露的服务列表如下:
[root@console ~]# oc get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE config-server ClusterIP 172.30.8.152 <none> 8888/TCP 3h eureka-server ClusterIP 172.30.120.74 <none> 8761/TCP 3h expedia-rapidapi-service ClusterIP 172.30.236.3 <none> 8233/TCP 3h travelcodes-service ClusterIP 172.30.14.36 <none> 8084/TCP 3h tti-service ClusterIP 172.30.46.212 <none> 8245/TCP 2h
任意Pod都能通过nslookup解析到travelcodes-service的集群IP:
/ $ nslookup travelcodes-service.contents.svc.cluster.local Name: travelcodes-service.contents.svc.cluster.local Address 1: 172.30.14.36 travelcodes-service.contents.svc.cluster.local
但仅namespace1内的Pod可通过curl访问该服务,namespace2的Pod执行以下命令时无法访问:
curl 172.30.14.36:8084/ping
解决步骤
1. 检查目标Namespace的网络策略
首先确认namespace1是否存在限制外部访问的NetworkPolicy,执行以下命令查看:
oc get networkpolicy -n namespace1
若存在拒绝非本Namespace流量的策略,需调整或新增允许namespace2访问的规则。
2. 创建允许跨Namespace访问的NetworkPolicy
在namespace1中创建以下NetworkPolicy,允许namespace2的Pod访问travelcodes-service的8084端口:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-namespace2-access-travelcodes namespace: namespace1 spec: podSelector: matchLabels: # 替换为travelcodes-service后端Pod的实际标签,可通过oc get pods -n namespace1 --show-labels查看 app: travelcodes-service policyTypes: - Ingress ingress: - from: - namespaceSelector: matchLabels: # 替换为namespace2的实际标签,可通过oc get namespace namespace2 --show-labels查看 kubernetes.io/metadata.name: namespace2 ports: - protocol: TCP port: 8084
执行命令应用该配置:
oc apply -f <上述yaml文件路径>
3. 验证访问
在namespace2的Pod中重新执行访问命令验证:
curl 172.30.14.36:8084/ping
或使用完整服务域名访问:
curl travelcodes-service.namespace1.svc.cluster.local:8084/ping
补充说明
- OpenShift默认启用严格的网络隔离,即使没有自定义NetworkPolicy,跨Namespace流量也可能被拒绝,因此必须显式配置允许规则。
- 确保
podSelector的标签与travelcodes-service后端Pod的标签完全匹配,否则策略不会生效。 - 若需允许所有Namespace访问,可将
namespaceSelector替换为{},但生产环境建议遵循最小权限原则,仅开放必要的Namespace访问。
内容的提问来源于stack exchange,提问作者Christopher Cheng
相关产品推荐
相关产品推荐

