iT邦幫忙

2024 iThome 鐵人賽

DAY 7
0
Kubernetes

異世界生存戰記:30天煉成GKE大師系列 第 7

Day7 掌控流量入門 GKE NEG Service and Ingress

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20240921/20169017ongEJnC36A.png

前言

在雲端的世界裡,Kubernetes 已經成為容器化應用部署的標準。而 Google Cloud Platform 的 Google Kubernetes Engine (GKE) 則提供了強大的功能和靈活性,讓開發者能輕鬆部署和管理容器應用。其中,Neg Service 就是 GKE 中一個重要的功能,它能幫助我們在不暴露內部 Kubernetes 集群 IP 地址的情況下,安全地暴露服務到外部世界。接下來,我們將深入了解 Neg Service 的工作原理,以及它如何為您的應用提供更安全的網路環境。

GCP NEG(網絡端點組)介紹

網絡端點組 (NEG) 是一個配置對象,用於指定一組後端端點或服務。借助 NEG,Google Cloud 負載均衡器可以為基於虛擬機 (VM) 實例組的工作負載、無服務器工作負載 和容器化工作負載提供服務。NEG 使您可以在更精細的級別將流量分配到負載均衡器的後端,例如,對於 GKE 工作負載,在 Pod 級別進行流量負載均衡,而不是在虛擬機級別。

GKE NEG 簡介

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 對象之間的對應關系。

https://ithelp.ithome.com.tw/upload/images/20240921/20169017pHgh2Fsju7.png

使用 NEG 的 Ingress

將 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

https://ithelp.ithome.com.tw/upload/images/20240921/20169017XyPO0CvkPD.png
或是直接使用以下指令創建防火牆,記得將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 紀錄加上去

https://ithelp.ithome.com.tw/upload/images/20240921/20169017arTfPskXz4.png

$ 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

https://ithelp.ithome.com.tw/upload/images/20240921/201690175VwnoeR1Jl.png

在點擊後端名稱,會發現他是偵測 Pod IP 是否可以正常訪問,並且 GCP 的 Loadbalance 健康檢查也是偵測後端 Pod 是否正常

https://ithelp.ithome.com.tw/upload/images/20240921/20169017BohiAscBWI.png

打開瀏覽器進入網頁

https://ithelp.ithome.com.tw/upload/images/20240921/20169017IMP4jRmpIG.png

因為沒有設定證書走 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。

參考文件


上一篇
Day6 GKE 服務的一張身份證 GKE IAM Workload Identity
下一篇
Day8 Kubernetes 流量管理魔法棒 Nginx Ingress Controller
系列文
異世界生存戰記:30天煉成GKE大師30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言