如何在Kubernetes中仅对外暴露单个REST API接口?
单容器多API的内外访问控制方案
针对你的需求,我们可以通过Kubernetes的Service和Ingress组合实现,分两种场景给你具体操作步骤:
场景1:健康检查API与其他API共用同一端口
如果所有API都跑在容器的同一个端口(比如8080),只是路径不同(比如健康检查是/healthz,其他是/api/*),可以这么做:
步骤1:创建ClusterIP Service供集群内部访问所有API
这个Service仅在集群内可见,内部Pod可以通过它访问所有API路径:
apiVersion: v1 kind: Service metadata: name: internal-api-svc spec: type: ClusterIP selector: app: your-app # 这里要和你的Pod标签一致 ports: - protocol: TCP port: 8080 targetPort: 8080 # 容器内的API端口
步骤2:创建Ingress对外暴露健康检查路径
通过Ingress只开放/healthz路径给外部,其他路径依然只能集群内部访问:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: health-check-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: /$1 # 如果你用Nginx Ingress控制器 spec: rules: - http: paths: - path: /healthz pathType: Exact backend: service: name: internal-api-svc port: number: 8080
注意:集群需要先部署好Ingress控制器(比如Nginx Ingress)才能生效。外部流量通过Ingress的域名或IP只能访问/healthz,其他路径会被拦截。
场景2:健康检查API使用独立端口
如果健康检查API单独用一个端口(比如8081),其他API用另一个端口(比如8080),操作更简单:
步骤1:创建ClusterIP Service暴露内部API端口
仅允许集群内部访问非健康检查的API:
apiVersion: v1 kind: Service metadata: name: internal-api-svc spec: type: ClusterIP selector: app: your-app ports: - protocol: TCP port: 8080 targetPort: 8080
步骤2:创建NodePort/LoadBalancer Service暴露健康检查端口
这个Service对外暴露健康检查API的端口:
apiVersion: v1 kind: Service metadata: name: external-health-svc spec: type: NodePort # 集群在云环境的话可以换成LoadBalancer selector: app: your-app ports: - protocol: TCP port: 8081 targetPort: 8081 nodePort: 30008 # 可选,自己指定端口,不填会自动分配
外部可以通过<节点IP>:30008(NodePort场景)或LoadBalancer分配的外部IP访问健康检查API,内部则通过internal-api-svc:8080访问其他API。
额外提示
- 确保Pod的
app标签和Service的selector完全匹配,否则Service找不到对应的Pod。 - 如果你用Ingress,记得给Ingress配置域名或绑定集群的外部IP,不然外部无法访问。
- 内部访问时,集群内的Pod可以直接用Service名称加端口访问(比如
internal-api-svc:8080),Kubernetes的DNS会自动解析。
内容的提问来源于stack exchange,提问作者Pratap
相关产品推荐
相关产品推荐

