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

时间:2020-01-26 11:09:07

标签: kubernetes k3s

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

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

我希望能够通过ctrl-1访问在节点上运行的应用程序,例如从局域网。这是因为该群集具有可移植性,因此仅ctrl-1节点需要连接到来宾LAN。 (是的,DNS名称等有待解决的问题,但我想让基础知识先运行。)

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

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

ctrl-1上没有任何污点,只是主角色。

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

更新*

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

1 个答案:

答案 0 :(得分:1)

  1. 您只需要通过Nodeport类型服务公开您的Pod,就可以通过http://master-node-ip:nodeport对其进行访问。确保kube-proxy在所有主节点和辅助节点上运行。

  2. 只要在主服务器上运行kube-proxy,入口方法也应该起作用。您在群集上部署了nginx入口,它将被部署到工作节点中。然后,您可以使用NodePort服务公开nginx入口控制器本身。之后,您可以创建用于配置nginx入口控制器的入口资源,以将流量路由到在工作节点上运行的后端Pod和服务。后端Pod的服务应为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获取“欢迎使用nginx!”