GCP Load balancer後端導向GKE
GKE設定
透過在service上設定annotation來建立zonal NEGs(network endpoint group)
apiVersion: v1
kind: Service
metadata:
name: foobar
annotations:
cloud.google.com/neg: '{"exposed_ports": {"8000":{"name": "foobar-neg"}}}'
apply完service設定後
即可在GCP Console的Compute Engine > Network endpoint group頁面中看到設定的NEG
建立固定IP
在GCP Console的VPC Networks > IP Address頁面
建立一個固定IP提供給後續LB使用
並可在這時候先將DNS使用A record指向該IP
Firewall
firewall必須允許後續LB health check通過
架設health check的port是8000
則設定如下
IP Range
35.191.0.0/16
130.211.0.0/22
LB - Frontend設定
以下範例為強制http轉https
因此只需要建立一個https frontend
並選擇好固定IP
Certificate
Certificate的部分就直接用Google-managed certificate最簡單
Domain就設定前面DNS設定的domain即可
最後勾選Enable HTTP to HTTPS redirect
才能讓LB強制將http轉https
LB - Backend service設定
Backend的架構如下
一個backend service底下有多個backend
- Backend service
- Backend
這邊要建立backend service指向前面設定好的GKE NEG
因此Backend type必須選擇Zonal network endpoint group
這邊就可以看到有3個zone的neg
直接將3個neg都當成backend加入到這個backend service中
讓LB backend service透過health check自行決定要導向哪個backend
health check
health check可以先在Compue Engine>Health check頁面中設定
Port specification可選擇Fixed port或是Serving port
若設定為Serving port將會自動偵測NEG使用的port
完成
完成後需要等待一段時間
LB才會生效
常見問題
Network endpoint group內無任何endpoint
如果GKE上的service已經使用annotations設定cloud.google.com/neg
並且已經將service發佈到GKE上
但看不到NEGs上看不到任何endpoint
可能是之前有刪除掉cluster
但NEGs沒一併刪除
這是我遇過的情況
那時候我將NEG刪除後
再重新佈署(kubectl apply -f)建立service
NEGs內的endpoint就又長出來了
health check設定正確但狀態一直失敗
如果確定health check的設定都是正確的
但狀態一直失敗
可以檢查一下health check的port是否有在firewall允許的清單內