有两种方法可以实现:
1.第一个是使用server-snippet 注释:
使用注解nginx.ingress.kubernetes.io/server-snippet它
可以在服务器配置中添加自定义配置
块。
这是我的入口对象清单:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: minimal-ingress
annotations:
nginx.ingress.kubernetes.io/server-snippet: |
location ~* /admin-access {
deny all;
return 403;
}
spec:
rules:
- host: domain.com
http:
paths:
- path: /
backend:
serviceName: web
servicePort: 80
请注意使用this 方法:
此注解每个主机只能使用一次。
2。第二个是ConfigMaps和Server-snippet的用法:
你要做的就是找到你的configMap:
kubectl get pod <nginx-ingress-controller> -o yaml
这是位于容器args:
spec:
containers:
- args:
- /nginx-ingress-controller
- configmap=$(POD_NAMESPACE)/nginx-loadbalancer-conf
然后只需编辑它并添加server-snippet 部分:
apiVersion: v1
data:
server-snippet: |
location /admin-access {
deny all;
}
此方法允许您为 Ingress 资源中定义的所有主机全局定义受限位置。
请注意,使用 server-snippet 时,您正在阻止的路径无法在入口资源对象中定义。然而,location-snippet 通过ConfigMap 有另一种方式:
location ~* "^/web/admin {
deny all;
}
对于入口对象中的每个现有路径,都会有入口规则,但它会针对特定的 uri 被阻止(在上面的示例中,当admin 出现在web 之后时,它会被阻止)。所有其他 uri 都将通过。
3。这是一个测试:
➜ curl -H "Host: domain.com" 172.17.0.4/test
...
"path": "/test",
"headers": {
...
},
"method": "GET",
"body": "",
"fresh": false,
"hostname": "domain.com",
"ip": "172.17.0.1",
"ips": [
"172.17.0.1"
],
"protocol": "http",
"query": {},
"subdomains": [],
"xhr": false,
"os": {
"hostname": "web-6b686fdc7d-4pxt9"
...
这是一个路径被拒绝的测试:
➜ curl -H "Host: domain.com" 172.17.0.4/admin-access
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.19.0</center>
</body>
</html>
➜ curl -H "Host: domain.com" 172.17.0.4/admin-access/test
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.19.0</center>
</body>
</html>
其他信息:Deprecated APIs Removed In 1.16。以下是您需要了解的内容:
v1.22 版本将停止提供以下已弃用的 API
支持更新和更稳定的 API 版本:
extensions/v1beta1 API 版本中的 Ingress 将不再是
送达