不讓任何人都可以自出自入的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

參考