作者zxvc (众生都是未来佛)
看板Linux
标题[问题] Kubernetes in Docker 存取服务
时间Mon Nov 1 17:28:44 2021
我最近在研究 VMWare Tanzu Community Edition,
在 Ubuntu 装好後发现它是基於 Kubernetes in Docker,
它会新增一个 docker bridge network - kind (如 subnet: 172.20.0.0/16),
且 host 有一个新的 brXYZ interface (IP: 172.20.0.1)。
我用 kubectl apply 启动 nginx,
再使用 kubectl expose --type NodePort --port 80 (部分指令)
新增1个 k8s service,假设 node port = 33333。
但我发现我无法在 host 使用
curl localhost:33333 或 curl public_ip:33333
存取该 service。
我只能透过 k8s control plane container (如 IP: 172.20.0.4) 存取:
curl 172.20.0.4:33333
也就是只能透过上述 brXYZ interface 存取 k8s service。
实际上我想做到的是外部使用者能透过 public IP + port 33333 存取 k8s service,
但查不到相关文件对 k8s in Docker 的标准作法。
我有看过使用 iptables 的解法,但觉得这种作法只适用 Linux host,
不适用 macOS host。所以想请问有没有更通用的作法?
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 61.222.119.157 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Linux/M.1635758926.A.882.html
1F:推 roccqqck: 试试k3s或rke2 + rancher 11/01 18:13
2F:推 Adama: ubuntu要不要试lxd? 11/01 22:31
4F:→ Adama: 但这文件是lxd v2的,现在已经进展到v4了 11/01 22:32
5F:→ Adama: 1xd可以用proxy来转发埠通讯 4.18也有network forwards可用 11/01 22:34
目前试出一招使用 docker run socat 作 TCP forwarding:
https://stackoverflow.com/a/42071577/631869
参考指令:
docker run --network kind --rm -p 8080:1234 alpine/socat \
TCP-LISTEN:1234,fork TCP-CONNECT:172.20.0.4:30530
其中 socat 要 run 在 k8s container 同网域的 kind,
而 172.20.0.4:30530 是由 kubectl expose --type NodePort 产生的。
只是我觉得这种解法还不够漂亮,因为 node port 是随机选的,
host 一重开机指令就要修改。
又 kubectl port-forward 好似也能解,但它会绑定现有 pods、不会重绑,
一旦 pods 重启,例如 kubectl scale --replicas=0, 再 --replicas=2,
就无法 forward 至新 pods。
可能是我学艺还不够,不知道 k8s 此问题的标准解法。
目前正在研究 ingress 跟 load balancer,有一点像是用它们来解!?
6F:推 rog43: 我之前有和你类似状况 後来是在ubuntu架一个nginx proxy 11/01 23:45
7F:→ rog43: 导过去 11/01 23:45
8F:→ rog43: 但你k8s那边要弄个service ymal写好 target port 这样才不 11/01 23:47
9F:→ rog43: 会依赖node port 11/01 23:47
找到一篇跟我一样用 socat 解 KIND (k8s in docker) 存取 service 问题:
https://banzaicloud.com/blog/kind-ingress/
谢谢各位建议。我该考虑 k8s on bare metal 会比较好上手。
※ 编辑: zxvc (59.124.69.199 台湾), 11/02/2021 09:10:21