使用 F5 NGINX 保護和擴充混合應用(第 1 部分)

Ingress controller 是管理 Kubernetes 集群進出流量的核心引擎。鑒於 Ingress controller 是部署在集群內運行的,應如何將流量路由到它呢?又應如何將外部流量路由到內部 Kubernetes Service 呢?本文介紹的解決方案將 NGINX Plus 部署為 Kubernetes 的外部負載均衡服務,並將流量路由到 NGINX Ingress Controller。

如果您正在生產環境中使用 Kubernetes,那麼很可能在使用 Ingress controller(Ingress 控制器)。Ingress controller 是管理 Kubernetes 整合進出流量的核心引擎。鑒於 Ingress controller 是部署在整合內運行的,應如何將流量路由到它呢?又應如何將外部流量路由到內部 Kubernetes Service 呢?

雲供應商提供了一種簡便的方法,使用外部負載均衡器暴露 Kubernetes Service。 只需部署一個託管Kubernetes Service(EKS、GKE、AKS)並建立一個 LoadBalancer 類型的 Kubernetes Service 即可。 雲供應商將託管並部署一個提供公共IP位址的負載均衡器後,外部用戶可通過此公共入口點連接到 Kubernetes Service。

不過,該整合僅適用於雲供應商託管的 Kubernetes Service。 如果您在私有雲/本地環境中部署 Kubernetes,則需部署自己的負載均衡器,並將其與 Kubernetes 集群相集成。 此外,雲端 Kubernetes 負載均衡整合僅限於TCP 負載均衡,通常缺乏對指標、日誌追蹤的可視化。

我們的建議:

  • 採用與工作負載基本運作基礎架構相關的解決方案
  • 容量規劃指南,來避免高流量帶來的瓶頸問題
  • 實現的不僅是基本 TCP/HTTP 負載平衡的應用程式交付場景

在上述解決方案中,我將 NGINX Plus 部署為 Kubernetes 的外部負載平衡服務,將流量路由到 NGINX Ingress Controller。種新型NGINX 控制器,可監控指定的Kubernetes 服務,並傳送API 呼叫以管理NGINX 外部負載平衡器的上游端點。

Nkl W Nginx Plus Ingress Controller

在本文中,我將在 Kubernetes 負載和作為外部負載平衡器的 NGINX Plus 中部署元件。

我個人喜歡將 NLK 和 Kubernetes 叢集部署在同一個子網路中,組成出現網路問題。

準備工作

本文假設您擁有 Kubernetes 環境操作經驗,此外,您還需要以下幾點:

  • Kubernetes 環境的存取權限;裸機、Rancher Kubernetes Engine (RKE)、VMWare Tanzu Kubernetes (VTK)、Amazon Elastic Kubernetes (EKS)、Google Kubernetes Engine (GKE)、Microsoft Azure Kubernetes Service (AKS) 和 RedHat OpenShift
  • NGINX Ingress Controller ——在 Kubernetes 整合中部署 NGINX Ingress Controller 
  • NGINX Plus —— 將NGINX Plus 部署至具有SSH 存取權限的虛擬機器或裸機。使用申請30天免費試用版

Kubernetes 環境

首先部署後端應用。 您可以部署自己的應用,也可以部署基本 café 應用,如本例所示。

$ kubectl apply –f cafe.yaml

現在,為 Ingress 控制器設定路由和 TLS 設定

$ kubectl apply –f cafe-secret.yaml 

$ kubectl apply –f cafe-virtualserver.yaml 

為了確保成功套用 Ingress 規則,請檢查 kubectl get vs 的輸出。

VirtualServer 定義處於 Valid 狀態。

NAMESPACE     NAME             STATE    HOST                         IP      PORTS   
default       cafe-vs          Valid    cafe.example.com

將 NGINX Plus 設定為外部負載平衡器

全新安裝的 NGINX Plus 將會在 /etc/nginx/conf.d 目錄中預設提供 default.conf 檔案。我們還需要將另外兩個檔案新增到此目錄下。只需將以下檔案複製到 /etc/nginx/conf.d 目錄即可:

  • dashboard.conf
    此檔案用於啟用 NGINX Plus 的即時監控儀表板。
  • kube_lb.conf
    這是一個 NGINX 配置檔案,用於作為 Kubernetes 的外部負載平衡器。您可以根據需求調整此配置檔案。在本文中,我們為一個叢集啟用了基本路由與 TLS。

此外,您需要生成 TLS 憑證與金鑰,並將它們放置在 NGINX Plus 實例的 /etc/ssl/nginx 資料夾中。在此範例中,我們將使用 openssl 生成自簽名憑證。  

$ openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout default.key -out default.crt -subj "/CN=NLK"

注意: 自簽名憑證僅適用於測試用途。在實際的生產環境中,建議使用安全的 Vault 來保存金鑰,並使用受信任的 CA(憑證頒發機構)簽發的憑證。

現在可以驗證配置,然後重新載入nginx從而更改生效。

$ nginx –t
$ nginx –s reload

現在,可以連接到NGINX Plus儀錶板,具體方法是打開瀏覽器並輸入

http://<external-ip-nginx>:9000/dashboard.html#upstreams
Rd1

HTTP 上游表應為空,因為我們尚未部署 NLK 控制器。

在下一節中,我們將進行NLK控制器的配置。

安裝NLK控制器

您可以將 NLK Controller 安裝為 Kubernetes 部署,其將透過使用 NGINX Plus API,為外部負載平衡器配置上游(Upstream)端點。首先,請建立一個名為 NLK 的命名空間。

$ kubectl 建立 ns nlk

將 RBAC 評估 NKL 部署

$ kubectl apply -f serviceaccount.yaml 
 $ kubectl apply -f clusterrole.yaml 
 $ kubectl apply -f clusterrolebinding.yaml 
 $ kubectl apply -f Secret.yaml 

下一步是建立一個 ConfigMap,定義 NGINX Plus 外部負載平衡器的 API 端點。 NLK 控制器使用 API 端點來設定 NGINX Plus 上游端點。我們只需將 GitHub 儲存庫中的清單中的 nginx-hosts 欄位修改為 NGINX 外部負載平衡器的 IP 位址即可。

nginx-hosts: 

    http://<nginx-plus-external-ip>:9000/api

應用更新的ConfigMap,並配置NLK控制器

$ kubectl apply –f nkl-configmap.yaml 

 $ kubectl apply –f nkl-deployment 

現在可以驗證 NLK 控制器配置是否正在運行,以及是否套用了 ConfigMap 數據。

$ kubectl get pods –o wide –n nlk 	
$ kubectl describe cm nginx-config –n nlk  
Rd2

NLK 部署的狀態應為 Running(運行中),並且 nginx-hosts 中應已定義 URL。該 URL 是外部負載平衡器的 NGINX Plus API 端點。至此,NLK Controller 已成功部署,外部負載平衡器可以隨時將流量路由至整合。

最後一步是部署一個 Kubernetes Service 類型為 NodePort 的服務,以將 Kubernetes 整合暴露給 NGINX Plus。

$ kubectl apply –f nodeport.yaml 

關於 NodePort Service 清單,有以下幾點需要注意。在配置 NLK 部署時,必須正確填寫第 7 行和第 14 行的欄位,才能正確配置外部負載平衡器:

  • nginxinc.io/nklcluster 註解:
    此欄位需要對應到您的特定整合。
  • 與 NGINX Plus 配置中 upstream 區塊定義相匹配的端口名稱
    端口名稱需與 kube_lb.conf 檔案中的第 42 行一致,並以 nkl- 作為前綴。
apiVersion: v1 
kind: Service 
metadata: 
  name: nginx-ingress 
  namespace: nginx-ingress 
  annotations: 
    nginxinc.io/nlk-cluster1-https: "http"   # Must be added 
spec: 
  type: NodePort  
  ports: 
  - port: 443 
    targetPort: 443 
    protocol: TCP 
    name: nlk-cluster1-https 
  selector: 
    app: nginx-ingress  

應用服務后,您需要記下分配的節點端口,選擇 NGINX Ingress Controller 部署。 在本例中,節點端口為 32222。

$ kubectl get svc –o wide –n nginx-ingress
		
NAME            TYPE       CLUSTER-IP   PORT(S)          SELECTOR

nginx-ingress   NodePort   x.x.x.x      443:32222/TCP    app=nginx-ingress

如果重新連接到NGINX Pus儀表板,則上游選項卡中應填入Kubernetes整合的worker節點IP,並與nginx-ingress Service (32222)的節點連接端口相符。

Screenshot 2024 04 16 At 8.17.48 Am

您可以列出整合的節點 IP,並確保它們與儀表板中 upstream 選項卡所顯示的 IP 一致。

 $ kubectl get nodes -o wide | awk '{print $6}' 

INTERNAL-IP 

10.224.0.6 
10.224.0.5 
10.224.0.4

現在可以從本地計算機連線到 Kubernetes 應用了。在我們的示例中,使用的主機名稱(cafe.example.com)應解析為 NGINX Plus 負載平衡器的 IP 位址。

Rd4

結語

大多數在生產環境中部署Kubernetes 的企業都會安裝一個Ingress 控制器。

問題擴展其 Kubernetes 部署。

  • 適用於混合式環境(尤其是本地環境)
  • 容量規劃資訊可避免大規模流量帶來的瓶頸問題
  • 不僅具備TCP負載平衡服務的企業負載平衡功能

在本系列文章的下一篇中,我將更詳細地介紹第三點,並探討 NGINX Plus 的零信任實例,幫助您增強混合模式的安全防護。

文章來源:DevCentral