是否可以通过 Kubernetes 控制器节点提供应用程序?
Is it possible to serve up applications through a Kubernetes controller node?
我在一组 Raspberry Pi4 计算机上构建了一个 K3s (https://k3s.io) 集群。
控制器 (ctrl-1
) 节点是一个网关,因为它有 2 个网络接口。一个连接到我的局域网,另一个连接到它创建的网络,例如K3S-局域网。两个节点(node-1
和node-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(作为主机上的另一项服务)并设置规则以代理集群内的必要服务。这将充当网络之间的桥梁。
您只需要通过 Nodeport 类型的服务公开您的 pod,并且可以通过 http://master-node-ip:nodeport 访问它。确保 kube-proxy 在所有主节点和工作节点上都是 运行。
只要您的 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! "
我在一组 Raspberry Pi4 计算机上构建了一个 K3s (https://k3s.io) 集群。
控制器 (ctrl-1
) 节点是一个网关,因为它有 2 个网络接口。一个连接到我的局域网,另一个连接到它创建的网络,例如K3S-局域网。两个节点(node-1
和node-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(作为主机上的另一项服务)并设置规则以代理集群内的必要服务。这将充当网络之间的桥梁。
您只需要通过 Nodeport 类型的服务公开您的 pod,并且可以通过 http://master-node-ip:nodeport 访问它。确保 kube-proxy 在所有主节点和工作节点上都是 运行。
只要您的 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
部署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