gpt4 book ai didi

kubernetes - 入口 Controller - 基于用户代理的代理通行证

转载 作者:行者123 更新时间:2023-12-02 11:46:55 25 4
gpt4 key购买 nike

我正在尝试根据用户代理代理_传递流量。试图为它使用服务器代码段/配置代码段,但入口不允许我。 (禁止在 server-snippet 中使用 proxy_pass 并在 configuration-snippet 中争论重复)

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

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 Ingress 重现您的场景,但使用 server-snippet 没有成功和 configuration-snippet .

我做了一些研究,看到 Nginx Plus有一个片段叫做 location-snippet那应该工作。见 here.

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

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

I'm using the namespace: default for this example, but you can create a custom namespace if you want.



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

  • 之后你需要创建一个 deployment挂载我们的 Nginx 图像 configMap作为容器内的文件,如下所示:

    自定义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接收请求的服务:

    自定义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

    希望有帮助!

    关于kubernetes - 入口 Controller - 基于用户代理的代理通行证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58803394/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com