我在 aws 上有一个台风 kubernetes 集群,安装了 nginx 入口控制器。
如果我添加一个测试入口对象,它看起来像这样:
NAMESPACE NAME CLASS HOSTS ADDRESS PORTS AGE
default foo <none> * 10.0.8.180 80 143m
问题:我的入口控制器从哪里获取该地址(10.0.8.180)?
具有该地址的系统上没有(负载均衡器)服务。 (因为它是私有地址,external-dns 无法正常工作。)
为了回答你的第一个问题:
kubernetes 入口从哪里获取 IP 地址?
我们必须深入研究代码及其行为。
一切都从这里开始,带有
publish-service
标志:
publishSvc = flags.String("publish-service", "",
`Service fronting the Ingress controller
Takes the form "namespace/name". When used together with update-status, the
controller mirrors the address of this service's endpoints to the load-balancer
status of all Ingress objects it satisfies.`)
标志变量(publishSvc)稍后被分配给其他变量(PublishService):
PublishService: *publishSvc,
在代码的后面,您可以发现,如果设置了此标志,则此代码正在运行:
if s.PublishService != "" {
return statusAddressFromService(s.PublishService, s.Client)
}
statusAddressFromService
函数作为参数,采用publish-service
标志的值,并在kubernetes中查询具有该名称的服务,并返回相关服务的IP地址。
如果未设置此标志,它将向 k8s 查询运行 nginx ingress pod 的节点的 IP 地址。这就是您正在经历的行为,这让我认为您没有设置此标志。这也回答了你的第二个问题:
为什么它采用节点的地址而不是NLB?
同时,您可以在 k8s nginx 入口文档中找到所有类型平台的所有 yaml。
让我们看一下AWS ingress yaml。 请注意,此处
publish-service
的值称为 ingress-nginx/ingress-nginx-controller
(TLDR: 您所要做的就是创建一个 LoadBalancer 服务并将
publish-service
设置为 根据文档 IP地址由入口控制器分配。
链接:https://kubernetes.io/docs/concepts/services-networking/ingress/