Kubernetes Ingress IP白名单
2022-04-23 by dongnan
环境
测试的k8s
集群由一个Master
管理节点、两个Worker
计算节点组成,详细请参考这里。
请求路径
Client -> SLB -> Ingress -> App
日志
SLB负载均衡器:
client_ip:8.8.8.8
host:www.xyc.com
request_uri:/static/js/0.35c179c800d8e086ae27.js
Ingress控制器:
8.8.8.8 - - [20/Apr/2022:09:21:35 +0000] "GET /static/js/0.35c179c800d8e086ae27.js HTTP/1.1" 200 12800 "https://www.xyc.com/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36" 772 0.000 [test-asset-svc-80] [] 172.18.xxx.244:80 12800 0.000 200 bb0c0d1f231d96160ecc63b6388cccc0
APP应用服务器:
172.18.xxx.242 - - [20/Apr/2022:17:21:35 +0800] "GET /static/js/0.35c179c800d8e086ae27.js HTTP/1.1" 200 12800 "https://www.xyc.com/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36" 8.8.8.8 -
目标
希望设置K8s
控制器的Ingress
规则,只允许特定的IP
访问(白名单),例如允许IP
地址为 8.8.8.8 访问资源。
解决方法
可以使用 Ingress
内置的 nginx.ingress.kubernetes.io/whitelist-source-range
注解功能,来实现目标。
修改 Ingress 规则
类似如下:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
namespace: fst-test
name: ssl-fst
annotations:
nginx.ingress.kubernetes.io/affinity: "cookie"
nginx.ingress.kubernetes.io/session-cookie-name: "ssl-fst"
nginx.ingress.kubernetes.io/session-cookie-expires: "172800"
nginx.ingress.kubernetes.io/session-cookie-max-age: "172800"
nginx.ingress.kubernetes.io/proxy-send-timeout: "600"
nginx.ingress.kubernetes.io/proxy-read-timeout: "600"
nginx.ingress.kubernetes.io/whitelist-source-range: "8.8.8.8/32" # IP/CIDR
spec:
rules:
- host: www.xyc.com
http:
paths:
- path: /
backend:
serviceName: fst-asset-svc
servicePort: 80
- path: /backend
backend:
serviceName: fst-server-svc
servicePort: 80
应用 Ingress 规则
kubectl apply -f lb.yaml
通过对比 Ingress Controller
容器发现,实际上是在 nginx
中添加了以下两条规则:
{
# 省略...
allow 8.8.8.8/32;
deny all;
}
验证
白名单IP
返回200
状态码 ,而非白名单IP则返回403状态码:
curl -IL https://www.xyc.com/static/js/0.35c179c800d8e086ae27.js
HTTP/2 403 # 状态码
date: Wed, 20 Apr 2022 07:36:11 GMT
content-type: text/html
content-length: 153