我正在使用 MicroK8S 学习 K8S。我有一个三节点集群,每个节点有 16G 内存。集群已自动进入 HA 模式。该集群位于我的家庭 LAN 上。
这是我的节点:
姓名 | 知识产权 | 颜色 | 角色 |
---|---|---|---|
排列 | 192.168.50.251 | 黄色的 | 领导者 |
尼卡 | 192.168.50.74 | 蓝色的 | 工人 |
山崎 | 192.168.50.135 | 绿色的 | 工人 |
设置
我有一个在集群中的 pod 上运行的 Web 应用程序。它在端口 9090 上响应。这是我让它运行的方式。
我在开发笔记本电脑上有一个图像,我将其转换为压缩包:
docker save k8s-workload > k8s-workload.docker.tar
然后我将该 tarball 发送给集群的领导者:
scp k8s-workload.docker.tar 192.168.50.251:/home/myuser/
然后,我将该图像旁加载到集群上的所有节点中:
root@arran:/home/myuser# microk8s images import < k8s-workload.docker.tar
Pushing OCI images to 192.168.50.251:25000
Pushing OCI images to 192.168.50.135:25000
Pushing OCI images to 192.168.50.74:25000
然后我在每个节点上验证 MIME 类型和图像的校验和,因为我在这方面遇到了一些问题:
root@arran:/home/myuser# microk8s ctr images list | grep workload
docker.io/library/k8s-workload:latest application/vnd.docker.distribution.manifest.v2+json sha256:725b...582b 103.5 MiB linux/amd64
最后我运行工作负载,确保 K8S 不会尝试拉取镜像(这是不必要的,但默认策略是无论如何都会尝试):
root@arran:/home/myuser# microk8s kubectl run k8s-workload --image=k8s-workload --image-pull-policy='Never' --port=9090
pod/k8s-workload created
然后我从领导节点确认这是成功的:
root@arran:/home/myuser# microk8s kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
k8s-workload 1/1 Running 0 83m 10.1.134.216 yamazaki <none> <none>
运行应用程序
为了从我的开发笔记本电脑访问 Web 应用程序,我只在一个节点上公开该应用程序。pod 在 Yamazaki 节点上运行,因此最初我从该节点运行它:
root@yamazaki:/home/myuser# microk8s kubectl port-forward pod/k8s-workload 9090 --address='0.0.0.0'
Forwarding from 0.0.0.0:9090 -> 9090
这很好用。
问题
我想通过向集群中的任何节点发出请求来访问该应用程序,而不仅仅是这个节点。目前该应用程序仅在一个节点上运行,即使我向另一个节点发出 Web 请求,我也希望它能正常工作。
我知道 K8S 有内部网络来做我想做的事。例如,如果我port-forward
在 Arran 上运行命令(并在 Yamazaki 上杀死相同的命令),那么应用程序仍然可以运行,即使 pod 仅在 Yamazaki 上运行。但我仍然只能从一个 IP(运行端口转发器的 Arran)访问该应用程序。
当然,我可以通过在每个节点上的 SSH 会话上运行端口转发器来做我想做的事。但我想运行一些在所有 SSH 会话被终止后仍然存在的东西。
理想情况下,我想使用控制台命令来执行此操作,但我想知道我是否需要为此使用 YAML 清单。从我目前的研究来看,我认为我需要一个 ClusterIP。
更新/研究 1
我正在阅读有关裸机负载平衡的 K8S 手册页。该页面的一部分建议用户应用一个 646 行的配置文件,这对于学习场景来说会适得其反。
这个示例似乎更明智,但不清楚 LB 是如何被指示在所有主机上运行的。
更新/研究 2
我还找到了专门针对 MicroK8S 的资源,它推荐了一个入口插件。不幸的是,这需要将我的工作负载设置为服务,而现在我只有一个 Pod,所以认为这已经结束了。
让我们使用一个
NodePort
service
,它是一种抽象的方式来公开在一组上运行的应用程序Pods
作为网络服务,它将每个端口上的传入流量路由Node
到您的Service
.我们可以这样定义它:
然后我们应用清单,它应该可以工作
microk8s kubectl apply -f my-service.yaml