跳转至

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

参考文档

回到页面顶部