我可以在不设置负载均衡器的情况下将 k8s 入口服务与外部 IP 一起使用吗?



几个月前我开始使用 kubernetes,我为不同的后端应用程序创建服务和复制集。

现在我想使用入口服务通过我的域名从外部访问我不同的应用程序。由于它尚未投入生产,并且我仅在节点上使用,因此我不想使用负载均衡器。

是否可以使用 NodePort 设置服务并将其附加到入口而无需使用负载均衡器?

这是我的配置:

kind: Service
metadata:
  name: nginx-replicaset-service
  labels:
    app: nginx-demo
spec:
  externalIPs:
    - XXX.XXX.XXX.XXX
  selector:
    app: nginx-replica
  type: NodePort
  ports:
    - name: http
      port: 80
kind: Ingress
metadata:
  name: my-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  rules:
    - host: www.mydomain.com
      http:
        paths:
          - path: /
            backend:
              serviceName: nginx-replicaset-service
              servicePort: 80
    - host: test.mydomain.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: other-service
              servicePort: 80

当我检查集群上的入口信息时,我有以下内容:

NAME         HOSTS                                   ADDRESS   PORTS   AGE
my-ingress   www.mydomain.com,test.mydomain.com                80      4d22h

地址始终为空

如果您的集群在 GCP 或 GKE 上运行,您可以

1( 创建全局 IP 地址

gcloud compute addresses create ingress-static-ip --global

2( 在入口配置上设置 kubernetes.io/ingress.global-static-ip-name 注释

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: my-ingress
  annotations:
    kubernetes.io/ingress.global-static-ip-name: ingress-static-ip
  labels:
    app: nginx-replica

3(和服务

apiVersion: v1
kind: Service
metadata:
  name: nginx-replicaset-service
  labels:
    app: nginx-demo
spec:
  selector:
    app: nginx-replica
  type: NodePort
  ports:
    - name: http
      port: 80

https://cloud.google.com/kubernetes-engine/docs/tutorials/configuring-domain-name-static-ip

不是直接的,或者至少会很尴尬。出于安全原因,NodePort 服务仅限于一系列高端口,因此这需要http://externalip:43210或它选择的任何端口。不使用负载均衡器的更常见方法是使用 DaemonSet 和 hostNetwork 模式部署入口控制器,以便它可以侦听 80 和 443。不过,这仍然留下了将IP提供给用户的问题。出于开发目的,您可以为节点选择任何 IP 并使用它。对于生产,它更难,这就是为什么通常不推荐它的原因。

是的,你可以,但你不应该使用外部IP指定NodePort。使用外部IP,您可以直接指定端口,如下所示:

kind: Service
metadata:
  name: nginx-replicaset-service
  labels:
    app: nginx-demo
spec:
  externalIPs:
    - XXX.XXX.XXX.XXX
  selector:
    app: nginx-replica
  ports:
    - name: http
      port: 80

这意味着您可以使用 XXX.XXX.XXX.XXX:80 访问该服务

描述入口时看不到任何地址是很正常的事情,入口将仅包含您在 ingress.yaml 中指定的内容:您只在入口中使用了主机名。

如果你执行"kubectl get svc">,你将看到你的服务与外部IPs。

此外,为了使您的入口正常工作,这意味着 www.domain.com,test.domain.com 需要指向 XXX.XXX.XXX.XXX

最新更新