Фед*_*Дао 5 kubernetes kubernetes-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;
Run Code Online (Sandbox Code Playgroud)
我尝试使用 Nginx Ingress 重现您的场景,但使用server-snippet
和没有成功configuration-snippet
。
我做了一些研究,发现Nginx Plus
有一个名为location-snippet
that 的代码片段应该可以工作。看这里。
或者,我创建了一个具有服务类型的自定义 Nginx 部署LoadBalancer
,并创建了一个configMap
具有自定义 Nginx 配置的部署,它可以工作!
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;
}
}
Run Code Online (Sandbox Code Playgroud)
适用于 Kubernetes:
kubectl apply -f nginx-custom-config.yaml
Run Code Online (Sandbox Code Playgroud)
upstream
call 。my-svc
echo-svc.default.svc.cluster.local
location: /
,有一个与 匹配的条件User-agent
,在这种情况下,如果从 Apple 设备发出请求,则会创建"iPhone|iPad"
一个名为X-Vendor
value 的标头Apple
,并将请求重定向到我的目标服务my-svc
。如果请求是从“Chrome”发出的,也会发生同样的情况,但标头将为X-Vendor: "OpenSource"
.之后,您需要创建一个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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
kubectl apply -f custom-nginx-svc.yaml
您可以使用以下命令检查容器和服务是否已成功部署:
kubectl get pods -l app=custom-nginx
kubectl get svc -l app=custom-nginx
Run Code Online (Sandbox Code Playgroud)
希望有帮助!
归档时间: |
|
查看次数: |
2525 次 |
最近记录: |