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

时间:2017-09-30 22:53:41

标签: nginx kubernetes minikube

我在服务器上安装了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

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

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

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

a)yaml文件应该包含什么

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

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

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

2 个答案:

答案 0 :(得分:4)

设置

首先,您需要一个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 =&gt; minikube:80,在主机中运行反向代理(如nginx)是一种优雅的方式。

也可以setting virtual networking port forward in Virtualbox完成。

答案 1 :(得分:2)

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

minikube addons enable ingress
根据{{​​1}},

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

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

minikube ip

请注意,这与@silverfox给出的答案不同,因为它必须包含&#34; host&#34;哪个应该匹配。

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

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

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

kubectl create -f myservice-ingress.yaml

必须传递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; } } 标头,因为入口使用它来匹配服务。如果未通过,则minikube无法将该请求与服务匹配。

请记住在添加上面的虚拟主机后重新启动nginx。