k3d 没有用于负载均衡器类型服务的外部 ip

k3d no external ip for a service of load balanacer type

我正在将 hello-world docker 容器部署到 k3d - 集群。 为了获取外部 IP,部署了负载均衡器类型的服务。

之后我希望通过负载均衡器调用应用程序。但是我没有得到外网ip。

k3d create --name="mydemocluster" --workers="2" --publish="80:80"

export KUBECONFIG="$(k3d get-kubeconfig --name='mydemocluster')"

kubectl run kubia --image=hello-world --port=8080 --generator=run/v1
kubectl expose rc kubia --type=LoadBalancer --name kubia-http

export KUBECONFIG="$(k3d get-kubeconfig --name='mydemocluster')"

然后 kubectl get services

LoadBalancer 类型的服务只有在您使用由云提供商提供的托管 kubernetes 服务时才会获得外部 IP,例如 AWS EKS、Azure AKS、Google GCP etc.Tools 例如 k3d用于本地开发,如果您创建 LoadBalancer 类型的服务,外部 ip 将处于待定状态。替代方法是使用 NodePort 类型的服务或入口。这是关于这个的doc

您也可以使用 kubectl port forwardkubectl proxy 访问广告连播。

你需要 cloud controller manager to act as a service controller to do that. As far as on-prem goes, your best option is likely MetalLB.

话虽这么说,但我不知道 K3d 中的底层 docker 网络会有什么表现。它在我要尝试的事情清单上。如果我觉得效果不错,我会回来更新这个post。

我通过将我的清单从 LoadBalancer 类型更改为 Ingress 类型来解决这个问题。 K3d 似乎没有将外部 IP 正确地暴露给负载均衡器类型。

奇怪的是,我确实发现如果我部署得非常快,我就能让 LoadBalancer 类型工作。似乎必须在主节点启动之后和任何代理启动之前。

我关注了this example

使用 k3d 似乎工作正常:

(base) erik@buzzard:~/kubernetes/tutorial> 
kubectl  get services 
NAME                    TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
kubernetes              ClusterIP      10.43.0.1       <none>        443/TCP          3d6h
mongodb-service         ClusterIP      10.43.215.113   <none>        27017/TCP        27m
mongo-express-service   LoadBalancer   10.43.77.100    172.20.0.2    8081:30000/TCP   27m

据我了解,k3d 是 运行 k3s,例如,它比 minikube 更像是一个完整的 kubernetes 设置。我可以毫无问题地访问 http://172.20.0.2:8081 的服务。