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 forwardkubectl 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的主要内容,如果未能解决你的问题,请参考以下文章

负载均衡应用场景

k8s 对外服务之ingress

LVS负载均衡介绍

如何为 Kubernetes 负载均衡器指定静态 IP 地址?

具有外部 IP 的 Google Container Engine,没有负载平衡器

如何拒绝对没有主机标头的 Google 外部 HTTPS 负载均衡器的请求?