暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Prometheus-operator监控外部etcd集群

ITBuf 2019-10-10
1768


标签: prometheus-operator 、 etcd 、监控 、 monitor


先决条件

  • 一个稳定的Kubernetes集群

  • 成功部署prometheus-operator

  • etcd在kubernets集群之外


原因

我们业务上面刚从自建的Kubernetes集群迁移到阿里云的专业版Kubernetes,很多地方有不一样的地方,之前自建的Kubernetes使用的是kubeadm的etcd集群,阿里云的专业版本使用的是外部的etcd集群,所以就有了这次记录。


技术点

  • 外部etcd没有endpoint

  • 外部etcd没有svc


操作

1. 获取etcd的客户端证书,并创建为secret

    [root@dev-rc-master-01 cert]# ps -aux |egrep '/usr/bin/etcd'
    root 1379 0.0 0.0 112724 992 pts/0 S+ 10:30 0:00 grep -E --color=auto usr/bin/etcd
    etcd 3222 4.8 6.7 11137048 537176 ? Ssl 725 1458:58 usr/bin/etcd --election-timeout=3000 --heartbeat-interval=500 --snapshot-count=50000 --data-dir=data.etcd --name 10.1.65.203-name-3 --client-cert-auth --trusted-ca-file=/var/lib/etcd/cert/ca.pem --cert-file=/var/lib/etcd/cert/etcd-server.pem --key-file=/var/lib/etcd/cert/etcd-server-key.pem --peer-client-cert-auth --peer-trusted-ca-file=/var/lib/etcd/cert/peer-ca.pem --peer-cert-file=/var/lib/etcd/cert/10.1.65.203-name-3.pem --peer-key-file=/var/lib/etcd/cert/10.1.65.203-name-3-key.pem --initial-advertise-peer-urls https://10.1.65.203:2380 --listen-peer-urls https://10.1.65.203:2380 --advertise-client-urls https://10.1.65.203:2379 --listen-client-urls https://10.1.65.203:2379 --initial-cluster 10.1.65.201-name-1=https://10.1.65.201:2380,10.1.65.202-name-2=https://10.1.65.202:2380,10.1.65.203-name-3=https://10.1.65.203:2380 --initial-cluster-state new --initial-cluster-token 7801f61a-7b1e-49fa-9657-e692e05e20b7
    复制


    从上面的结果来看,阿里云的部署集群etcd证书存储和kubeadm默认初始化的路径是不一样的,这里etcd证书存储在/var/lib/etcd/cert/下面,查看客户端的证书文件:

      [root@dev-rc-master-01 cert]# ls |egrep client
      etcd-client.csr
      etcd-client-key.pem
      etcd-client.pem
      复制

      创建monitoring命名空间下的secret

        [root@dev-rc-master-01 cert]#kubectl -n monitoring create secret generic etcd-certs --from-file=ca.pem --from-file=etcd-client-key.pem --from-file=etcd-client.pem
        复制

        如果是kubeadm初始化的etcd集群,默认是这三个文件:

          --cacert=/etc/kubernetes/pki/etcd/ca.crt
          --cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt
          --key=/etc/kubernetes/pki/etcd/healthcheck-client.key
          复制

          对应关系为:


          ca.crt  ->  ca.pem

          healthcheck-client.crt ->  etcd-client.pem

          healthcheck-client.key ->  etcd-client-key.pem



          查看创建好的secret

            [root@dev-rc-master-01 cert]# kubectl get -n monitoring secret|egrep etcd-certs
            etcd-certs Opaque 3 75m
            复制

            2.创建ServiceMonitor

              apiVersion: monitoring.coreos.com/v1
              kind: ServiceMonitor
              metadata:
              name: etcd-k8s
              namespace: monitoring
              labels:
              k8s-app: etcd-k8s
              spec:
              jobLabel: k8s-app
              endpoints:
              - port: port
              interval: 30s
              scheme: https
              tlsConfig:
              caFile: /etc/prometheus/secrets/etcd-certs/ca.pem
              certFile: /etc/prometheus/secrets/etcd-certs/etcd-client.pem
              keyFile: /etc/prometheus/secrets/etcd-certs/etcd-client-key.pem
              insecureSkipVerify: true
              selector:
              matchLabels:
              k8s-app: etcd
              namespaceSelector:
              matchNames:
              - kube-system
              复制

              创建一个serviceMonitor的对象,配置了基本数据元,拉取周期为30s,拉取方式为https,并且配置了证书,跳过http可信检查,匹配kube-system命名空间下的labels的key值为k8s-app,value值为etcd的svc。

                kubectl apply -f etcd-servicemonitor.yaml
                复制

                3.创建service

                  apiVersion: v1
                  kind: Service
                  metadata:
                  name: etcd-k8s
                  namespace: kube-system
                  labels:
                  k8s-app: etcd
                  spec:
                  type: ClusterIP
                  clusterIP: None
                  ports:
                  - name: port
                  port: 2379
                  protocol: TCP


                  ---
                  apiVersion: v1
                  kind: Endpoints
                  metadata:
                  name: etcd-k8s
                  namespace: kube-system
                  labels:
                  k8s-app: etcd
                  subsets:
                  - addresses:
                  - ip: 10.1.65.201
                  nodeName: cn-hangzhou.10.1.65.201
                  - ip: 10.1.65.202
                  nodeName: cn-hangzhou.10.1.65.202
                  - ip: 10.1.65.203
                  nodeName: cn-hangzhou.10.1.65.203
                  ports:
                  - name: port
                  port: 2379
                  protocol: TCP
                  复制

                  这里的service和以往的service不同,这里没用labels匹配pods,因为这里的etcd根本没有pods。这里有一个细节值得注意的就是endpoints,部分metadata的内容必须和service一致。下面的nodeName不能重复。这里别忘了应用:

                    kubectl apply -f etcd-service.yaml
                    复制

                    Prometheus挂载etcd的secret

                    prometheus-operator的的部署文件中有一个文件名为:prometheus-prometheus.yaml的文件.细节可以查看官方文档。

                      apiVersion: monitoring.coreos.com/v1
                      kind: Prometheus
                      metadata:
                      labels:
                      prometheus: k8s
                      name: k8s
                      namespace: monitoring
                      spec:
                      alerting:
                      alertmanagers:
                      - name: alertmanager-main
                      namespace: monitoring
                      port: web
                      baseImage: quay.io/prometheus/prometheus
                      nodeSelector:
                      beta.kubernetes.io/os: linux
                      secrets:
                      - etcd-certs
                      podMonitorSelector: {}
                      replicas: 2
                      resources:
                      requests:
                      memory: 400Mi
                      ruleSelector:
                      matchLabels:
                      prometheus: k8s
                      role: alert-rules
                      securityContext:
                      fsGroup: 2000
                      runAsNonRoot: true
                      runAsUser: 1000
                      serviceAccountName: prometheus-k8s
                      serviceMonitorNamespaceSelector: {}
                      serviceMonitorSelector: {}
                      version: v2.11.0
                      复制


                      这里17行的secrets是我们后来加的,默认的文件中是没有这个内容的.


                      应用部署prometheus


                        [root@dev-rc-master-01 manifests]# kubectl apply -f prometheus-prometheus.yaml
                        复制


                        登录prometheus的web页面查看配置



                        这个时候prometheus开始正常抓取etcd的数据了,我们接下来可以去下载一个现有的Grafana的dashboard,然后对他做一些自定义配置,就可以正常使用了.



                        导入以上这个dashbaord到grafana可以是直接在web界面导入,也可以通过生成ConfigMap来挂载到grafana,各有好处吧,不过configmap的方法,后期如果要修改比较麻烦毕竟要去看懂那么大的一个JSON文件。


                        总结:

                        • 在Prometheus-operator有很多和手动配置的Prometheus的地方有很多不同的,但是数量以后确实是简单了不少,一定要多看https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md这里的文档。

                        • 由于阿里云的etcd外部集群证书使用的是cfssl工具生成的和kubeadm的生成的在文件命名上面有差别,如果在prometheus的web界面上在Configuration中可以找到etcd的配置但是在Targets中没有,很有可能就是证书配置错误了,可以通过查看prometheus-k8s-01的容器查看日志,是否为etcd证书不可用的错误,如果是就可以定位到问题了

                        • 目前还没找到在Prmetheus对象中直接挂载本地时区文件,如果应用后想用东八区目前我是直接手动修改statefulsets.apps,缺点就是在应用了Prometheus对象后就又要重新修改一下<对应的文件名:prometheus-prometheus.yaml>


                        欢迎订阅分享

                        公众号:ITBUF

                        企鹅号:TSG技术分享

                        文章转载自ITBuf,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                        评论