是否可以通过 Kubernetes 控制器节点提供应用程序?

Is it possible to serve up applications through a Kubernetes controller node?

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

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

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

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

目前我有 运行 类型的 NodePort 服务。我可以安装 MetalLB 以便拥有 LoadBalancer 功能。然而,根据我所看到的,我不确定这是否有帮助。

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

我是不是找错人了?我想这可能不是 Kubernetes 的预期用例,但我正在考虑一个想法。感谢人们的任何想法。

更新*

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

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

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

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

通过 NodePort 服务公开它

部署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 并通过 http://master-node-ip:NodePort of nginx ingress controller

获取 "Welcome to nginx! "