You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过外部IP访问Kubernetes中的Pod?

如何通过外部IP访问Kubernetes中的Pod?

看起来你已经把Django应用部署到Kubernetes,还创建了LoadBalancer类型的Service,但大概率是遇到访问不通的问题了吧?别着急,咱们一步步来排查和解决:

第一步:确认LoadBalancer Service的外部IP是否已分配

首先得看看你的Service有没有拿到可用的外部IP,在终端里运行这个命令:

kubectl get services django-service

看输出里的EXTERNAL-IP列:

  • 如果显示<pending>:说明你的集群不支持自动创建外部负载均衡(比如本地用Minikube、Docker Desktop,或者自建K8s集群没装MetalLB这类组件)。这种情况得先给集群配置LoadBalancer能力,比如Minikube可以用minikube tunnel命令来临时分配外部IP;自建集群的话可以安装MetalLB。
  • 如果显示了具体的IP地址:那咱们继续往下排查连通性问题。

第二步:测试连通性并排查常见问题

如果已经拿到了外部IP,先试着用浏览器或者curl访问 http://<你的外部IP>:8000,如果访问失败,按下面的步骤逐一排查:

  • 检查Pod是否正常运行
    先确认你的应用Pod是正常启动的:

    kubectl get pods
    

    要保证Pod的STATUSRunning,而且READY列是1/1(对应你Deployment里的单个容器)。如果Pod状态异常,先查看Pod日志找问题:

    kubectl logs <你的Pod名称>
    
  • 确认Django应用的监听配置
    很多时候访问不通是因为Django默认只监听127.0.0.1,容器外部根本访问不到。你可以进入Pod内部测试一下:

    kubectl exec -it <你的Pod名称> -- curl localhost:8000
    

    如果这个命令能返回Django的页面内容,那说明应用在容器内是正常的,但要检查你的启动命令是不是用了python manage.py runserver 0.0.0.0:8000(必须指定0.0.0.0才能让外部访问)。

  • 验证Service和Pod的标签匹配
    你的Service是通过标签来关联Pod的,得确认标签没写错。可以用这个命令查看Service的关联情况:

    kubectl describe service django-service
    

    看输出里的Endpoints字段,如果里面有Pod的IP地址,说明标签匹配成功;如果是空的,那大概率是Deployment里的Pod标签和Service的selector不一致,仔细检查拼写哦。

  • 检查防火墙/安全组规则
    如果是云厂商的K8s集群,要确保外部IP对应的安全组开放了8000端口,允许来自外部的TCP请求;本地集群的话,检查一下电脑的防火墙有没有拦截8000端口的流量。

第三步:本地集群的特殊处理

如果是用Minikube或者Docker Desktop这类本地集群,LoadBalancer Service的外部IP可能没办法直接访问,这时候可以用集群自带的命令来打开访问通道:
比如Minikube可以直接运行:

minikube service django-service

这个命令会自动帮你打开浏览器,直接访问到你的Django应用。

备注:内容来源于stack exchange,提问作者Moon

火山引擎 最新活动