使用 Helm 建立 AWS network load balancer
Kubernetes 揭露服務有多種方式,例如 Ingres、NodePort、LoadBalancer。 次篇紀錄使用 Helm 來安裝 ingress-nginx 與 AWS 的 network load balancer,將流量通道指定的 Pods 上。
Kubernetes ingress controllers 的供應商很多,目前服務使用 Nginx 和 Traefik 來做 ingress controllers。另外 Istio service mesh 也是滿知名的 controllers 之一。
Add ingress-nginx repository
要先加入 ingress-nginx repo 至 Helm 中。
1helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
2
3# show repository list
4bash$ helm repo list
5NAME URL
6ingress-nginx https://kubernetes.github.io/ingress-nginx
7stable https://charts.helm.sh/stable
8prometheus-community https://prometheus-community.github.io/helm-charts
9jetstack https://charts.jetstack.io
Install ingress-nginx
透過 Helm 安裝 ingress-nginx,其中有一併設定 annotations 跟 config。
annotations:是宣吿在安裝時配置為 AWS network load balancer。
config:是 Nginx config 的相關配置。
1helm install ingress-nginx-nlb ingress-nginx/ingress-nginx -n kube-system \
2--set controller.service.annotations."service\.beta\.kubernetes\.io\/aws-load-balancer-type"="nlb" \
3--set controller.config."use-proxy-protocol"="true" \
4--set controller.config."ssl-redirect"="false"
由於 network load balancer 是 OSI Layer 4,所以取 client real IP 會取用到 private IP。可以看到下面的 X-Real-Ip
欄位。
1bash$ curl https://justin.example.com/server | jq
2{
3 "clientIP": "10.0.75.140",
4 "header": {
5 "Accept": [
6 "*/*"
7 ],
8 "User-Agent": [
9 "curl/7.64.1"
10 ],
11 "X-Forwarded-For": [
12 "10.0.75.140"
13 ],
14 "X-Forwarded-Host": [
15 "justin.example.com"
16 ],
17 "X-Forwarded-Port": [
18 "443"
19 ],
20 "X-Forwarded-Proto": [
21 "https"
22 ],
23 "X-Forwarded-Scheme": [
24 "https"
25 ],
26 "X-Real-Ip": [
27 "10.0.75.140"
28 ],
29 "X-Request-Id": [
30 "8c4991c13d1497362ddb513e02f3c859"
31 ],
32 "X-Scheme": [
33 "https"
34 ]
35 }
36}
為了抓取正確的 real IP,需要開啟 network load balancer 的 Proxy protocol v2 功能,等配置生效後即可看到取到 client real IP。可以看到下面的 X-Real-Ip
欄位。
1bash$ curl https://justin.example.com/server | jq
2{
3 "clientIP": "1.34.113.121",
4 "header": {
5 "Accept": [
6 "*/*"
7 ],
8 "User-Agent": [
9 "curl/7.64.1"
10 ],
11 "X-Forwarded-For": [
12 "1.34.113.121"
13 ],
14 "X-Forwarded-Host": [
15 "justin.example.com"
16 ],
17 "X-Forwarded-Port": [
18 "443"
19 ],
20 "X-Forwarded-Proto": [
21 "https"
22 ],
23 "X-Forwarded-Scheme": [
24 "https"
25 ],
26 "X-Real-Ip": [
27 "1.34.113.121"
28 ],
29 "X-Request-Id": [
30 "f4c4490b0919271b5e9d5d0a5dc37089"
31 ],
32 "X-Scheme": [
33 "https"
34 ]
35 }
36}