繁体   English   中英

Kube.netes Ingress 在 nginx 反向代理后面运行

[英]Kubernetes Ingress running behind nginx reverse proxy

我在可以从 inte.net 访问的服务器上安装了 minikube。

我创建了一个可用的 kube.netes 服务:

>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)到 map 到 minikube 中的服务。

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

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

a) yaml 文件应该包含什么

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

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

d) 如果是这样,ingress-nginx 运行在什么地址上(这样我就可以向它发送 map 流量)?

建立

首先,您需要一个nginx入口控制器

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)是一种优雅的方式。

也可以通过在Virtualbox中设置虚拟网络端口来完成。

如@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。

使用 iptables 转发主机的端口到 minikube ip 的端口

sudo echo “1” > /proc/sys/net/ipv4/ip_forward
sudo vim /etc/sysctl.conf
change net.ipv4.ip_forward = 1
# enable iptables's NAT:
sudo /sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

# forword host's port 30000-32767 to minikube ip's port 30000-32767
sudo iptables -t nat -I PREROUTING -p tcp -d <host ip> --dport 30000:32767 -j DNAT --to <minikube ip>:30000-32767

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM