使用kube-aws创建的集群将etcd通过prometheus的服务发现进行检测,并获取指标
无法删除标题
目标
-
- kube-aws使っててちょっとわかる(なのでawsとkubernetesも当然)
-
- prometheus使っててちょっとわかる(kubernetesで運用してるとなお好都合)
- etcdのメトリクス取りたい!(いなさそう)
目录
-
- 检测etcd实例
-
- 获取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](https://cdn.silicloud.com/blog-img/blog/img/657d52d337434c4406ccde05/10-0.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](https://cdn.silicloud.com/blog-img/blog/img/657d52d337434c4406ccde05/35-0.png)
![ccc.jpg](https://cdn.silicloud.com/blog-img/blog/img/657d52d337434c4406ccde05/36-0.jpeg)
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不太熟悉,如果有任何错误,请谅解。