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