Nginx 反向代理后面的 Kubernetes Ingress 运行
Kubernetes Ingress running behind nginx reverse proxy
我已经在可以从互联网访问的服务器上安装了 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 上的传入流量如何从浏览器重定向到入口和 minikube。
c) 我还需要用nginx做反向代理吗?
d) 如果是这样,ingress-nginx 运行 的地址是什么(以便我可以将流量映射到它)?
设置
首先,你需要一个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,host应该是nginx controller所在运行所在的主机。
外面
通常您不需要在 kubernetes 集群之外使用另一个 nginx。
虽然 Minikube 有点不同,它是 运行 虚拟机中的 kubernetes 而不是主机。
我们需要做一些端口转发,例如 host:80 => minikube:80,运行 在主机中使用反向代理(如 nginx)是一种优雅的方式。
也可以通过setting virtual networking port forward in 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 给出的答案不同,因为它必须包含应该匹配的 "host"。
使用这个文件,我创建了入口:
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
header 必须通过,因为入口使用它来匹配服务。如果不通过,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
我已经在可以从互联网访问的服务器上安装了 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 上的传入流量如何从浏览器重定向到入口和 minikube。
c) 我还需要用nginx做反向代理吗?
d) 如果是这样,ingress-nginx 运行 的地址是什么(以便我可以将流量映射到它)?
设置
首先,你需要一个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,host应该是nginx controller所在运行所在的主机。
外面
通常您不需要在 kubernetes 集群之外使用另一个 nginx。
虽然 Minikube 有点不同,它是 运行 虚拟机中的 kubernetes 而不是主机。
我们需要做一些端口转发,例如 host:80 => minikube:80,运行 在主机中使用反向代理(如 nginx)是一种优雅的方式。
也可以通过setting virtual networking port forward in 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 给出的答案不同,因为它必须包含应该匹配的 "host"。
使用这个文件,我创建了入口:
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
header 必须通过,因为入口使用它来匹配服务。如果不通过,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