新手,请教一个 k8s 的问题

2022-06-29 16:07:58 +08:00
 ydongd
中心服 A ,对外提供服务的 B 。B 需要将自己链接到 A ,同时需要对外提供服务。用户先到 A 去拿取 B 的地址在链接到 B 。

A 可以部署多个,A 服务功能是一样的,采用 deployment 部署。对外访问用 service ,用户访问任意一个都行。

B 也需要部署多个,虽然功能是一样,但是有服务的逻辑地址,又算是不同的服务。采用 statefulSet 部署,由 podID 来生成逻辑地址。

类似于官方的案列:部署多个 mysql 服务。但是教程只到了 k8s 集群内通过 ip 来区分并访问不同的 mysql 。对于外部的访问怎么区分访问呢?

问题:
service 的方式是将一批 pod 统一暴露出去了,不能做到定向访问。怎么将 statefulSet 部署的 pod 通过外部访问,且用户能选择访问那一个 pod ?
3158 次点击
所在节点    Kubernetes
22 条回复
prodan
2022-06-29 16:22:55 +08:00
service 本质上是一个负载均衡,据我所知是做不到指定用户访问指定的 pod ,你应该从你的程序设计上解决。
hwdef
2022-06-29 16:24:10 +08:00
headless service
offswitch
2022-06-29 16:25:18 +08:00
你需要试试 istio ,istio 可以实现你需要的需求。
ydongd
2022-06-29 16:58:00 +08:00
@hwdef headless service 好像也是集群内部访问的,集群外不能访问
Tinet
2022-06-29 17:14:45 +08:00
两个步骤:
1. 在集群外解析 headless service 域名地址
2. 将 clusterIP 与集群外网络打通
ydongd
2022-06-29 17:31:21 +08:00
@Tinet 能详细说说这两个步骤吗?
Tinet
2022-06-29 17:38:31 +08:00
@ydongd 域名解析不说了,网络打通给你个关键词 calico bgp
April5
2022-06-29 17:44:15 +08:00
前置一个网关,通过 zk 或 etcd 维护服务 B ,网关订阅服务 B 的地址信息,网关将指定消息代理到相应的 B
aragakiyuii
2022-06-29 18:08:06 +08:00
代理到 {podName}.{headlessServiceName}
buffzty
2022-06-29 19:35:57 +08:00
mysql-0.mysql.svc.cluster.local:3306
Jiki
2022-06-30 00:12:00 +08:00
最近也遇到这个问题,关注一下
ydongd
2022-06-30 09:02:47 +08:00
@aragakiyuii @buffzty 我用的 docker 自带的 k8s , 好像代理不了。之前用 minikube 普通的 service 都转发不出来。用的 mac 。 可能新手就需要踩这些坑吧
ydongd
2022-06-30 09:04:00 +08:00
@buffzty k8s 集群内部可以访问,外边不行
aragakiyuii
2022-06-30 10:08:08 +08:00
可以在集群里面部署一个 nginx ,配置好 TCP 转发规则,转发至 {podName}.{headlessServiceName},然后可以通过 hostPort 或者 nodePort 形式将 nginx 暴露到集群外部
qianhun
2022-06-30 11:13:53 +08:00
用 statefulset 模式,然后通过脚本获取主机名,并修改应用服务的端口,在通过 hostNetwork 映射到宿主机上
ydongd
2022-06-30 11:42:40 +08:00
@qianhun 不知到啥原因 这种方式也不行
apiVersion: v1
kind: Pod
metadata:
name: server-pod
spec:
hostNetwork: true
dnsPolicy: ClusterFirstWithHostNet
containers:
- name: server
image: yddeng/server:1.1
command: ["./server"]
args: ["server-0","127.0.0.1:9563"]
qianhun
2022-06-30 13:10:47 +08:00
用 statefulset 控制器,启动一个 initcontainer ,写一个 shell 脚本,判断主机名,如果是 server-0 ,port 为 9563 ,如果是 server-1 ,port 为 9564 ,然后把具体的执行命令输出到启动脚本里,给你的 server pod 执行,不要在 args 里面写参数,在 args 里写参数只能启动一个 pod
ydongd
2022-06-30 13:24:20 +08:00
@qianhun 我知道你这种方式,我这里只是做了一个测试,结果仍然是不能访问
qianhun
2022-06-30 14:22:38 +08:00
不能访问,有什么报错么
1.看看 pod 是否运行正常,日志有报错没有
2.到宿主机上看看端口启动了没
3.防火墙是否关闭
ydongd
2022-06-30 14:44:50 +08:00
@qianhun 248244142 我 QQ 。我想请教一下,这个上面回复太慢了

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

https://tanronggui.xyz/t/862953

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

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

© 2021 V2EX