使用kube-aws创建的集群将etcd通过prometheus的服务发现进行检测,并获取指标

无法删除标题

目标

    • kube-aws使っててちょっとわかる(なのでawsとkubernetesも当然)

 

    • prometheus使っててちょっとわかる(kubernetesで運用してるとなお好都合)

 

    etcdのメトリクス取りたい!(いなさそう)

目录

    1. 检测etcd实例

 

    1. 获取etcd指标

 

    其他等等

1. 发现etcd实例。

推理合理

由 kube-aws 创建的 Kubernetes 集群,etcd 实例与控制器独立,处于 Kubernetes 集群之外的状态(从外观上看是如此,所以应该是这样)。

通常情况下,在使用Kubernetes时,我们会使用service-discovery的kubernetes_sd_config来寻找要监控的资源。
但是,正如上面所述,由于etcd实例位于Kubernetes集群的外部,因此无法通过该方法进行发现。
而且,绝不会在创建集群后去查询etcd的IP并将其写入prometheus的配置文件中,这样的做法是绝对不允许的。
因此,我们将使用ec2_sd_config来发现etcd的实例。

如果什么都不做的话,会导致从Prometheus设置的用户/角色看到所有实例,并且会变得非常混乱,所以我们只关注所需的内容。
这一次,我们将使用带有kube-aws:role: etcd标签的实例,因为它们看起来很合适。

aaa.png

由于kube-aws的更改,可能会出现无法添加此标记的情况,所以自己添加原始标记也是一个好主意。(我不太清楚在cluster.yaml的描述中是否可以实现这样的操作)

如果发现了暂存实例,可以根据自己的环境添加条件。在我的情况下,我还添加了基于VPC的过滤条件。

解决這個問題的方式。

Please note that the given phrase “方法” can be translated into multiple options depending on the context. The above translation is one possible paraphrase.

我要在prometheus的配置文件config中添加一个类似的部分。

#scrape kube-aws etcd
- job_name: 'kube-aws-etcd'
  ec2_sd_configs:
    - region: ap-northeast-1
      port: 2379 #etcdのポート
  relabel_configs:
    - source_labels: [__meta_ec2_tag_kube_aws_role]
      regex: 'etcd'
      action: keep
    - source_labels: [__meta_ec2_vpc_id]
      regex: 'vpc-1234abcd'
      action: keep

获取etcd的指标数据

(Option 1)
理屈就是在逻辑上有理有据、合理合法的意思。

etcd默认会在/metrics上输出供Prometheus使用的指标。
因此通常情况下,只需访问检测到的实例的/metrics即可。
但这次我们遇到了一个困难,访问需要使用密钥和证书等。
(在翻译过程中我只是进行了不间断的尝试而没有查阅文档或代码,如有任何错误请谅解。总之,现在我们能够获取到它…)

这是在使用kube-aws创建集群时,通过kube-aws render credentials生成的(好像是这样)。

    • credentials/etcd-client-key.pem

 

    credentials/etcd-client.pem

使用。

Note: The given prompt is in Japanese, not Chinese. The provided paraphrase in Chinese translates to “使用” which means “to use” in English.

这些节点创建时似乎会放置在/etc/kubernetes/ssl/目录下,所以我觉得可以通过在prometheus容器中挂载卷来使用它们。
但我发现只有root用户拥有读取权限,所以我放弃了这个想法,选择了普通的secret创建方法。
或许以root身份启动prometheus的人可以通过挂载来使用这些节点。

途径

首先,关于秘密事项,我们将以上述的pem为例,进行Base64编码。

apiVersion: v1
kind: Secret
metadata:
  name: etcd-secret
  namespace: default
type: Opaque
data:
  etcd-client.pem: "kekkounagaidehogehogehogehoge"
  etcd-client-key.pem: "koitsumonagaidehogehogehogehoge"

我用类似这样的脚本创建了一个secret。

FILE="secret.yaml"
cat << EOF >>${FILE}
apiVersion: v1
kind: Secret
metadata:
  name: etcd-secret
  namespace: default
type: Opaque
data:
EOF
echo '  etcd-client.pem: "'$(/bin/cat credentials/etcd-client.pem | base64)\" >>${FILE}
echo '  etcd-client-key.pem: "'$(/bin/cat credentials/etcd-client-key.pem | base64)\" >>${FILE}

配置稍作修改

#scrape kube-aws etcd
- job_name: 'kube-aws-etcd'
  scheme: https
  tls_config:
    key_file: /mnt/ssl/etcd-client-key.pem #deploymentでmountするpathとsecretのdataのname
    cert_file: /mnt/ssl/etcd-client.pem #上に同じ
    insecure_skip_verify: true
  ec2_sd_configs:
    - region: ap-northeast-1
      port: 2379 #etcdのポート
  relabel_configs:
    - source_labels: [__meta_ec2_tag_kube_aws_role]
      regex: 'etcd'
      action: keep
    - source_labels: [__meta_ec2_vpc_id]
      regex: 'vpc-1234abcd'
      action: keep
    - action: labelmap
      regex: __meta_ec2_(.+)

我會添加這樣一個類似的東西。

提取与本次部署相关的部分,大致是这个样子的。

spec:
  template:
    spec:
      containers:
        - name: prometheus
          image: prom/prometheus:latest
          volumeMounts:
            - name: etcd-ssl-volume
              mountPath: /mnt/ssl/ #configと揃っていればなんでも
            - name: secrets-volume
      volumes:
        - name: etcd-ssl-volume
          secret:
            secretName: etcd-secret
            defaultMode: 420

不使用Kubernetes来运营Pod派或Prometheus的人应该采取适当的措施。

简而言之,您需要使用ec2_sd_config脚本查找实例,并使用etcd-client.pem和etcd-client-key.pem证书在:2379/metrics上访问即可。

bbb.png
ccc.jpg

1. 其他的一大堆

Explanation: This phrase can be translated as “a bunch of other things” or “a long list of other things” depending on the context.

这只能获取etcd的度量指标,而不能获取etcd实例的度量指标。
如果只是一些简单的CPU和内存度量指标,可以使用process_cpu_seconds_total或go_memstats_*,但如果这不够的话,就需要部署node-exporter等组件。
然而,目前必须在etcd实例启动后直接登录并安装、配置、限制访问等,这在实际操作中并不现实(而且我也不确定是否可行)。
正如之前所述,它位于Kubernetes集群之外,因此自然也无法到达守护程序集。

所以,在使用cloudwatch_exporter将cloudwatch的指标导入到prometheus中,或者如果使用grafana的话,可以直接将cloudwatch作为数据源,这些都是现实的选择。
(就像我之前提到的,暂时只用了一些CPU和内存的指标。)
如果在使用kube-aws创建集群时,etcd实例能够自动安装node-exporter的话就更好了…

如果我对kube-aws不太熟悉,如果有任何错误,请谅解。

广告
将在 10 秒后关闭
bannerAds