OpenResty XRay™ 自主部署版 (Azure Kubernetes Service)

概覽

xray-arch

OpenResty XRay 的架構設計採用了分散式部署模式。控制檯服務端執行在 Docker 容器中,由 Kubernetes 進行統一管理,而 Agent 端則部署在目標機器上,實現了靈活的監控和管理。

XRay 的服務端架構主要由兩個 Pods 組成,每個 Pod 中包含多個子服務:

  1. OpenResty XRay Console Pod:

    • xray-console: 提供 XRay 的 Web 管理介面,是使用者互動的主要入口
    • xray-console-pg: 作為 Web 服務的資料庫後端,儲存控制檯相關資料
  2. OpenResty XRay BuildBox Pod:

    • build-box-[dist]: 負責構建 XRay 工具的後端服務,其中 dist 表示對應的作業系統發行版
    • xray-tenant-db: 為 xray-console 服務和 build-box-[dist] 提供查詢介面,遵循 ‘私有庫 -> 公共庫’ 的查詢順序。注意:該服務僅向公共庫發起查詢請求,不會將資料上傳至公有庫
    • xray-tenant-db-pg: 作為客戶私有軟體資料庫的後端儲存

在接下來的部署示例中,我們將採用 Azure Disk 作為資料卷持久化解決方案,以確保資料的可靠性和永續性。

建立 Kubernetes 叢集

在安裝 OpenResty XRay 之前,如果您沒有在 Azure 上建立過 Kubernetes 叢集,需要先在 Azure 上建立一個 Kubernetes 叢集。您可以參考我們的影片教程(https://www.bilibili.com/video/BV13L41187MA),瞭解在 Azure 上建立 Kubernetes 叢集的詳細步驟。

叢集建立完畢後,請配置以下環境變數,這些變數將在後續步驟中使用:

export AZ_SUBSCRIPTION_ID=<AZ_SUBSCRIPTION_ID>
export AKS_CLUSTER_RESOURCE_GROUP=AKS
export AKS_NAME=xray-console

注意:AZ_SUBSCRIPTION_ID 請從 Kubernetes 叢集頁面上的 Subscription ID 項複製。

xray-sub-id

接下來,安裝 Azure 命令列工具 az,執行以下命令登入您的 Azure 賬戶:

az login --use-device-code

執行以下命令配置本機的 kubectl,使其可以連線到 Azure 上的 Kubernetes 叢集:

az aks get-credentials --resource-group $AKS_CLUSTER_RESOURCE_GROUP --name $AKS_NAME

完成以上步驟後,您就可以開始安裝 OpenResty XRay 了。

安裝 OpenResty XRay 控制檯服務

1. 硬體要求

為確保 OpenResty XRay 的順暢執行,請滿足以下硬體要求:

  • 基礎 Kubernetes 平臺
  • 儲存配置:
    • xray-console pod: 500Gi 硬碟
    • xray-console-pg pod: 1Ti 硬碟
    • tenant-db pod 中的 build-box 容器: 100Gi 硬碟
    • tenant-db pod 中的 tenant-db 容器: 50Gi 硬碟
    • tenant-db pod 中的 tenant-db-pg 容器: 50Gi 硬碟
  • 記憶體要求:每個容器至少分配 1GB 記憶體

注意事項:

  • 硬碟使用量參考:根據經驗,單臺 Agent 30 天的週期取樣資料增長量約為 10GB

2. 配置映象倉庫訪問憑證

為了確保 Kubernetes 叢集能夠訪問 OpenResty 映象倉庫,請按照以下步驟建立必要的名稱空間和 Secret:

  1. 建立專用名稱空間:
kubectl create ns openresty-xray
  1. 使用郵件提供的憑證建立 Docker 倉庫 Secret:
kubectl create secret docker-registry openresty-xray \
  --docker-server=registry.openresty.com.cn \
  --docker-username=<docker-registry username> \
  --docker-password=<docker-registry password> \
  -n openresty-xray

請確保將 <docker-registry username><docker-registry password> 替換為實際的使用者名稱和密碼。

3. 建立 console 證書 secret (可選)

如果需要使用自定義的證書,則需執行此步驟。如果跳過此步驟,console會使用內建的自簽證書。

將 XRay 服務端對應域名的證書放在 cert 目錄下

$ ls cert/
ssl.crt  ssl.key

使用以下命令建立 secret

kubectl create secret generic cert-secret --from-file=cert -n openresty-xray

找到 aks-kubernetes.yml 檔案的以下幾行, 去掉註釋即可使用自定義的證書

#- mountPath: /usr/local/orxray-console/conf/cert
#  name: cert
#  readOnly: true
...
volumes:
#- name: cert
#  secret:
#    secretName: cert-secret

aks-kubernetes.yml 檔案中的環境變數需要和證書中的域名一致

        - name: CONSOLE_HOST
          value: xxx.xx.com

4. 使用 Azure Disk 作為資料卷持久化方案

在部署服務端時,我們需要為某些元件提供持久化的資料儲存。本節將介紹如何使用 Azure Disk 來實現這一目標。

4.1 建立 Azure Disk

首先,我們需要建立幾個 Azure Disk 來儲存不同元件的資料。以下是建立過程的步驟說明:

  1. 設定環境變數

    在開始之前,請確保設定以下環境變數。如果您在之前的章節中已經配置過,可以跳過這一步。

    export AZ_SUBSCRIPTION_ID=<AZ_SUBSCRIPTION_ID>
    export AKS_CLUSTER_RESOURCE_GROUP=AKS
    export AKS_NAME=xray-console
    
  2. 配置磁碟大小

    為各個元件設定所需的磁碟大小(單位:GB):

    export ORXRAY_CONSOLE_DISK_SIZE=500
    export ORXRAY_CONSOLE_PG_DISK_SIZE=1024
    export ORXRAY_BUILDBOX_DISK_SIZE=100
    export ORXRAY_TENANT_DB_DISK_SIZE=50
    export ORXRAY_TENANT_DB_PG_DISK_SIZE=50
    

    注意:以上是推薦的磁碟大小,您可以根據實際需求進行調整。

  3. 獲取 AKS 節點資源組

    執行以下命令獲取 AKS 節點資源組的名稱:

    AKS_NODE_RESOURCE_GROUP=$(az aks show \
        --resource-group $AKS_CLUSTER_RESOURCE_GROUP \
        --name $AKS_NAME --query nodeResourceGroup -o tsv)
    
  4. 建立 Azure Disk

    使用以下命令為每個元件建立對應的 Azure Disk:

    # 建立 console 磁碟
    az disk create \
      --resource-group $AKS_NODE_RESOURCE_GROUP \
      --name orxray_console_disk \
      --size-gb $ORXRAY_CONSOLE_DISK_SIZE \
      --query id --output tsv
    
    # 建立 console-pg 磁碟
    az disk create \
      --resource-group $AKS_NODE_RESOURCE_GROUP \
      --name orxray_console_pg_disk \
      --size-gb $ORXRAY_CONSOLE_PG_DISK_SIZE \
      --query id --output tsv
    
    # 建立 build-box 磁碟
    az disk create \
      --resource-group $AKS_NODE_RESOURCE_GROUP \
      --name orxray_buildbox_disk \
      --size-gb $ORXRAY_BUILDBOX_DISK_SIZE \
      --query id --output tsv
    
    # 建立 tenant-db 磁碟
    az disk create \
      --resource-group $AKS_NODE_RESOURCE_GROUP \
      --name orxray_tenant_db_disk \
      --size-gb $ORXRAY_TENANT_DB_DISK_SIZE \
      --query id --output tsv
    
    # 建立 tenant-db-pg 磁碟
    az disk create \
      --resource-group $AKS_NODE_RESOURCE_GROUP \
      --name orxray_tenant_db_pg_disk \
      --size-gb $ORXRAY_TENANT_DB_PG_DISK_SIZE \
      --query id --output tsv
    

透過以上步驟,我們成功建立了所需的 Azure Disk,為各個元件提供了持久化儲存解決方案。

注:如需瞭解更多關於 Azure Disk 和 AKS 的資訊,請參考以下官方文件:

4.2 使用郵件附件中的 aks-kubernetes-pv.yml.sample 檔案

需要替換其中的 SUBSCRIPTION_IDAKS_NODE_RESOURCE_GROUP 為當前所使用的值。還可以根據建立硬碟的大小,修改對應的持久卷大小。

sed -i "s/<SUBSCRIPTION_ID>/$AZ_SUBSCRIPTION_ID/g" aks-kubernetes-pv.yml.sample
sed -i "s/<AKS_NODE_RESOURCE_GROUP>/$AKS_NODE_RESOURCE_GROUP/g" aks-kubernetes-pv.yml.sample
kubectl apply -f aks-kubernetes-pv.yml.sample

5. 部署服務端到 Kubernetes

完成前述準備工作後,我們可以開始將服務端部署到 Kubernetes 叢集中。這個過程非常直接:

  1. 準備部署檔案 使用郵件附件中提供的 aks-kubernetes.yml 檔案。這個檔案包含了所有必要的 Kubernetes 資源定義。

  2. 執行部署命令 在命令列中執行以下命令:

    kubectl apply -f aks-kubernetes.yml
    

    這個命令會根據 YAML 檔案中的配置,在 Kubernetes 叢集中建立或更新相應的資源。

  3. 驗證部署 部署完成後,可以使用 kubectl get pods 等命令檢查各個元件的執行狀態,確保所有 Pod 都已成功啟動。

    $ kubectl get pods -n openresty-xray
    
    NAME                             READY   STATUS    RESTARTS   AGE
    xray-console-9d4b7d8c9-wb855     2/2     Running   0          22m
    xray-tenant-db-886cfd856-gtpbc   10/10   Running   0          22m
    

6. 訪問服務

部署完成後,我們需要透過 Ingress 來暴露 xray-console 服務。以下是配置步驟和注意事項:

6.1 配置 Ingress

我們需要使用 Ingress 來暴露 xray-console 服務的 443 埠。對於詳細的配置指南,您可以參考 Azure 官方文件: 在 AKS 中使用應用程式路由

這裡也提供了一個用於驗證的 Ingress 配置示例:

注意: 此配置僅供測試使用,不建議在生產環境中使用 HTTP。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: xray-ingress
  namespace: openresty-xray
spec:
  ingressClassName: webapprouting.kubernetes.azure.com
  defaultBackend:
    service:
      name: xray-console
      port:
        number: 80

6.2 應用 Ingress 配置

  1. 將上述配置儲存為 ingress.yml 檔案。

  2. 執行以下命令應用配置:

    kubectl apply -f ingress.yml
    
  3. 驗證 Ingress 狀態:

    kubectl get ingress -n openresty-xray
    

    您將看到類似以下的輸出:

    NAME           CLASS                                HOSTS   ADDRESS         PORTS   AGE
    xray-ingress   webapprouting.kubernetes.azure.com   *       xx.xx.xx.xx     80      161m
    

6.3 訪問服務

使用 Ingress 的 ADDRESS 欄位中的 IP 地址訪問服務 http://xx.xx.xx.xx

如果您看到以下登入介面,則表示服務已成功部署:

xray-console-login

注意事項:

  • 在生產環境中,強烈建議配置 HTTPS 以確保通訊安全。
  • 可以考慮設定域名並配置相應的 DNS 記錄,以便更方便地訪問服務。

透過以上步驟,您應該能夠成功訪問部署的 xray-console 服務。如果遇到任何問題,請檢查 Ingress 配置和網路設定,或參考相關文件進行故障排查。

安裝 OpenResty XRay Agent 服務

XRay Agent 端執行在目標機器上,Agent 安裝後與自主部署的控制檯服務端進行通訊,而 Agent 安裝也是由控制檯服務端配合完成的:

在瀏覽器訪問控制端服務端後臺,使用郵件中提供的使用者名稱密碼來進行登入。登入後,可以看到安裝嚮導,及支援的作業系統,按照安裝嚮導的提示,進行 Agent 的安裝即可。

xray-console-agent

安裝 Agent 後可在左側 User 頁籤修改密碼及新增使用者。

日常運維

檢視服務 POD 狀態

$ kubectl get pods -n openresty-xray

NAME                             READY   STATUS    RESTARTS   AGE
xray-console-9d4b7d8c9-wb855     2/2     Running   0          22m
xray-tenant-db-886cfd856-gtpbc   10/10   Running   0          22m

控制檯服務日誌檢視

$ kubectl logs --tail=10 -n openresty-xray -l app=xray-console -c xray-console

檢查服務狀態

$ kubectl describe pod xray-console-5d457bb49d-q49f8 -n openresty-xray

服務升級

首先停止舊的 Pods,再啟動新的 Pods,等到新的 Pods 啟動成功後升級就成功了。 其中 aks-kubernetes-pods.yml 檔案在升級郵件的附件中提供。

$ kubectl delete -f aks-kubernetes-pods.yml
$ kubectl apply -f aks-kubernetes-pods.yml

在升級時,並不需要刪除舊的 PVC 和相應的 PV。因為 PV 是 RWO (讀-寫-一次性) 屬性的,如果 PVC 被刪除後,對應的 PV 也需要被刪除後再重建(這不會影響已經持久化的資料)。