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

2024-07-26 15:42:43 +08:00
 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 集群中的服务?公司里面一般是怎么做的呢, 新手不太明白

4473 次点击
所在节点    Kubernetes
38 条回复
lzh690554304
2024-07-26 15:57:46 +08:00
ingress controller 是第一步
lzh690554304
2024-07-26 15:58:59 +08:00
还有一种模式叫做 hostnetwork
THESDZ
2024-07-26 16:01:16 +08:00
ingress controller caddy/traefik
wandehul
2024-07-26 16:04:10 +08:00
企业服务还在乎 alb 那点钱 ? 流量费算是最便宜的部份了。 搞什么 nodeport ?人工运维的成本都要比 alb + 流量贵很多。
lingerr
2024-07-26 16:06:32 +08:00
@lzh690554304 @THESDZ 感谢, 我去看看
lingerr
2024-07-26 16:07:25 +08:00
@wandehul 企业服务肯定是不在乎的, 个人好像玩不起啊
mightybruce
2024-07-26 16:09:28 +08:00
自己测试想怎么玩怎么玩,
我只说一下在正式环境中不使用 nodeport,生产环境中是不许 NodePort ,NodePort 会在所有节点( VM )上打开一个特定的端口,并且发送到该端口的所有流量都将转发到该服务。

此方法有很多缺点:
每个端口只能提供一次服务
您只能使用端口 30000–32767
如果您的节点/ VM IP 地址更改,则需要处理

正常情况都是通过各种 ingress controller 比如 nginx ingress 来访问的
生产环境建议使用 Loadbalancer 和 Ingress ,四层( TCP/UDP )代理使用 Loadbalancer ,七层( HTTP/HTTPS )代理使用 Ingress 。
另外也不是直接访问 ip 和端口,而是通过 ingress 去访问 service(clusterIP), service 再访问 pod
mightybruce
2024-07-26 16:11:03 +08:00
ingress 是可以自建的,另外 ingress controller 也提供 NodePort 选项来访问。
sujin190
2024-07-26 16:11:20 +08:00
看来你对 Ingress 有误解啊,Ingress Controller 调整配置绑定到 host network 就可以绑定到宿主机的 80 和 443 端口了啊,然后直接域名解析到部署 Ingress Controller 的那个节点就好了啊,否则 Ingress Controller 还是通过 nodeport 导出的,不能绑定到 80 和 443 端口,域名解析自然也还是需要输入端口
sujin190
2024-07-26 16:14:37 +08:00
如果你有 lbs 的话,lbs 会绑定到 Ingress Controller 的 nodeport ,如果你没有 lbs ,那么简单点的做法就是调整 Ingress Controller pod 的网络配置使用 host 网络,让 Ingress Controller 的 80 和 443 端口直接绑定到宿主机的 80 和 443 端口,之后域名直接解析到宿主机 ip 就可以了
lingerr
2024-07-26 16:21:27 +08:00
@mightybruce 我也发现了
wandehul
2024-07-26 16:22:14 +08:00
个人玩,配通了 就 delete 了 , 十块钱就能让你拥有云运维经验。 不比你这 hostport 那 nginx 转发爽多了 。
lingerr
2024-07-26 16:22:45 +08:00
@sujin190 Ingress 还可以这样的使用啊, 老哥说的很详细
JayZXu
2024-07-26 16:30:45 +08:00
ingress 默认启动就是 80 和 443 ,接管了本地反代,后面的东西直接在 k8s 里面改配置就行了
sudosu
2024-07-26 16:51:35 +08:00
rancher
Daath
2024-07-26 18:04:57 +08:00
* 抛开外网怎么访问 k8s 里面的具体什么应用服务,在 k8s 的运行机制里面,pod 对外服务交由 svc 来暴露,所以在 pod 之间访问也一般都经过 svc
* 当你使用 ingress controller 这类资源时,它也首先是作为应用服务 pod ,譬如 nginx-ingress-controller ,然后接收 k8s 的 ingress 配置来让 controller 这个 pod 服务知道怎么访问别的 namespace 下的 svc ,至此,从 controller 的 pod 到其他应用 pod 的链路就通了
* 那么外网怎么访问服务,只需要考虑如何让外网访问到 ingress-controller ,那么是由 ingress-controller-svc 来描述,至于是采用 nodeport 或者 lb 类型,都是告知集群上节点机器宿主端口做映射到集群上 ingress-controller 的 svc 端口,从而实现外部访问
guoguobaba
2024-07-26 18:11:18 +08:00
假设你的 k8s 的 ip 是 ip1 ,你设置了一个 host1 对应到 ip1 ,无论是公共的 dns 解析还是你机器上的/etc/hosts 解析。
然后在 ingress 里绑定一个 host1 对应到相关 cluster ip 就可以了。
当然,你也可以开一个 node port 的 service ,然后用 host1:<node port>访问也可以。
ingress 里绑定证书,你就可以用 https 访问

如果你是多节点,也可以弄一个 SLB ,把 host1 绑定在 SLB 的 ip 上,这样 SLB 会自动负载均衡到所有 INGRESS 对应的 ip 上。
Cola98
2024-07-26 18:59:07 +08:00
traefik 做代理,就是需要配置 hosts 文件
swLoXtOtd89pGg8t
2024-07-26 19:29:28 +08:00
istio
smilingsun
2024-07-26 22:27:14 +08:00
如果不使用云的负载均衡的话,也许可以参考这个使用 haproxy ?
https://docs.k3s.io/datastore/cluster-loadbalancer

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

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

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

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

© 2021 V2EX