Kubernetes?Ingress實現細粒度IP訪問控制
業(yè)務場景
有這么一個業(yè)務場景:業(yè)務平臺還是通過Kubernetes進行編排對外提供服務。然后其后臺管理部分,出于安全的考慮,只允許特定的IP才能訪問。如何實現?
目前,我們的網絡架構是 SLB + Nginx Ingress + Ingress + Service + Pod的模式。其中,SLB使用的是阿里云的負載均衡SaaS服務,使用的是7層負載,支持一個SLB實例+多個域名的轉發(fā)模式,如下圖所示。
阿里云SLB可以通過設定黑/白名單的方式進行訪問控制,但是該訪問控制會進行”一刀切“:所有通過該SLB提供服務的域名要么都可以訪問,要么都不可以訪問。如果domain1和domain2這倆域名可以開放訪問,domain3限定某些特定IP才能訪問,阿里云SLB的訪問控制就無法滿足我們的需求。
如果要實現這種業(yè)務場景,可以通過在Ingress里配置白名單來實現。
配置如下:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/server-snippet: | set_real_ip_from 100.64.0.0/10; # 100.64.0.0/10是阿里云負載均衡網段 https://help.aliyun.com/document_detail/54007.html set_real_ip_from 192.168.0.0/24; real_ip_header X-Forwarded-For; real_ip_recursive on; nginx.ingress.kubernetes.io/whitelist-source-range: {allow_access_ip1},{allow_access_ip2} name: {your_application-ingress} namespace: {your_ns} spec: rules: - host: {your_host} http: paths: - backend: service: name: {your_application-service} port: number: 80 path: / pathType: Prefix
說明:
- nginx.ingress.kubernetes.io/server-snippet: 等同于在nginx的server配置塊中添加自定義配置;
- nginx.ingress.kubernetes.io/whitelist-source-range: 允許訪問的客戶端IP源,多個IP可用逗號隔開,支持CIDR格式,如:192.168.0.0/24, 172.31.0.1;
- set_real_ip_from : 是指接受從哪個信任前代理處獲得真實用戶ip, 可以寫多行,如100.64.0.0/10, 192.168.0.0/24
- real_ip_header : 是指從接收到報文的哪個http首部去獲取前代理傳送的用戶ip, 一般是從header的X-Forwarded-For字段獲取IP(remote_addr只是代理上一層的地址,不一定是原始的用戶ip)
- real_ip_recursive :
- 為on時 , 遞歸排除IP地址:對從real_ip_header里獲得的IP串,從右往左, 依次過濾掉來自set_real_ip_from的IP,剩下的第一個就默認是用戶的IP了。
- 為off時,對從real_ip_header里獲取的IP串,當最右邊一個IP是信任的IP(即在set_real_ip_from里有設置),即認為其右邊的第二個IP就是用戶的真實IP。
舉例, 假設:
- real_ip_header里獲得的IP串是1.1.1.1, 2.2.2.2, 192.168.0.100
- set_real_ip_from = 192.168.0.0/24,2.2.2.2
- real_ip_recursive = on時,用戶IP=1.1.1.1
- real_ip_recursive = off時,用戶IP=2.2.2.2
通過以上設置,就可以在同一個SLB實例下,實現域名級別的訪問控制,比較適合后臺管理類網站部署的訪問控制。
以上就是Kubernetes Ingress實現細粒度IP訪問控制的詳細內容,更多關于Kubernetes Ingress IP訪問控制的資料請關注腳本之家其它相關文章!