使用ADOT Collector将指标发送到Amazon Managed Prometheus,然后在Amazon Managed Grafana中查看这些指标
我在实际测试中使用了AWS Distro for OpenTelemetry的Amazon EKS插件来收集指标和跟踪,并确认了指标收集部分。
想做的事情
创建一个与此AWS博客上所述配置相似的设置,无需在EKS内创建Prometheus,而是将指标发送到托管的Prometheus,并使用Amazon Managed Grafana查看指标。
前提条件
需要满足以下条件。
-
- 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的组件执行(见下图)。
根据由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中查看。
确认动作
附录:准备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的使用,我参考了这个网站。由于参考的网站非常详细,所以我省略了设置方法。