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