我运行带有多个独立服务的Kubernetes单节点开发集群— Nginx代理的端口为80,elasticsearch的端口为9200。是否可以通过入口公开这些服务,并通过一个LoadBalancer IP提供入口点? (x.x.x.x:80和x.x.x.x:9200)
我读到了入口限制,只能通过80和443端口访问。但是,也许存在一些解决方法?
感谢任何建议
更新
我通过创建多个入口并使用相同的负载平衡器解决了我的问题。但是Nginx入口面临一些问题,这花费了我很多时间。 使用我的方法的最简单方法是安装带有头盔的入口控制器,并使用公开的服务和端口对其进行参数设置
helm install ingress stable/nginx-ingress --set tcp.4445="default/nginx-proxy:4445" --set tcp.8888="default/demo:8888" --set tcp.19200="default/elasticsearch:19200"
在此过程中,将创建必要的资源,包括带有端口/服务的configmap。然后,我们只需要为每个服务创建入口。请注意,该服务必须是ClusterIP。
但是如果以后您想公开一些额外的服务并手动添加所有内容(创建configmap,更新入口服务,创建入口,甚至重新创建nginx pod),我将无法连接到服务:(
所以(对我而言)任何更改都会导致重新安装所有控制器
答案 0 :(得分:3)
了解您所拥有的开发服务器没有云集群所具备的许多出色功能。但是有一些解决方法可以使其看起来像一个。
**出口限制,只能通过80和443端口访问?
是的,但是您可以覆盖它,我不建议您每次需要添加/删除端口时都要进行大量的手动操作
**有什么方法可以通过入口公开这些服务
有一个更好的解决方案。为什么您不使用自己的域名说Elasticsearch.Dehimb.host / grafana.Dehimb.host等...?
使用nginx入口控制器(可以使用其他控制器,但以下配置以nginx为例)
使用帮助作为后台驻留程序集而不是部署来部署它,并使用下面的values文件更改 https://github.com/helm/charts/blob/master/stable/nginx-ingress/values.yaml#L52
reportNodeInternalIp:是
useHostPort:是
在这里您可以将* .Dehimb.com设置为k8s节点IP。 (kubectl获取节点-owide)
使用笔记本电脑将dns masq IP用作其默认ISP名称服务器上方的名字服务器
现在,只需在您的笔记本电脑中浏览时,就可以创建具有任意多个域的入口:
->它首先使用dnsmasq将其解析为k8s节点IP,
->由于设置了守护程序,每个节点上都打开了端口80
->这些端口正在将流量传递到具有入口配置的nginx
-> nginx知道将流量传递给哪个服务
听起来可能有些复杂,但是它在全部工作和一次设置后就很有趣。
您也可以使用metallb(但要弄清楚它是否破裂则不太容易)
答案 1 :(得分:2)
您可以根据需要创建任意数量的入口资源,但是所有资源都将使用用于公开入口控制器的相同LoadBalancer。
您需要具有kubernetes集群IP类型服务。在服务中,您可以将where name like 'hello-world%'
设置为port
,将80
设置为targetPort
。之后,您可以在入口中将9200
称为servicePort
。
或者在clusterIP类型服务中将80
和port
设为targetPort
,并在入口的9200
中提及9200
。
您是正确的事实,例如nginx之类的入口只能接受端口servicePort
和80
上的流量,但是nginx是反向代理,这意味着它将终止该客户端连接并创建与该客户端的新连接。 443
,并且servicePort
不一定是servicePort
或80
,即可以是443
。
答案 2 :(得分:2)
您只需要设置将流量定向到正确服务的入口规则。
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: nginx
spec:
rules:
- host: nginx.example.com
http:
paths:
- backend:
serviceName: nginx
servicePort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: elasticsearch
spec:
rules:
- host: elasticsearch.example.com
http:
paths:
- backend:
serviceName: elasticsearch
servicePort: 9200