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

Kubernetes 入口控制器-基于用户代理的代理传递,kubernetes,kubernetes-ingress,Kubernetes,Kubernetes Ingress,我正在尝试基于用户代理代理传递流量。尝试对其使用服务器代码段/配置代码段,但ingress不允许。(禁止在服务器代码段中使用proxy_pass,并在配置代码段中讨论重复) 我不能只使用“后端”,因为我必须自己基于用户代理动态地传递流量。 我有可能做到吗?下面的配置示例不工作(还没有用户代理) 我曾尝试使用Nginx ingres复制您的场景,但使用服务器代码段和配置代码段没有成功 我做了一些研究,发现Nginx Plus有一个名为location snippet的片段应该可以工作。看 或者,我

我正在尝试基于用户代理代理传递流量。尝试对其使用服务器代码段/配置代码段,但ingress不允许。(禁止在服务器代码段中使用proxy_pass,并在配置代码段中讨论重复)

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


我曾尝试使用Nginx ingres复制您的场景,但使用
服务器代码段
配置代码段
没有成功

我做了一些研究,发现
Nginx Plus
有一个名为
location snippet
的片段应该可以工作。看

或者,我已经创建了一个带有服务类型
LoadBalancer
的自定义Nginx部署,并创建了带有自定义Nginx配置的
configMap
,它可以正常工作

如果要尝试,需要使用自定义的
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;
        }
    }
---
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
---
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
适用于Kubernetes:

kubectl apply -f nginx-custom-config.yaml
  • 我已经创建了
    上游
    调用的
    我的svc
    指向我的目标服务
    echo svc.default.svc.cluster.local
  • 在我的
    位置:/
    有一个与
    用户代理
    匹配的条件,在这种情况下,如果请求是从苹果设备
    “iPhone | iPad”
    发出的,将创建一个名为
    X-Vendor
    且值为
    Apple
    的标题,并将请求重定向到我的目标服务
    my svc
    。如果请求是从“Chrome”发出的,也会发生同样的情况,但标题将是
    X-Vendor:“OpenSource”
  • 如果请求来自其他浏览器,如firefox、curl等。。。它们将显示Nginx默认页面
之后,您需要创建一个Nginx映像的
部署
,将我们的
configMap
作为文件装入容器中,如下所示:

自定义nginx部署。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;
        }
    }
---
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
---
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应用-f自定义nginx部署。yaml

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

自定义nginx svc.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;
        }
    }
---
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
---
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应用-f自定义nginx svc.yaml

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

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

希望有帮助

您是否正在考虑使用标准的nginx作为服务,而不是nginx入口?您好@Фаааааааааааааа107!