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

时间:2019-03-31 21:37:47

标签: kubernetes kubernetes-ingress

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

现在,我想使用入口服务通过我的域名从外部访问我的不同应用程序。因为它还没有投入生产,我只在节点上使用,所以我不想使用负载均衡器。

是否可以在不使用负载均衡器的情况下通过NodePort设置服务并将其附加到Ingress?

这是我的配置:

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

地址始终为空

3 个答案:

答案 0 :(得分:1)

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

1)创建一个全球IP地址

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

2)在Ingress配置上设置 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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

是的,但是您不应该使用 ExternalIPs 指定 NodePort 。 使用 ExternalIPs ,您可以像这样直接指定端口:

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

访问该服务

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

如果您执行“ kubectl get svc” ,您将看到带有externalIP的服务。

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