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



我正在尝试基于用户代理来代理传递流量。尝试使用服务器代码段/配置代码段,但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;

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

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

或者,我已经创建了一个具有服务类型LoadBalancer的自定义Nginx部署,并创建了具有定制Nginx配置的configMap,这一切都很好!

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

本例使用名称空间:default,但如果需要,可以创建自定义名称空间。

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

应用于Kubernetes:

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

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

自定义nginx部署。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

希望能有所帮助!

相关内容

  • 没有找到相关文章

最新更新