在Nginx入口控制器内部配置外部IP重定向

分享于 

5分钟阅读

互联网

  繁體

问题:

问题

如何在调用外部IP地址时将Nginx入口控制器配置为重定向到URL。

入口控制器yaml


apiVersion: v1


kind: Service


metadata:


labels:


 helm.sh/chart: ingress-nginx-3.4.1


 app.kubernetes.io/name: ingress-nginx


 app.kubernetes.io/instance: ingress-nginx


 app.kubernetes.io/version: 0.40.2


 app.kubernetes.io/managed-by: Helm


 app.kubernetes.io/component: controller


name: ingress-nginx-controller


namespace: ingress-nginx


spec:


type: NodePort


ports:


 - name: http


 port: 80


 protocol: TCP


 targetPort: http


 - name: https


 port: 443


 protocol: TCP


 targetPort: https


externalIPs: 


- ip1


- ip2


- ip3


selector:


 app.kubernetes.io/name: ingress-nginx


 app.kubernetes.io/instance: ingress-nginx


 app.kubernetes.io/component: controller




答案1:

仅创建入口资源无效。

为了达到预期的效果,你应该创建两个独立的输入对象(不是控制器),第一个没有指定主机,因此该规则将通过IP地址应用于所有入站HTTP通信,如入口规则


apiVersion: extensions/v1beta1


kind: Ingress


metadata: 


 annotations: 


 nginx.ingress.kubernetes.io/permanent-redirect: "https://www.google.com"


 name: ingress-redirect


spec: 


 rules: 


 - http: 


 paths: 


 - path: / 


 pathType: Prefix 


 backend: 


 serviceName: example


 servicePort: 12 



以及第二个提供的主机的入口对象(例如hello-world.info )以便规则应用于该主机,和在下面的例子中:


apiVersion: extensions/v1beta1


kind: Ingress


metadata:


 name: ingress-host


spec: 


 rules: 


 - host: hello-world.info


 http: 


 paths: 


 - path: / 


 pathType: Prefix 


 backend: 


 serviceName: web


 servicePort: 80




如你所见,上面的配置在nginx.conf nginx-ingress-controller中创建以下部分,一个负责向特定主机提供请求:头,另一个用于服务不带主机的请求:


enter http { 



# works when no Host header is provided



 ## start server _


 server {


 server_name _ ;



 listen 80 default_server reuseport backlog=511 ;


 listen 443 default_server reuseport backlog=511 ssl http2 ;



 location / {



 set $namespace "default";


 set $ingress_name "ingress-redirect";


 set $service_name "";


 set $service_port "";


 set $location_path "/";



 return 301 https://www.google.com;



# works when specific Host header is provided



 ## start server hello-world.info


 server {


 server_name hello-world.info ;



 listen 80 ;


 listen 443 ssl http2 ;



 location / {



 set $namespace "default";


 set $ingress_name "ingress-host";


 set $service_name "web";


 set $service_port "80";


 set $location_path "/";



 }



 }


 ## end server hello-world.info



为了测试,我已经快速部署了这两个入口对象和nginx pod:


➜ kubectl run --image nginx web 



把它暴露在第二个入口对象的后面:


➜ kubectl expose pod web --port 80 



正如你可以看到的,curl重定向工作正常:


➜ ~ curl $(minikube ip) -I 


HTTP/1.1 301 Moved Permanently


Server: nginx/1.19.0


Date: Tue, 27 Oct 2020 13:22:06 GMT


Content-Type: text/html


Content-Length: 169


Connection: keep-alive


Location: https://www.google.com



如果你curl与主机名相同的地址它重定向到Nginx pod:


➜ ~ curl $(minikube ip) -H "Host: hello-world.info" 


---


<!DOCTYPE html>


<html>


<head>


<title>Welcome to nginx!</title>


<style>


---



值得一提的是,Kubernetes文档也提供了很好的示例 - 基于名称的虚拟主机,它支持将HTTP通信路由到同一IP地址的多个主机名,该文档中的示例告诉后备负载平衡器根据Host标头路由请求。

例如,上面文档页面中提到的Ingress将请求first.bar.com的流量路由到service1,将second.foo.com路由到service2,以及到IP地址的任何流量(在请求中未定义主机名)(即,没有请求)标头显示给service3。



控制  ext  RED  控制器  Nginx  Extern