OpenResty XRay™ 自主部署版 (Azure Kubernetes Service)
概覽
OpenResty XRay 的架構設計採用了分散式部署模式。控制檯服務端執行在 Docker 容器中,由 Kubernetes 進行統一管理,而 Agent 端則部署在目標機器上,實現了靈活的監控和管理。
XRay 的服務端架構主要由兩個 Pods 組成,每個 Pod 中包含多個子服務:
OpenResty XRay Console
Pod:- xray-console: 提供 XRay 的 Web 管理介面,是使用者互動的主要入口
- xray-console-pg: 作為 Web 服務的資料庫後端,儲存控制檯相關資料
OpenResty XRay BuildBox
Pod:- build-box-[dist]: 負責構建 XRay 工具的後端服務,其中
dist
表示對應的作業系統發行版 - xray-tenant-db: 為
xray-console
服務和build-box-[dist]
提供查詢介面,遵循 ‘私有庫 -> 公共庫’ 的查詢順序。注意:該服務僅向公共庫發起查詢請求,不會將資料上傳至公有庫 - xray-tenant-db-pg: 作為客戶私有軟體資料庫的後端儲存
- build-box-[dist]: 負責構建 XRay 工具的後端服務,其中
在接下來的部署示例中,我們將採用 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 項複製。
接下來,安裝 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:
- 建立專用名稱空間:
kubectl create ns openresty-xray
- 使用郵件提供的憑證建立 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 來儲存不同元件的資料。以下是建立過程的步驟說明:
設定環境變數
在開始之前,請確保設定以下環境變數。如果您在之前的章節中已經配置過,可以跳過這一步。
export AZ_SUBSCRIPTION_ID=<AZ_SUBSCRIPTION_ID> export AKS_CLUSTER_RESOURCE_GROUP=AKS export AKS_NAME=xray-console
配置磁碟大小
為各個元件設定所需的磁碟大小(單位: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
注意:以上是推薦的磁碟大小,您可以根據實際需求進行調整。
獲取 AKS 節點資源組
執行以下命令獲取 AKS 節點資源組的名稱:
AKS_NODE_RESOURCE_GROUP=$(az aks show \ --resource-group $AKS_CLUSTER_RESOURCE_GROUP \ --name $AKS_NAME --query nodeResourceGroup -o tsv)
建立 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 的資訊,請參考以下官方文件:
aks-kubernetes-pv.yml.sample
檔案
4.2 使用郵件附件中的 需要替換其中的 SUBSCRIPTION_ID
和 AKS_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 叢集中。這個過程非常直接:
準備部署檔案 使用郵件附件中提供的
aks-kubernetes.yml
檔案。這個檔案包含了所有必要的 Kubernetes 資源定義。執行部署命令 在命令列中執行以下命令:
kubectl apply -f aks-kubernetes.yml
這個命令會根據 YAML 檔案中的配置,在 Kubernetes 叢集中建立或更新相應的資源。
驗證部署 部署完成後,可以使用
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 配置
將上述配置儲存為
ingress.yml
檔案。執行以下命令應用配置:
kubectl apply -f ingress.yml
驗證 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
。
如果您看到以下登入介面,則表示服務已成功部署:
注意事項:
- 在生產環境中,強烈建議配置 HTTPS 以確保通訊安全。
- 可以考慮設定域名並配置相應的 DNS 記錄,以便更方便地訪問服務。
透過以上步驟,您應該能夠成功訪問部署的 xray-console 服務。如果遇到任何問題,請檢查 Ingress 配置和網路設定,或參考相關文件進行故障排查。
安裝 OpenResty XRay Agent 服務
XRay Agent 端執行在目標機器上,Agent 安裝後與自主部署的控制檯服務端進行通訊,而 Agent 安裝也是由控制檯服務端配合完成的:
在瀏覽器訪問控制端服務端後臺,使用郵件中提供的使用者名稱密碼來進行登入。登入後,可以看到安裝嚮導,及支援的作業系統,按照安裝嚮導的提示,進行 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 也需要被刪除後再重建(這不會影響已經持久化的資料)。