1

我在一组 Raspberry Pi4 计算机上构建了一个 K3s ( https://k3s.io ) 集群。

控制器 ( ctrl-1) 节点是一个网关,因为它有 2 个网络接口。一个连接到我的 LAN,另一个连接到它创建的网络,例如 K3S-LAN。两个节点 (node-1node-2) 部署到 K3S-LAN。

我希望能够通过ctrl-1例如从 LAN 访问在节点上运行的应用程序。这是因为这个集群是可移植的,所以只有ctrl-1节点需要连接到访客 LAN。(是的,DNS 名称等问题需要解决,但我想先运行基础知识)。

这意味着我需要能够通过ctrl-1. 我认为我对此有正确的想法,因为我使用 Helm 将“nginx-ingress”部署到 master。但是我忘记了这个服务 - 这已经安排在节点上,而它需要在控制器上以便打开端口(我认为)。但是我找不到如何使服务在控制器上运行。

目前,我的服务以NodePort. 我可以安装 MetalLB 以便我有LoadBalancer能力。但是,根据我所看到的,我不确定这是否有帮助。

ctrl-1没有任何污点设置,只是主人的角色。

我在这里吠错树了吗?我想这可能不是 Kubernetes 的预期用例,但我正在玩一个想法。感谢人们的任何想法。

更新*

我刚刚认为解决此问题的方法可能是在ctrl-1(作为主机上的另一个服务)上运行 HAProxy 并设置规则以代理到集群中的必要服务。这将充当网络之间的桥梁。

4

1 回答 1

1
  1. 您只需要通过 Nodeport 类型的服务公开您的 pod,并且可以通过http://master-node-ip:nodeport访问它。确保 kube-proxy 正在所有主节点和工作节点上运行。

  2. 只要您的主服务器上运行 kube-proxy,入口方法也应该有效。您在集群上部署 nginx 入口,它将被部署到工作节点中。然后,您可以使用 NodePort 服务公开 nginx 入口控制器本身。在此之后,您可以创建用于配置 nginx 入口控制器的入口资源,以将流量路由到在工作节点上运行的后端 pod 和服务。后端 pod 的服务应该是 ClusterIP 类型。

部署 nginx 入口控制器并使用 NodePort 服务公开它kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.27.1/deploy/static/provider/baremetal/service-nodeport.yaml

部署 nginx pod(nginx 是一个例子..这应该是你的 pod)kubectl run nginx --generator=run-pod/v1 --image=nginx

通过 ClusterIP 服务公开 nginx pod

apiVersion: v1
kind: Service
metadata:
  labels:
    run: nginx
  name: nginx-service
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    run: nginx

创建入口资源

apiVersion: extensions/v1beta1
kind: Ingress
metadata: 
  name: mycha-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - http:
      paths:
        - path: /
          backend:
            serviceName: nginx-service
            servicePort: 80

通过上述设置,我现在可以访问 nginx 并获得“欢迎使用 nginx!”通过http://master-node-ip:NodePort of nginx ingress controller

于 2020-01-26T11:27:51.573 回答