首页 文章

Kubernetes Ingress在nginx反向代理后面运行

提问于
浏览
4

我在服务器上安装了minikube,我可以从互联网上访问 .

我创建了一个kubernetes服务,该服务可用:

>kubectl get service myservice
NAME        CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
myservice   10.0.0.246   <nodes>       80:31988/TCP   14h

minikube的IP地址是:

>minikube ip
192.168.42.135

我希望URL http://myservice.myhost.com (即端口80)映射到minikube中的服务 .

我在主机上运行nginx(与kubernetes完全无关) . 我可以设置一个虚拟主机,将URL映射到 192.168.42.135:31988 (节点端口),它工作正常 .

我想使用入口 . 我添加并启用了入口 . 但我不确定:

a)yaml文件应该包含什么

b)来自浏览器的端口80上的传入流量如何被重定向到入口和迷你管道 .

c)我还需要使用nginx作为反向代理吗?

d)如果是这样,ingress-nginx运行的是什么地址(以便我可以将流量映射到它)?

2 回答

  • 3

    设置

    首先,你需要nginx ingress controller .

    nginx实例将侦听主机80和443端口,并将每个HTTP请求重定向到入口配置定义的服务,如下所示 .

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: my-service-ingress
    annotations:
      # by default the controller redirects (301) HTTP to HTTPS,
      # the following would make it disabled.
      # ingress.kubernetes.io/ssl-redirect: "false"
    spec:
      rules:
      - http:
          paths:
          - path: /
            backend:
              serviceName: myservice
              servicePort: 80
    

    使用 https://{host-ip}/ 访问myservice,主机应该是运行nginx控制器的主机 .

    外面

    通常你不需要kubernetes集群之外的另一个nginx .

    虽然Minikube有点不同,但它在虚拟机中运行kubernetes而不是主机 .

    我们需要像主机那样做一些端口转发:80 => minikube:80,在主机中运行反向代理(如nginx)是一种优雅的方式 .

    它也可以通过setting virtual networking port forward in Virtualbox来完成 .

  • 1

    如@silverfox所述,您需要一个入口控制器 . 您可以在minikube中启用入口控制器,如下所示:

    minikube addons enable ingress
    

    根据 minikube ip ,Minikube运行在IP 192.168.42.135上 . 启用入口插件后,它也会侦听端口80 . 但这意味着主机需要像nginx这样的反向代理,以代理到端口80到minikube的调用 .

    在minikube上启用入口后,我创建了一个入口文件(myservice-ingress.yaml):

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: myservice-ingress
      annotations:
        ingress.kubernetes.io/rewrite-target: /
    spec:
      rules:
        - host: myservice.myhost.com
          http:
            paths:
            - path: /
              backend:
                serviceName: myservice
                servicePort: 80
    

    请注意,这与@silverfox给出的答案不同,因为它必须包含应该匹配的“主机” .

    使用此文件,我创建了入口:

    kubectl create -f myservice-ingress.yaml
    

    最后,我向nginx添加了一个虚拟主机(在minikube外部运行),以便将来自外部的流量代理到minikube:

    server {
      listen 80;
      server_name myservice.myhost.com;
      location / {
        proxy_set_header Host            $host;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_pass http://192.168.42.135;
      }
    }
    

    必须传递 Host 标头,因为入口使用它来匹配服务 . 如果未通过,则minikube无法将该请求与服务匹配 .

    记得在添加上面的虚拟主机后重启nginx .

相关问题