无公网IP的本地Kubernetes集群部署Knative Serving后无法访问服务求助
无公网IP的本地Kubernetes集群部署Knative Serving后无法访问服务求助
Hi Waqar,我看到你在无公网IP的本地K8s集群上部署Knative Serving后遇到了服务访问的问题,结合你的集群配置和操作步骤,我给你几个可行的解决思路:
先理清核心问题
你看到的服务URL http://fibonacci-single.knative-server-serverless.svc.cluster.local 是Knative生成的集群内部域名,这个域名只能在Kubernetes集群内部被解析和访问,所以直接从集群外(比如你的本地电脑)访问肯定会失败,接下来的方案都是围绕打通集群内外的访问路径来的。
方案1:集群内部直接验证服务可用性(最快方式)
如果只是想确认服务本身是否正常运行,最简单的方式是在集群内部的节点或者容器里访问:
- 在任意集群节点上执行:
curl http://fibonacci-single.knative-serverless.svc.cluster.local - 或者临时启动一个测试容器,进入后访问:
如果能正常返回结果,说明服务本身没问题,只是外部访问的路径没打通。kubectl run -it --rm --image=curlimages/curl curl-test -n knative-serverless # 进入容器后执行 curl http://fibonacci-single.knative-serverless.svc.cluster.local
方案2:用kubectl端口转发直接映射到本地
这是本地开发最常用的快捷方式,不需要额外配置:
- 先找到你之前创建的Knative私有ClusterIP服务:
你应该能看到类似kubectl get svc -n knative-serverlessfibonacci-single-private的服务,类型为ClusterIP。 - 执行端口转发命令,把集群内服务的80端口映射到本地的8080端口:
kubectl port-forward svc/fibonacci-single-private 8080:80 -n knative-serverless - 然后在你的本地电脑上访问
http://localhost:8080就能调用服务了。
方案3:配置本地Hosts+端口转发,用原域名访问
如果想保留服务的域名访问方式,可以这么做:
- 先获取私有服务的ClusterIP:
kubectl get svc fibonacci-single-private -n knative-serverless -o jsonpath='{.spec.clusterIP}' - 打开本地电脑的hosts文件(Windows路径:
C:\Windows\System32\drivers\etc\hosts;Mac/Linux路径:/etc/hosts),添加一条记录:
把192.168.x.x fibonacci-single.knative-serverless.svc.cluster.local192.168.x.x替换成你刚才获取到的ClusterIP。 - 同样执行端口转发命令:
kubectl port-forward svc/fibonacci-single-private 8080:80 -n knative-serverless - 现在你可以用
http://fibonacci-single.knative-serverless.svc.cluster.local:8080在本地访问服务了。
方案4:使用Knative Local Gateway(推荐长期本地开发场景)
Knative专门提供了Local Gateway组件,针对无公网IP的本地集群场景做了优化,步骤如下:
- 从Knative官方发布渠道获取对应v1.13版本的
serving-local-gateway.yaml配置文件,然后执行安装:kubectl apply -f serving-local-gateway.yaml - 配置Knative Serving启用Local Gateway:
kubectl patch configmap/config-network \ -n knative-serving \ --type merge \ -p '{"data":{"local-gateway":"knative-serving/local-gateway"}}' - 给你的Knative服务添加注解,指定使用Local Gateway:
kubectl patch kservice fibonacci-single -n knative-serverless \ --type merge \ -p '{"metadata":{"annotations":{"networking.knative.dev/local-gateway":"true"}}}' - 端口转发Local Gateway的服务:
kubectl port-forward svc/local-gateway 8080:80 -n knative-serving - 最后通过指定Host头在本地访问:
这种方式的好处是可以同时访问多个Knative服务,只需要修改Host头就行,不用每次都转发不同的服务。curl -H "Host: fibonacci-single.knative-serverless.svc.cluster.local" http://localhost:8080
备注:内容来源于stack exchange,提问作者Waqar Alamgir




