在雲端的世界裡,Kubernetes 已經成為容器化應用部署的標準。而 Google Cloud Platform 的 Google Kubernetes Engine (GKE) 則提供了強大的功能和靈活性,讓開發者能輕鬆部署和管理容器應用。其中,Neg Service 就是 GKE 中一個重要的功能,它能幫助我們在不暴露內部 Kubernetes 集群 IP 地址的情況下,安全地暴露服務到外部世界。接下來,我們將深入了解 Neg Service 的工作原理,以及它如何為您的應用提供更安全的網路環境。
網絡端點組 (NEG) 是一個配置對象,用於指定一組後端端點或服務。借助 NEG,Google Cloud 負載均衡器可以為基於虛擬機 (VM) 實例組的工作負載、無服務器工作負載 和容器化工作負載提供服務。NEG 使您可以在更精細的級別將流量分配到負載均衡器的後端,例如,對於 GKE 工作負載,在 Pod 級別進行流量負載均衡,而不是在虛擬機級別。
NEG 表示一組端點。GKE 支持 GCE_VM_IP_PORT 類型的獨立 NEG。GCE_VM_IP_PORT NEG 支持使用虛擬機主要內部 IP 地址或其某一別名 IP 範圍內的 IP 地址的端點。
在使用獨立 NEG 的 GKE VPC 原生集群的上下文中,每個端點都是一個 Pod IP 地址和目標端口。Pod IP 地址源自節點的 Pod 的別名 IP 地址範圍,該範圍來自集群的 Pod 的子網次要 IP 地址範圍。
GKE 提供一個 NEG 控制器來管理 GCE_VM_IP_PORT NEG 的成員資格。您可以將它創建的 NEG 作為後端添加到您在 GKE API 之外配置的負載均衡器的後端服務。
下圖描述了 Kubernetes API 對象與 Compute Engine 對象之間的對應關系。
將 NEG 與 GKE Ingress 搭配使用時,Ingress 控制器會協助創建負載均衡器的所有方面。這包括創建虛擬 IP 地址、轉發規則、健康檢查、防火墻規則等等。
先在 httpd 的命名空間建立前端示範使用的 httpd 的 deployment
apiVersion: v1
kind: Namespace
metadata:
name: httpd
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: httpd-deployment
namespace: httpd
spec:
replicas: 1
selector:
matchLabels:
app: httpd
template:
metadata:
labels:
app: httpd
spec:
containers:
- name: httpd-container
image: httpd:latest
ports:
- containerPort: 80
protocol: TCP
livenessProbe:
httpGet:
path: /
port: 80
readinessProbe:
httpGet:
path: /
port: 80
容器原生負載均衡是使用網絡端點組 (NEG) 直接將負載均衡到 GKE 中的 Pod 端點的做法。
在 metadata.annotations 下新增 cloud.google.com/neg: '{"ingress": true}'
apiVersion: v1
kind: Service
metadata:
name: httpd-service
namespace: httpd
annotations:
cloud.google.com/neg: '{"ingress": true}'
spec:
type: ClusterIP
selector:
app: httpd
ports:
- protocol: TCP
port: 80
targetPort: 80
如果有設定 Shared VPC 的話,在產生 Ingress 之前,需要先建立一個用於 Health Check 的防火牆規則。
請進入 VPC 的 Console,並選擇左側導覽列中 Firewall 的選項,點擊上方「建立防火牆規則」,於名稱的欄位為您的 Firewall 指定一個名字,本範例將以「healthcheck-firewall」做為例子,並請將 Network 的欄位改成 GKE 的 VPC「ithome-202409-demo-vpc」,目標標記填入 GKE Node 的標記,來源的部分則需要填入2個 Google 所使用的 CIDR 網段:130.211.0.0/22 及 35.191.0.0/16
或是直接使用以下指令創建防火牆,記得將project, network, target-tags 改成使用者的設定
$ gcloud compute --project=$project_id firewall-rules create healthcheck-firewall --direction=INGRESS --priority=1000 --network=$VPC_Name --action=ALLOW --rules=PROTOCOL:PORT,... --source-ranges=0.0.0.0/0 --destination-ranges=35.191.0.0/16,130.211.0.0/22 --target-tags=$target_tags
完成上述步驟後,接著配置GKE 支援的適用於外部應用負載平衡器的Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: httpd-ing
namespace: httpd
spec:
defaultBackend:
service:
name: httpd-service # Name of the Service targeted by the Ingress
port:
number: 80 # Should match the port used by the Service
rules:
- host: demo-httpd.demoit.shop
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: httpd-service
port:
number: 80
等待大約 1 分鐘後,GCP 會自動為此 Ingress 產生外部 IP,輸入指令查看 kubectl describe ingress httpd-ing -n httpd
$ kubectl describe ingress httpd-ing -n httpd
Name: httpd-ing
Labels: <none>
Namespace: httpd
Address: 34.128.184.181
Ingress Class: <none>
Default backend: httpd-service:80 (10.120.81.12:80)
Rules:
Host Path Backends
---- ---- --------
demo-httpd.demoit.shop
/ httpd-service:80 (10.120.81.12:80)
Annotations: ingress.kubernetes.io/backends: {"k8s1-7fea8163-httpd-httpd-service-80-74fec542":"HEALTHY"}
ingress.kubernetes.io/forwarding-rule: k8s2-fr-cs4rb6lw-httpd-httpd-ing-mfxmjg31
ingress.kubernetes.io/target-proxy: k8s2-tp-cs4rb6lw-httpd-httpd-ing-mfxmjg31
ingress.kubernetes.io/url-map: k8s2-um-cs4rb6lw-httpd-httpd-ing-mfxmjg31
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Sync 7m36s (x70 over 10h) loadbalancer-controller Scheduled for sync
接下來將進入 DNS Cloud 頁面,將 DNS A 紀錄加上去
$ gcloud dns --project=$project_id record-sets create demo-httpd.demoit.shop. --zone="demoit" --type="A" --ttl="300" --rrdatas="$ NEG Loadbalancer IP"
進入 Load balancing 頁面找到剛剛創建的 Ingress Loadbalance
在點擊後端名稱,會發現他是偵測 Pod IP 是否可以正常訪問,並且 GCP 的 Loadbalance 健康檢查也是偵測後端 Pod 是否正常
打開瀏覽器進入網頁
因為沒有設定證書走 80 Port,會顯示 Not Secure,之後的章節會演示如何添加證書
今天示範了 GCP 使用 NEG Service 及 Ingress 產生 Loadbalancer,NEG 是 GCP 一個很重要且強大的功能,最大的優點在 Pod 級別進行流量負載均衡,Loadbalancer 可以直接對 Pod 進行健康檢查,有別於以往常用的 K8s livenessprobe。
一開始還不熟悉 GCP,在創建任何 Loadbalancer 及 Loadbalancer 的 Health Check 時經常會踩到一個坑,就是其防火牆一定要設定好,否則健康檢查會一直報錯,之後還會介紹 NEG 使用在 Multi-Cluster Load Balancing。