我尝试使用 Nginx Ingress 重现您的场景,但使用 server-snippet 和 configuration-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-svc 的upstream 指向我的目标服务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
希望有帮助!