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 也需要被删除后再重建(这不会影响已经持久化的数据)。