在本篇文章中,我们将演示如何使用 AWS CLI 在 ECS Fargate 上部署 SkyWalking OAP Server,并利用 AWS 服务发现为 gRPC 流量提供一个静态入口点。这样,客户端就可以通过服务发现名称访问 gRPC 服务。以下是详细步骤:

1. 注册任务定义

创建一个名为 dev-skywalking-oap-server-task.json 的文件,内容如下:

{
  "family": "dev-skywalking-oap-server-task",
  "executionRoleArn": "ecsTaskExecutionRole",
  "networkMode": "awsvpc",
  "containerDefinitions": [
    {
      "name": "dev-skywalking-oap-server",
      "image": "apache/skywalking-oap-server:9.1.0",
      "portMappings": [
        {
          "containerPort": 11800,
          "hostPort": 11800,
          "protocol": "tcp"
        },
        {
          "containerPort": 12800,
          "hostPort": 12800,
          "protocol": "tcp"
        },
        {
          "containerPort": 1234,
          "hostPort": 1234,
          "protocol": "tcp"
        }
      ],
      "environment": [
        {
          "name": "SW_ES_USER",
          "value": "app-sw"
        },
        {
          "name": "SW_ES_PASSWORD",
          "value": "123456"
        },
        {
          "name": "SW_CORE_RECORD_DATA_TTL",
          "value": "7"
        },
        {
          "name": "SW_CORE_METRICS_DATA_TTL",
          "value": "7"
        },
        {
          "name": "SW_STORAGE",
          "value": "elasticsearch"
        },
        {
          "name": "SW_STORAGE_ES_CLUSTER_NODES",
          "value": "vpc-app-sw-3q8e4v5yyhgfs6mpqvd36gasdu.us-east-1.es.amazonaws.com:443"
        },
        {
          "name": "SW_STORAGE_ES_HTTP_PROTOCOL",
          "value": "https"
        },
        {
          "name": "SW_PROMETHEUS_FETCHER",
          "value": "default"
        },
        {
          "name": "SW_TELEMETRY",
          "value": "prometheus"
        },
        {
          "name": "SW_AUTHENTICATION",
          "value": "fNgxjdDoMdh5"
        }
      ],
      "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
          "awslogs-create-group": "true",
          "awslogs-group": "/ecs/dev-skywalking-oap-server",
          "awslogs-region": "us-east-1",
          "awslogs-stream-prefix": "ecs"
        }
      }
    }
  ],
  "requiresCompatibilities": [
    "FARGATE"
  ],
  "cpu": "1024",
  "memory": "2048"
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.

首先,我们需要注册一个任务定义,示例任务定义文件为 dev-skywalking-oap-server-task.json。执行以下命令:

aws ecs register-task-definition --cli-input-json file://dev-skywalking-oap-server-task.json
  • 1.

这将返回新创建的任务定义 ARN,例如:arn:aws:ecs:us-east-1:123456789012:task-definition/dev-skywalking-oap-server-task:1。请记录下这个 ARN。

2. 创建 ECS 服务发现命名空间

使用以下命令创建一个 ECS 服务发现命名空间:

aws servicediscovery create-private-dns-namespace\
  --name skywalking-oap.local \
  --vpc <your-vpc-id>
  • 1.
  • 2.
  • 3.

记录返回的 OperationId,并使用以下命令查看命名空间创建状态:

aws servicediscovery get-operation --operation-id<operation-id>
  • 1.

等待状态变为 SUCCESS。然后记录返回的 Service 值,这是您的服务发现命名空间 ARN,例如:arn:aws:servicediscovery:us-east-1:123456789012:namespace/ns-abcdef0123456789

3. 创建 ECS 服务

创建一个名为 dev-skywalking-oap-server-service.json 的文件,内容如下:

{
  "cluster": "<your-ecs-cluster-name>",
  "serviceName": "dev-skywalking-oap-server-service",
  "taskDefinition": "<your-task-definition-arn>",
  "desiredCount": 1,
  "deploymentConfiguration": {
    "maximumPercent": 200,
    "minimumHealthyPercent": 100
  },
  "launchType": "FARGATE",
  "schedulingStrategy": "REPLICA",
  "networkConfiguration": {
    "awsvpcConfiguration": {
      "subnets": [
        "<your-subnet-id-1>",
        "<your-subnet-id-2>"
      ],
      "securityGroups": [
        "<your-security-group-id>"
      ],
      "assignPublicIp": "DISABLED"
    }
  },
  "serviceRegistries": [
    {
      "registryArn": "<your-service-registry-arn>"
    }
  ]
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.

确保替换以下值:

  • <your-ecs-cluster-name>: 您的 ECS 集群名称
  • <your-task-definition-arn>: 您在步骤 1 中获取的任务定义 ARN
  • <your-subnet-id-1> 和 <your-subnet-id-2>: 您的 VPC 子网 ID
  • <your-security-group-id>: 您的安全组 ID,确保它允许访问端口 11800、12800 和 1234
  • <your-service-registry-arn>: 您在步骤 2 中获取的服务发现命名空间 ARN

使用以下命令创建服务:

aws ecs create-service --cli-input-json file://dev-skywalking-oap-server-service.json
  • 1.
4. 验证服务状态

执行以下命令以验证服务状态:

aws ecs describe-services--cluster <your-ecs-cluster-name> --services dev-skywalking-oap-server-service
  • 1.

当服务状态变为 RUNNING 时,表示任务已成功启动。

5. 配置客户端

对于 gRPC 流量,在客户端应用程序中,将 SkyWalking 代理或探针的 service-addr 设置为 dev-skywalking-oap-server-service.skywalking-oap.local:11800

例如,对于 Java 应用程序,修改 agent.config 文件:

service-addr=dev-skywalking-oap-server-service.skywalking-oap.local:11800
  • 1.

对于 HTTP 流量,将 Web UI 访问地址设置为 http://<your-service-ip>:1234

通过以上步骤,您已经成功在 ECS Fargate 上部署了 SkyWalking OAP Server,并利用了服务发现为 gRPC 流量提供了一个静态入口点。客户端可以通过服务发现名称访问 gRPC 服务。

请注意,在生产环境中,您可能需要采取额外的安全措施,例如使用 AWS 负载均衡器、配置 SSL/TLS 等。同时,也建议定期检查和更新 SkyWalking 版本,以获取最新的功能和安全更新。