使用ADOT Collector将指标发送到Amazon Managed Prometheus,然后在Amazon Managed Grafana中查看这些指标

我在实际测试中使用了AWS Distro for OpenTelemetry的Amazon EKS插件来收集指标和跟踪,并确认了指标收集部分。

想做的事情

创建一个与此AWS博客上所述配置相似的设置,无需在EKS内创建Prometheus,而是将指标发送到托管的Prometheus,并使用Amazon Managed Grafana查看指标。

1655691812323.png

前提条件

需要满足以下条件。

    • EKSのクラスターのk8sバージョンが1.19以降

 

    • cert-managerを導入済み、かつversionが1.6未満

EKSのAddon Manager用のRBAC設定

此外,还需准备好Amazon Managed Prometheus和Amazon Managed Grafana。它们的准备方法已经在附录中说明(内容并不复杂)。

由于EKS是从1.19版本开始才能正常创建,因此可以省略这部分。至于RBAC,由于这里已经提供了相应的清单文件,你只需直接应用这个清单文件即可。

由于 cert-manager 提供了 Helm 可安装文件,建议在此处使用 Helm 安装。
https://cert-manager.io/docs/installation/helm/
由于我的环境中安装的是 1.7.0 版本,因此进行了降级操作。

$ helm list -n cert-manager
NAME        	NAMESPACE   	REVISION	UPDATED                             	STATUS  	CHART              	APP VERSION
cert-manager	cert-manager	1       	2022-02-04 11:26:40.968231 +0900 JST	deployed	cert-manager-v1.7.0	v1.7.0
$ helm upgrade -n cert-manager cert-manager jetstack/cert-manager --version v1.5.5
$ helm list -n cert-manager
NAME        	NAMESPACE   	REVISION	UPDATED                             	STATUS  	CHART              	APP VERSION
cert-manager	cert-manager	2       	2022-06-20 11:45:15.434281 +0900 JST	deployed	cert-manager-v1.5.5	v1.5.5

另外,在这里可以确认旧版的Chart。另外,新安装的用户在执行helm install时,请不要忘记添加–set installCRDs=true参数。

安装ADOT Addon

使用aws命令安装ADOT插件。

aws eks create-addon --addon-name adot --addon-version v0.45.0-eksbuild.1 --cluster-name $CLUSTER_NAME

执行后,将显示”status”: “CREATING”,请等待其变为ACTIVE(大约等待2、3分钟)。
以下是用于确认的命令。

aws eks describe-addon --addon-name adot --cluster-name $CLUSTER_NAME

另外,如果没有设置基于角色的访问控制(RBAC)的前提条件,则会出现以下错误。

        "status": "CREATE_FAILED",
        "addonVersion": "v0.45.0-eksbuild.1",
        "health": {
            "issues": [
                {
                    "code": "AccessDenied",
                    "message": "customresourcedefinitions.apiextensions.k8s.io \"opentelemetrycollectors.opentelemetry.io\" is forbidden: User \"eks:addon-manager\" cannot patch resource \"customresourcedefinitions\" in API group \"apiextensions.k8s.io\" at the cluster scope"
                }
            ]
        },

ADOT Collector的安装

收集指标的工作由称为ADOT Collector的组件执行(见下图)。

1655694115888.png

根据由OpenTelemetryController定义的信息,收集指标数据。这是一个自定义资源(在添加附加组件时安装)。

$ kubectl api-resources  | grep OpenTelemetryCollector
opentelemetrycollectors           otelcol,otelcols                       opentelemetry.io/v1alpha1                          true         OpenTelemetryCollector

在以下链接中公开了使用OpenTelemetryController定义的清单。
https://github.com/aws-observability/aws-o11y-recipes/blob/main/sandbox/eks-addon-adot/otel-collector-xray-prometheus-complete.yaml

据说在这个Manifest中,有一个名为Trace Pipeline的管道可以将追踪发送到AWS X-Ray,并且有一个名为Metrics Pipeline的管道可以将指标发送到Managed Prometheus。在查看内容时,发现了Prometheus的抓取配置。在原始博客中有一个有趣的描述。。

Prometheus接收器是一个用于替代Prometheus服务器的最小化替代方案,旨在从使用Prometheus客户端库进行仪表化的微服务中抓取指标。

据说,即使不使用Prometheus,也可以将指标发送到Managed Prometheus。

只要替换REGION和WORKSPACE,sed就可以正常运行。将AMP的Workspace ID设置为WORKSPACE。

wget https://raw.githubusercontent.com/aws-observability/aws-o11y-recipes/main/sandbox/eks-addon-adot/otel-collector-xray-prometheus-complete.yaml
sed -i "s/REGION/us-east-1/g" otel-collector-xray-prometheus-complete.yaml
sed -i "s/WORKSPACE/ws-xxxxx/g" otel-collector-xray-prometheus-complete.yaml

由于上述的清单文件中,kind字段的值为”OpenTelemetryCollector”,所以需要创建一个名为”aws-otel-eks”的命名空间,并部署opentelemetrycollector。

kubectl create ns aws-otel-eks
kubectl apply -f otel-collector-xray-prometheus-complete.yaml

部署完成后,资源会以以下方式显示出来。

$ kubectl get opentelemetrycollector.opentelemetry.io/observability -n aws-otel-eks
NAME            MODE         VERSION   AGE
observability   deployment   0.45.0    50s

然而,在这个时间点上,由于Manifest文件中未指定aws-otel-collector的ServiceAccount,导致Pod无法启动。

$ kubectl get all  -n aws-otel-eks
NAME                                         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
service/observability-collector              ClusterIP   10.100.232.27   <none>        2000/UDP   6m58s
service/observability-collector-headless     ClusterIP   None            <none>        2000/UDP   6m58s
service/observability-collector-monitoring   ClusterIP   10.100.7.243    <none>        8888/TCP   6m58s

NAME                                      READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/observability-collector   0/1     0            0           6m59s

NAME                                                DESIRED   CURRENT   READY   AGE
replicaset.apps/observability-collector-d4c8b8d6d   1         0         0       7m

因此,请根据此页面创建具备所需权限的ServiceAccount。
※由于忽略了辅助脚本,所以按照以下步骤进行,但可能更快的方式是运行辅助脚本。

eksctl create iamserviceaccount \
    --name aws-otel-collector \
    --namespace aws-otel-eks \
    --cluster ${CLUSTER_NAME} \
    --attach-policy-arn arn:aws:iam::aws:policy/AmazonPrometheusRemoteWriteAccess \
    --attach-policy-arn arn:aws:iam::aws:policy/AWSXrayWriteOnlyAccess \
    --attach-policy-arn arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy \
    --approve \
    --override-existing-serviceaccounts

“然而,在我的环境中,尽管不存在 ServiceAccount,但以下内容显示创建未成功。”

2022-06-20 16:22:00 [ℹ]  1 iamserviceaccount (aws-otel-eks/aws-otel-collector) was excluded (based on the include/exclude rules)
2022-06-20 16:22:00 [!]  metadata of serviceaccounts that exist in Kubernetes will be updated, as --override-existing-serviceaccounts was set
2022-06-20 16:22:00 [ℹ]  no tasks

在这种情况下,执行`eksctl delete iamserviceaccount`命令,然后再次创建,就可以成功。

这里是我们得到的结果。

$ kubectl get sa -n aws-otel-eks
NAME                      SECRETS   AGE
aws-otel-collector        1         88s
default                   1         31m
observability-collector   1         30m

创建ServiceAccount后,删除ReplicaSet,并促使重新创建Pod。

kubectl delete replicaset.apps/observability-collector-d4c8b8d6d 

ADOT Controller已经启动了。

$ kubectl get all  -n aws-otel-eks
NAME                                          READY   STATUS    RESTARTS   AGE
pod/observability-collector-d4c8b8d6d-8wjbt   1/1     Running   0          38s

NAME                                         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
service/observability-collector              ClusterIP   10.100.232.27   <none>        2000/UDP   32m
service/observability-collector-headless     ClusterIP   None            <none>        2000/UDP   32m
service/observability-collector-monitoring   ClusterIP   10.100.7.243    <none>        8888/TCP   32m

NAME                                      READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/observability-collector   1/1     1            1           32m

NAME                                                DESIRED   CURRENT   READY   AGE
replicaset.apps/observability-collector-d4c8b8d6d   1         1         1       42s

如果按照AWS博客中的图表所示,已经将指标传送至Managed Prometheus,并且应该可以从Managed Grafana中查看。

确认动作

1655717168849.png

附录:准备Amazon Managed Prometheus、Amazon Managed Grafana。

准备Amazon Managed Prometheus

只需访问AMP并在”创建工作场所”中创建即可。请注意,由于其仅具有指标存储功能,因此无法使用表达式浏览器。(我尝试访问/graph,但只返回了{“message”:null}。)

准备 Amazon 托管的Grafana

要使用Amazon Managed Grafana,需要使用AWS SSO或SAML。由于AWS SSO的门槛较高,我使用了Auth0的免费账户通过SAML进行了设置。关于SAML的使用,我参考了这个网站。由于参考的网站非常详细,所以我省略了设置方法。

1655716334404.png
1655716477174.png
广告
将在 10 秒后关闭
bannerAds