在kubernetes集群上通过Ingress公开一些服务

时间:2020-05-26 16:14:26

标签: kubernetes kubernetes-ingress nginx-ingress traefik-ingress

我运行带有多个独立服务的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),我将无法连接到服务:(

所以(对我而言)任何更改都会导致重新安装所有控制器

3 个答案:

答案 0 :(得分:3)

了解您所拥有的开发服务器没有云集群所具备的许多出色功能。但是有一些解决方法可以使其看起来像一个。

**出口限制,只能通过80和443端口访问?

是的,但是您可以覆盖它,我不建议您每次需要添加/删除端口时都要进行大量的手动操作

**有什么方法可以通过入口公开这些服务

有一个更好的解决方案。为什么您不使用自己的域名说Elasticsearch.Dehimb.host / grafana.Dehimb.host等...?

  1. 使用nginx入口控制器(可以使用其他控制器,但以下配置以nginx为例)

  2. 使用帮助作为后台驻留程序集而不是部署来部署它,并使用下面的values文件更改 https://github.com/helm/charts/blob/master/stable/nginx-ingress/values.yaml#L52

reportNodeInternalIp:是

useHostPort:是

  1. 现在使用dnsmasq设置您的dns,可能是使用此图像的某个小节点,甚至可能是主机上的容器: https://github.com/jpillora/docker-dnsmasq

在这里您可以将* .Dehimb.com设置为k8s节点IP。 (kubectl获取节点-owide)

  1. 使用笔记本电脑将dns masq IP用作其默认ISP名称服务器上方的名字服务器

  2. 现在,只需在您的笔记本电脑中浏览时,就可以创建具有任意多个域的入口:

->它首先使用dnsmasq将其解析为k8s节点IP,

->由于设置了守护程序,每个节点上都打开了端口80

->这些端口正在将流量传递到具有入口配置的nginx

-> nginx知道将流量传递给哪个服务

听起来可能有些复杂,但是它在全部工作和一次设置后就很有趣。

您也可以使用metallb(但要弄清楚它是否破裂则不太容易)

答案 1 :(得分:2)

您可以根据需要创建任意数量的入口资源,但是所有资源都将使用用于公开入口控制器的相同LoadBalancer。

您需要具有kubernetes集群IP类型服务。在服务中,您可以将where name like 'hello-world%' 设置为port,将80设置为targetPort。之后,您可以在入口中将9200称为servicePort

或者在clusterIP类型服务中将80port设为targetPort,并在入口的9200中提及9200

您是正确的事实,例如nginx之类的入口只能接受端口servicePort80上的流量,但是nginx是反向代理,这意味着它将终止该客户端连接并创建与该客户端的新连接。 443,并且servicePort不一定是servicePort80,即可以是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