You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kubernetes从docker-compose迁移后Pod服务外部无法访问问题求助

问题根因

你当前的核心问题是Service使用了默认的ClusterIP类型,ClusterIP仅支持集群内部网络访问,无法对外暴露端口,因此集群外部无法访问你的服务。
你之前访问6443端口得到403是正常现象:该端口是Kubernetes APIServer的管理端口,仅用于集群管控操作,需要身份认证,和你的业务服务无关,不能作为业务入口使用。

解决方案

你可以通过以下三种常用方案对外暴露服务,按复杂度从低到高排序:

方案1:修改Service为NodePort类型(推荐新手使用)

NodePort类型会在所有集群节点上开放一个固定端口(默认端口范围30000-32767),外部可以通过http://任意集群节点IP:NodePort访问服务。
修改你的api-service.yaml如下:

apiVersion: v1
kind: Service
metadata:
  annotations:
    kompose.cmd: /snap/kompose/19/kompose-linux-amd64 convert --volumes hostPath
    kompose.version: 1.21.0 (992df58d8)
  creationTimestamp: null
  labels:
    io.kompose.service: api
  name: api
spec:
  type: NodePort # 新增这一行指定Service类型
  ports:
  - name: "5001"
    port: 5001
    targetPort: 5001
    nodePort: 30001 # 可选,手动指定端口,不填则系统自动分配
  selector:
    io.kompose.service: api
status:
  loadBalancer: {}

修改后执行kubectl apply -f api-service.yaml生效,之后通过http://10.10.10.130:30001即可访问你的服务。

方案2:使用LoadBalancer类型

如果你的集群部署在云厂商环境,LoadBalancer类型会自动分配公网IP,外部可直接通过公网IP:5001访问。自建集群需要先部署MetalLB等负载均衡实现才能使用该类型。

方案3:使用Ingress

如果需要对外暴露多个服务、需要域名路由、HTTPS配置等能力,可部署Ingress Controller(如Nginx Ingress),再配置Ingress规则将域名路由到你的api服务。

额外注意事项

  • 不要随意配置hostNetwork: true,该配置会让Pod直接占用宿主机网络栈,容易出现端口冲突,仅在特殊场景下推荐使用
  • 配置完成后可执行kubectl describe svc api查看Endpoints字段,确认其值和你的Pod IP:5001一致,排除Service标签选择器不匹配的问题

内容的提问来源于stack exchange,提问作者Batchen Regev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 07:51:03