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

114 天前
 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 集群中的服务?公司里面一般是怎么做的呢, 新手不太明白

3591 次点击
所在节点    Kubernetes
38 条回复
lzh690554304
114 天前
ingress controller 是第一步
lzh690554304
114 天前
还有一种模式叫做 hostnetwork
THESDZ
114 天前
ingress controller caddy/traefik
wandehul
114 天前
企业服务还在乎 alb 那点钱 ? 流量费算是最便宜的部份了。 搞什么 nodeport ?人工运维的成本都要比 alb + 流量贵很多。
lingerr
114 天前
@lzh690554304 @THESDZ 感谢, 我去看看
lingerr
114 天前
@wandehul 企业服务肯定是不在乎的, 个人好像玩不起啊
mightybruce
114 天前
自己测试想怎么玩怎么玩,
我只说一下在正式环境中不使用 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
114 天前
ingress 是可以自建的,另外 ingress controller 也提供 NodePort 选项来访问。
sujin190
114 天前
看来你对 Ingress 有误解啊,Ingress Controller 调整配置绑定到 host network 就可以绑定到宿主机的 80 和 443 端口了啊,然后直接域名解析到部署 Ingress Controller 的那个节点就好了啊,否则 Ingress Controller 还是通过 nodeport 导出的,不能绑定到 80 和 443 端口,域名解析自然也还是需要输入端口
sujin190
114 天前
如果你有 lbs 的话,lbs 会绑定到 Ingress Controller 的 nodeport ,如果你没有 lbs ,那么简单点的做法就是调整 Ingress Controller pod 的网络配置使用 host 网络,让 Ingress Controller 的 80 和 443 端口直接绑定到宿主机的 80 和 443 端口,之后域名直接解析到宿主机 ip 就可以了
lingerr
114 天前
@mightybruce 我也发现了
wandehul
114 天前
个人玩,配通了 就 delete 了 , 十块钱就能让你拥有云运维经验。 不比你这 hostport 那 nginx 转发爽多了 。
lingerr
114 天前
@sujin190 Ingress 还可以这样的使用啊, 老哥说的很详细
JayZXu
114 天前
ingress 默认启动就是 80 和 443 ,接管了本地反代,后面的东西直接在 k8s 里面改配置就行了
sudosu
114 天前
rancher
Daath
114 天前
* 抛开外网怎么访问 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
114 天前
假设你的 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
114 天前
traefik 做代理,就是需要配置 hosts 文件
NevadaLi
114 天前
istio
smilingsun
113 天前
如果不使用云的负载均衡的话,也许可以参考这个使用 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