【问题标题】:Ingress controller - proxy pass based on user agent入口控制器 - 基于用户代理的代理传递
【发布时间】:2019-11-11 14:35:14
【问题描述】:

我正在尝试基于用户代理代理_传递流量。尝试使用 server-sn-p / configuration-sn-p ,但入口不允许我。 (禁止在server-sn-p中使用proxy_pass,并在configuration-sn-p中争论重复)

我不能只使用“后端”,因为我必须根据用户代理自己动态传递流量。 我有机会做到吗?下面不工作的配置示例(还没有用户代理)

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;

【问题讨论】:

  • 您是否正在考虑使用标准的 nginx 作为服务而不是 nginx 入口?
  • 嗨 @Федор Дао 你的问题解决了吗?

标签: kubernetes kubernetes-ingress


【解决方案1】:

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

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

另外,我创建了一个自定义 Nginx 部署,其服务类型为 LoadBalancer,并创建了一个 configMap,并使用自定义 Nginx 配置,它的工作原理!

如果你想尝试,你需要用你自定义的default.conf文件创建一个configMap,它看起来像这样:

在本示例中,我使用的是命名空间: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
  • 我创建了名为my-svcupstream 指向我的目标服务echo-svc.default.svc.cluster.local
  • 在我的location: / 中有一个匹配User-agent 的条件,在这种情况下,如果从Apple 设备"iPhone|iPad" 发出请求,则会创建并重定向名为X-Vendor 且值为Apple 的标头对我的目标服务my-svc 的请求。如果请求是从“Chrome”发出的,也会发生同样的情况,但标头将是 X-Vendor: "OpenSource"
  • 如果请求是从其他浏览器发出的,例如 firefox、curl 等...它们将显示 Nginx 默认页面。

之后,您需要创建一个 Nginx 映像的 deployment,并将我们的 configMap 挂载为容器内的文件,如下所示:

custom-nginx-deployment.yaml:

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

最后,创建一个LoadBalancer 服务来接收请求:

custom-nginx-svc.yaml:

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

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

kubectl get pods -l app=custom-nginx
kubectl get svc -l app=custom-nginx

希望有帮助!

【讨论】:

    猜你喜欢
    • 2017-05-04
    • 2018-06-11
    • 1970-01-01
    • 1970-01-01
    • 2021-01-10
    • 2013-03-12
    • 1970-01-01
    • 2018-07-17
    • 1970-01-01
    相关资源
    最近更新 更多