Kubernetes Ingress在nginx反向代理后运行

9

我已经在一台能够从互联网访问的服务器上安装了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(节点端口)并且它可以正常工作。
我想要使用一个 ingress。我已经添加并启用了 ingress。但是我不确定:
a) yaml 文件应该包含什么内容
b) 浏览器上从端口 80 进来的流量如何被重定向到 ingress 和 minikube 上
c) 我是否仍需要使用 nginx 作为反向代理?
d) 如果需要,ingress-nginx 运行在哪个地址上(以便我可以将流量映射到它上面)?
3个回答

6

安装设置

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

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

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://{主机IP}/访问我的服务,主机应该是nginx控制器运行的主机。

外部

通常情况下,在kubernetes集群之外不需要另一个nginx。
而Minikube有点不同,它在虚拟机中运行kubernetes,而不是在主机上运行。
我们需要进行一些端口转发,例如主机:80 => minikube:80,在主机上运行反向代理(如nginx)是一种优雅的方式。
也可以通过在Virtualbox中设置虚拟网络端口转发来完成。

我猜minikube与“正常”的kubernetes不同,因为它有自己的IP地址,所以需要nginx将请求代理到minikube。不过还是谢谢你的建议。 - Ant Kutschera

5

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

minikube addons enable ingress

根据 minikube ip,Minikube运行在IP地址192.168.42.135上。启用ingress插件后,它还监听端口80。但这意味着需要一个反向代理(如nginx)在主机上将对端口80的调用代理到Minikube。

在Minikube上启用ingress后,我创建了一个ingress文件(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给出的答案不同,因为它必须包含应匹配的“主机”。

使用此文件,我创建了Ingress:

kubectl create -f myservice-ingress.yaml

最后,我在minikube之外运行的nginx中添加了虚拟主机,以代理来自外部的流量进入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;
  }
}
< p > Host 头部必须传递,因为 ingress 使用它来匹配服务。如果不传递,则 minikube 无法将请求与服务匹配。

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


0

使用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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接