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

lingerr · 2024-7-26 15:42:43 · 278 次点击
### 问题描述

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

### 问题

请问是否有其他更好的方法来实现通过域名访问 K8s 集群中的服务?公司里面一般是怎么做的呢, 新手不太明白
举报· 278 次点击
登录 注册 站外分享
20 条回复  
naison 小成 2024-8-10 22:42:09
直接使用 kubevpn ,在本地直接访问到集群内部的服务了,不需要这么复杂。https://github.com/kubenetworks/kubevpn
terencelau 小成 2024-8-9 19:49:25
我用的是 [MetalLB]( https://metallb.uniferse.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 即可。
wuoty 初学 2024-7-27 10:32:50
如果不使用负载均衡的情况下使用 Ingress ,那么可以用 MetalLB 的 Layer2 模式,把用户的所有 443 和 80 的流量集中到一个节点上,再通过这个节点转发到其他节点上

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

https://i.imgur.com/DrPv5vR.png
caicaiwoshishui 小成 2024-7-27 10:05:58
你还需要一个服务器,做 nginx 代理转发,
1. 你的域名代理到这个服务器,这个服务的 nginx 的 upstram 设置为你的 k8s 对外的 ingress ip ,可以多个 ip 。
2. 再通过 ingress 实现代理到具体 pod service
ysicing 小成 2024-7-27 06:18:24
可以看看我写的 k3s 集群私有负载均衡的另一种选择 Tailscale ,k8s 跑也是可以的
https://ysicing.me/k3s-tailscale-loadbalancer
liuhai233 小成 2024-7-27 03:15:13
这个月刚把云  k8s 的服务迁移到自建 k3s 了,成本省了不少,可以参考我的迁移过程: https://dreamhunter2333.com/posts/k8s/install-k3s.html
moonlight010 小成 2024-7-26 23:55:24
使用 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
kennylam777 小成 2024-7-26 23:36:23
@mightybruce 其實在正式的 LoadBalancer 上, 也是用 NodePort 的, 不然雲服務商的 LoadBalancer 如何連接到服務上?  LoadBalancer 的實作會幫你把 NodePort 至雲上的對應都處理好, 可以看看 aws-load-balancer-controller 的實作。


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

@lingerr 自己玩的就直接用 HostPort 吧, 一般 ingress controller 都支持, 這樣最簡單了。
smilingsun 小成 2024-7-26 22:27:14
如果不使用云的负载均衡的话,也许可以参考这个使用 haproxy ?
https://docs.k3s.io/datastore/cluster-loadbalancer
NevadaLi 初学 2024-7-26 19:29:28
istio
12下一页
返回顶部