入口控制器-基于用户代理的代理传递

时间:2019-11-11 14:35:14

标签: kubernetes kubernetes-ingress

我正在尝试基于用户代理对流量进行proxy_pass。试图为此使用server-snippet / configuration-snippet,但是ingress不允许我这样做。 (禁止在服务器代码段中使用proxy_pass并争论在配置代码段中的重复项)

我不能只使用“后端”,因为我必须基于用户代理程序自己动态传递流量。 我有机会做吗?以下无法正常使用的配置示例(尚无用户代理)

apiVersion: extensions/v1beta1
kind: Ingress

spec:
  rules:
  - host: m-rm-qa.yadayadayada
    http:
      paths:
      - path: /
        backend:
          serviceName: frontend-svc
          servicePort: 80
metadata:
  name: rm-frontend-ingress
  namespace: rm-qa
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/server-snippet: |
      proxy_pass http://prerender-service:3000;
      rewrite .* /$scheme://$host$request_uri? break;

1 个答案:

答案 0 :(得分:0)

我尝试使用Nginx Ingress重现您的方案,但使用server-snippetconfiguration-snippet却没有成功。

我做了一些研究,发现Nginx Plus有一个名为location-snippet的代码片段应该可以工作。参见here.

或者,我已经创建了一个服务类型为LoadBalancer的自定义Nginx部署,并创建了一个具有自定义Nginx配置的configMap,并且可以使用!

如果想尝试,则需要使用自定义configMap文件创建一个default.conf,如下所示:

在此示例中,我使用的是命名空间:default,但是您可以根据需要创建自定义命名空间。

nginx-custom-config.yaml:

---
apiVersion: v1
kind: ConfigMap
metadata:
  name: custom-nginx-config
  namespace: default
data:
  default.conf: |
    upstream my-svc {
        server echo-svc.default.svc.cluster.local;
    }

    server {
        listen       80;
        server_name  localhost;

        location / {

            root   /usr/share/nginx/html;
            index  index.html index.htm;

            if ($http_user_agent ~* "iPhone|iPad" ) {
                add_header X-Vendor "Apple";
                proxy_pass  http://my-svc;
            }
            if ($http_user_agent ~ Chrome ) {
                add_header X-Vendor "OpenSource";
                proxy_pass  http://my-svc;
            }

            proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
        }
        error_page   500 502 503 504  /50x.html;

        location = /50x.html {
            root   /usr/share/nginx/html;
        }
    }

适用于Kubernetes:

kubectl apply -f nginx-custom-config.yaml
  • 我已经创建了一个名为upstream的{​​{1}},它指向我的目标服务my-svc
  • 在我的echo-svc.default.svc.cluster.local中存在一个与location: /匹配的条件,在这种情况下,如果从Apple设备User-agent发出了一个名为"iPhone|iPad"的标头,其值是将创建X-Vendor,并将请求重定向到我的目标服务Apple。如果请求是从“ Chrome”发出的,也会发生同样的情况,但标题为my-svc
  • 如果请求是从其他浏览器发出的,例如firefox,curl等...,则会显示Nginx默认页面。

之后,您需要创建一个X-Vendor: "OpenSource"的Nginx图像,将我们的deployment作为文件安装在容器内,如下所示:

custom-nginx-deployment.yaml:

configMap

--- apiVersion: apps/v1 kind: Deployment metadata: name: custom-nginx spec: selector: matchLabels: app: custom-nginx template: metadata: labels: app: custom-nginx spec: containers: - name: custom-nginx image: nginx volumeMounts: - name: custom-nginx-config mountPath: /etc/nginx/conf.d ports: - name: http containerPort: 80 imagePullPolicy: IfNotPresent volumes: - name: custom-nginx-config configMap: name: custom-nginx-config

最后,创建一个kubectl apply -f custom-nginx-deployment.yaml服务来接收请求:

custom-nginx-svc.yaml:

LoadBalancer

--- apiVersion: v1 kind: Service metadata: name: custom-nginx-svc labels: app: custom-nginx spec: selector: app: custom-nginx ports: - protocol: TCP port: 80 targetPort: 80 type: LoadBalancer

您可以使用以下命令检查容器和服务是否已成功部署:

kubectl apply -f custom-nginx-svc.yaml

希望有帮助!