自行搭建 k8s ,怎么通过域名访问服务

145 天前
 lingerr

问题描述

  1. 楼主最近在公网搭建了 Kubernetes (K8s) 集群,集群由三台具有公网 IP 的机器组成。目前使用 NodePort 方式访问服务,由于预算有限,没有使用公网负载均衡。
  2. 服务架构为前后端分离,前端通过 Nginx 启动,NodePort 端口为 30080 。访问方式为直接通过 IP:Port 进行访问。
  3. 现在是已有域名比如test.com解析到机器 A ,并在机器 A 上通过 80 端口反向代理到机器 A 、B 、C ,以实现通过域名访问服务。
  4. 有使用过 Ingress Controller, 但是还是使用的 nodeport 方式, 感觉多此一举

问题

请问是否有其他更好的方法来实现通过域名访问 K8s 集群中的服务?公司里面一般是怎么做的呢, 新手不太明白

3674 次点击
所在节点    Kubernetes
38 条回复
kennylam777
144 天前
@mightybruce 其實在正式的 LoadBalancer 上, 也是用 NodePort 的, 不然雲服務商的 LoadBalancer 如何連接到服務上? LoadBalancer 的實作會幫你把 NodePort 至雲上的對應都處理好, 可以看看 aws-load-balancer-controller 的實作。


只是在生產環境上, Node Group 的端口不能直接全開到公網。

@lingerr 自己玩的就直接用 HostPort 吧, 一般 ingress controller 都支持, 這樣最簡單了。
moonlight010
144 天前
使用 ingress controller 去访问 service,然后 service 去访问 pod ,这比较好吧
nodeport 是对 k8s 集群每个机器上指定特定的端口提供对外暴露,测试的时候使用
ingress 其实就是一个 nginx ,这个 ingress 比如使用的是 80 端口,然后可以配置二级域名解析到对应的 service ,比如 a.xx.com 解析到 tomcat 服务。b.xx.com 解析到 wordpress 服务,c.xx.com 解析到 springboot 服务等等,这样以来只暴露了 80 端口,而且这个端口是复用的,当然因为你是三台机器,可以配置 ingress nginx 是 nodeport 方式暴露 80 服务,然后可以使用 haproxy 配置一个配置云服务器 VIP(虚拟 ip),真正访问的域名,解析到这个 vip
liuhai233
144 天前
这个月刚把云 k8s 的服务迁移到自建 k3s 了,成本省了不少,可以参考我的迁移过程: https://dreamhunter2333.com/posts/k8s/install-k3s.html
ysicing
144 天前
可以看看我写的 k3s 集群私有负载均衡的另一种选择 Tailscale ,k8s 跑也是可以的
https://ysicing.me/k3s-tailscale-loadbalancer
caicaiwoshishui
144 天前
你还需要一个服务器,做 nginx 代理转发,
1. 你的域名代理到这个服务器,这个服务的 nginx 的 upstram 设置为你的 k8s 对外的 ingress ip ,可以多个 ip 。
2. 再通过 ingress 实现代理到具体 pod service
wuoty
144 天前
如果不使用负载均衡的情况下使用 Ingress ,那么可以用 MetalLB 的 Layer2 模式,把用户的所有 443 和 80 的流量集中到一个节点上,再通过这个节点转发到其他节点上

这个是 Nginx Ingress 提供的一种解决方案 https://kubernetes.github.io/ingress-nginx/deploy/baremetal/#a-pure-software-solution-metallb

lingerr
142 天前
@Daath 我也知道 ingress 是做路由控制的, 但是自己搭建当时只有 nodeport 可用才有疑问
lingerr
142 天前
@guoguobaba 明白了, 我就是想直接域名解析到服务, 不想再套一层 nodeport 的
lingerr
142 天前
@JayZXu
@wuoty
@caicaiwoshishui
@ysicing
@liuhai233 感谢各位的回复, 我看看
lingerr
142 天前
@kennylam777 你的看法和楼上 @lzh690554304 差不多, ingress 直接用 hostnetwork 就行了, 我了解一下
lingerr
142 天前
@moonlight010 好像 ingress nginx 的 nodeport 方式没办法暴露 80 服务吧
Daath
142 天前
@lingerr #27 因为你使用 svc 的配置文件写了 nodeport 类型,然后认为每个应用服务得用他们自己 svc 配置 nodeport 暴露出来,那么访问的流量就直接经过他们得 svc 得 nodeport 端口到达各自服务,不过域名这些得自己应用去维护,这是一种解决方式。不过想要方便是就是应用服务得 svc 是用 clusterip 类型,然后让 ingress-controller 来配置通过什么域名,什么路径匹配访问到应用服务得 svc 即可,这样就只需要暴露 ingress-controller 自己的 svc 的 nodeport 或者 lb 类型,通常就暴露 80 和 443 端口,这样就运行 k8s 集群的主机都会接受 80 和 443 端口的流量转到 ingress-controller 里面,这样你域名的配置,以及 tls 证书都是 ingress-controller 来接管
kennylam777
142 天前
@lingerr HostPort 跟 HostNetwork 是兩碼事

HostNetwork 會影響到 networking namespace, 比如說 HostNetwork 的 container 裡面 listen 0.0.0.0:80, 就是用 Host 的所有 IP listen 80, 因為 container 直接用 Host network(名字就說明了), 在 k8s 不定義甚麼也能曝露出去。

但 HostPort 的話, container 裡面仍然是一個帶 Pod IP 的獨立 network interface, HostPort 只是將指定 Pod 端口在 Host 曝露出去。
lingerr
141 天前
@kennylam777 感谢, 我去看看资料
lingerr
141 天前
@Daath 感谢, 我去看看资料
terencelau
131 天前
我用的是 [MetalLB]( https://metallb.universe.tf/) 和官方的 [ingress-nginx-controller]( https://kubernetes.github.io/ingress-nginx/) 在 metallb 里配置 External IP 以后(在这里应该是你的机器 A 的 IP ),启动 ingress-nginx 后会有一个 LoadBalancer 的 svc , 之后的所有 svc/ingress 可以就可以配 ClusterIP / 域名,controller 会解决其他问题

如果想要把三台机器的 IP 都用上,最粗暴的方法是部署三个 ingress-nginx ,metallb 里写三个 ExternalIP ,然后 DNS 指向三个 IP 即可。
naison
129 天前
直接使用 kubevpn ,在本地直接访问到集群内部的服务了,不需要这么复杂。https://github.com/kubenetworks/kubevpn
lingerr
127 天前
@terencelau
@naison 感谢, 我看看用法

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1060341

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX