k3d 负载均衡器类型的服务没有外部 IP
Posted
技术标签:
【中文标题】k3d 负载均衡器类型的服务没有外部 IP【英文标题】:k3d no external ip for a service of load balanacer type 【发布时间】:2020-10-18 19:42:13 【问题描述】:我正在将 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
:
【问题讨论】:
【参考方案1】:LoadBalancer
类型的服务只有在您使用 AWS EKS、Azure AKS、Google GCP 等云提供商提供的托管 kubernetes 服务时才会获得外部 IP。k3d 等工具用于本地开发,并且如果您创建 @ 987654323@ 类型的服务外部 ip 将被挂起。另一种方法是使用 NodePort 类型的 service 或 ingress 。这是doc。
您也可以使用kubectl port forward
或kubectl proxy
访问pod。
【讨论】:
【参考方案2】:您需要cloud controller manager 作为服务控制器来执行此操作。就本地而言,您的最佳选择可能是MetalLB。
话虽如此,我不知道这将如何处理 K3d 中的底层 docker 网络。它在我要尝试的事情清单上。如果我觉得效果不错,我会回来更新这篇文章。
【讨论】:
【参考方案3】:我在关注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 的服务。
【讨论】:
嗨。感谢您的(迟到的)回答。你能添加你运行的k3d
-命令来创建集群吗?听起来你用它映射了这个服务的NodePort
。请参阅k3d.io/usage/guides/exposing_services/#2-via-nodeport 请在此处添加您链接的示例的必要部分。作为答案应该是独立的。【参考方案4】:
我通过将清单从 LoadBalancer 类型更改为 Ingress 类型解决了这个问题。 K3d 似乎没有将外部 IP 正确地暴露给负载均衡器类型。
奇怪的是,我确实发现如果我部署得非常快,我就能让 LoadBalancer 类型工作。似乎必须在主节点启动之后,任何代理启动之前。
【讨论】:
以上是关于k3d 负载均衡器类型的服务没有外部 IP的主要内容,如果未能解决你的问题,请参考以下文章
如何为 Kubernetes 负载均衡器指定静态 IP 地址?