不讓任何人都可以自出自入的Ingress
Ingress 中我們可以設定whitelist,只容許特定的ip去訪問 只要在whitelist-source-range中輸入想要容許的CIDR block就可以了
metadata:
name: whitelist
annotations:
ingress.kubernetes.io/whitelist-source-range: "123.123.123.123/24" # 這邊設定為容許的IP範圍
但如果你的ingress是經AWS的ELB的話就會訪問不了 原因是IP資訊沒辦法去到nginx-controller
在ingress-controller的log中會看到打印出來的地址是這樣:
10.1.58.160 - [10.1.58.160] - - [15/Feb/2018:04:11:52 +0000] "POST /api/console/proxy?path=_aliases&method=GET HTTP/1.1" 200 8253 "http://abc.com" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10\_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36" 480 0.028 [ingress-80] 100.96.18.45:5601 8240 0.028 200
在log中會發現每次connect時ip都會不一樣,因為當中其實是經過了kube-proxy的redirect 所以在ingress-controller中你會看到的地址其實都是從不同的node redirect過來 而kubernetes中有一個解決方向可以免卻這樣的雙重load-balancing(kube-proxy本身的service discovery就有load-balancing的作用)
controller:
service:
externalTrafficPolicy: "Local"
原理是利用healthcheck port去讓ELB去決定該node有沒有service 有的話就會redirect去該node,從而減少了一重redirect
當完成以上操作後,雖然IP不會轉來轉去,但仍然是內聯網的地址
因為externalTrafficPolicy只會把相同的請求都連去同一個node上,但用戶的地址在第一個node中已經丟失掉
這時侯就需要利用proxy-protocol
因為ELB存在的關係,而kubernetes中的ELB是用L4的
所以要保存的話只好設定proxy-protocol
1. 設定nginx-ingress-controller
proxy-real-ip-cidr: '10.1.0.0/16' # 把real-ip-cidr設定成VPC的CIDR
use-proxy-protocol: 'true' # use-proxy-protocol設定成true
2. 設定ELB,把ingress-controller使用的ELB改為支持proxy-protocol
這邊要注意的是,非proxy-protocol的connection將會存取失敗,意思是該controller以後只支持proxy-protocol 如何設定AWS-ELB的proxy-protocol