zoukankan      html  css  js  c++  java
  • k8s监控etcd集群

    Kubernetes监控etcd集群

    一、监控etcd集群

    Kubernetes用operator部署prometheus,可以使用prometheus来监控自带metrics接口的应用。etcd是Kubernetes的数据库,自带接口,我们可以用etcd作为实例来看看怎么操作。

    二、安装方法1

    安装教程地址:https://blog.csdn.net/zuozewei/article/details/108365098

    2.1前言

    除了 Kubernetes 集群中的一些资源对象、节点以及组件需要监控,有的时候我们可能还需要根据实际的业务需求去添加自定义的监控项,添加一个自定义监控的步骤也是非常简单的,主要有以下三个步骤:

    l  第一步建立一个 ServiceMonitor 对象,用于 Prometheus 添加监控项;

    l  第二步为 ServiceMonitor 对象关联 metrics 数据接口的一个 Service 对象;

    l  第三步确保 Service 对象可以正确获取到 Metrics 数据;

    上面已经配置了 Kubernetes 集群监控 kube-prometheus 部署,但是并没有监控 ETCD 的信息,接下来我们就来为大家演示如何添加 ETCD 集群的监控。无论是 Kubernetes 集群外的还是使用 Kubeadm 安装在集群内部的 ETCD 集群,我们这里都将其视作集群外的独立集群,因为对于二者的使用方法没什么特殊之处。

    注意:ETCD 是 K8S 集群的核心组件,即数据库。

    2.2、查看 Etcd 信息

    1、获取 Etcd Pod 名称:

    $ kubectl get pods -n kube-system | grep etcd
    etcd-k8s-master.novalocal                      1/1     Running   0          17h

    2、查看 Etcd 描述信息:

    $ kubectl describe pod etcd-k8s-master.novalocal -n kube-system
    ......
    Containers:
      etcd:
        Container ID:  docker://4ac9ea30de1ea4e0f6f0be10069f7333dff492e17654484dcf11e9c7c73db28e
        Image:         registry.aliyuncs.com/k8sxio/etcd:3.4.3-0
        Image ID:      docker-pullable://registry.aliyuncs.com/k8sxio/etcd@sha256:4afb99b4690b418ffc2ceb67e1a17376457e441c1f09ab55447f0aaf992fa646
        Port:          <none>
        Host Port:     <none>
        Command:
          etcd
          --advertise-client-urls=https://172.16.106.200:2379
          --cert-file=/etc/kubernetes/pki/etcd/server.crt
          --client-cert-auth=true
          --data-dir=/var/lib/etcd
          --initial-advertise-peer-urls=https://172.16.106.200:2380
          --initial-cluster=k8s-master.novalocal=https://172.16.106.200:2380
          --key-file=/etc/kubernetes/pki/etcd/server.key
          --listen-client-urls=https://127.0.0.1:2379,https://172.16.106.200:2379
          --listen-metrics-urls=http://0.0.0.0:2381
          --listen-peer-urls=https://172.16.106.200:2380
          --name=k8s-master.novalocal
          --peer-cert-file=/etc/kubernetes/pki/etcd/peer.crt
          --peer-client-cert-auth=true
          --peer-key-file=/etc/kubernetes/pki/etcd/peer.key
          --peer-trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt
          --snapshot-count=10000
          --trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt
    ......
    

      

    我们可以看到启动参数里面有一个 --listen-metrics-urls=http://127.0.0.1:2381 的配置,该参数就是来指定 Metrics 接口运行在 2381 端口下面的,而且是 http 的协议,所以也不需要什么证书配置,这就比以前的版本要简单许多了,以前的版本需要用 https 协议访问,所以要配置对应的证书。

    2.3、创建 ServiceMonitor

    创建 Prometheus 监控资源,配置用于监控 ETCD 参数:

    $ vi prometheus-serviceMonitorEtcd.yaml
    

      

    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: 15s
      selector:
        matchLabels:
          k8s-app: etcd
      namespaceSelector:
        matchNames:
        - kube-system
    

      

    上面我们在 monitoring 命名空间下面创建了名为 etcd-k8s 的 ServiceMonitor 对象,基本属性和前面介绍的一致,匹配 kube-system 这个命名空间下面的具有 k8s-app=etcd 这个 label 标签的 Service,jobLabel 表示用于检索 job 任务名称的标签,由于 etcd 的 metrics 接口在 2381 端口下面,不需要 https 安全认证,所以用默认的配置即可。然后我们直接创建这个 ServiceMonitor 对象即可:

    kubectl apply -f prometheus-serviceMonitorEtcd.yaml

    2.4、创建 Service & Endpoints

    但实际上现在并不能监控到 ETCD 集群,因为并没有一个满足 ServiceMonitor 条件的 Service 对象与之关联:

    $ kubectl get svc -n kube-system -l k8s-app=etcd

    No resources found.

    因为 ETCD 是独立于集群之外的,所以我们需要创建一个 Endpoints 将其代理到 Kubernetes 集群,然后创建一个 Service 绑定 Endpoints,然后 Kubernetes 集群的应用就可以访问 ETCD 集群了。

    $ vi prometheus-etcdService.yaml
    

      

    apiVersion: v1
    kind: Service
    metadata:
      name: etcd-k8s
      namespace: kube-system
      labels:
        k8s-app: etcd
    spec:
      type: ClusterIP
      clusterIP: None  #设置为None,不分配Service IP
      ports:
      - name: port
        port: 2381
    ---
    apiVersion: v1
    kind: Endpoints
    metadata:
      name: etcd-k8s
      namespace: kube-system
      labels:
        k8s-app: etcd
    subsets:
    - addresses:
      - ip: 10.151.30.11   # 指定etcd节点地址,如果是集群则继续向下添加
        nodeName: etc-master
      ports:
      - name: port
        port: 2381         # Etcd 端口号
    

      

    我们这里创建的 Service 没有采用前面通过 label 标签的形式去匹配 Pod 的做法,因为前面我们说过很多时候我们创建的 ETCD 集群是独立于集群之外的,这种情况下面我们就需要自定义一个 Endpoints,要注意 metadata 区域的内容要和 Service 保持一致,Service 的 clusterIP 设置为 None,新版本的 etcd 将 metrics 接口数据放置到了 2381 端口。

    创建 Service & Endpoints:

    $ kubectl apply -f prometheus-etcdService.yaml
    

      

    $ kubectl get svc -n kube-system -l k8s-app=etcd
    NAME       TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE
    etcd-k8s   ClusterIP   None         <none>        2381/TCP   1m
    

      

    2.5、查看 Prometheus 规则

    上述配置完成后,隔一会儿去 Prometheus 的 Dashboard 中查看 targets,便会有 ETCD 的监控项了:

    可以看到有一个明显的错误,2381 端口链接被拒绝,这是因为我们这里的 ETCD 的 Metrics 接口是监听在 127.0.0.1 这个 IP 上面的,所以访问会拒绝:

    --listen-metrics-urls=http://127.0.0.1:2381

    我们只需要在 /etc/kubernetes/manifests/ 目录下面(静态 Pod 默认的目录)的 etcd.yaml 文件中将上面的 listen-metrics-urls 更改成节点 IP 即可:

    --listen-metrics-urls=http://0.0.0.0:2381

    修改完 ETCD 自动重启生效后,查看 ETCD 这个监控任务就正常了:

    2.6、Grafana 引入 ETCD 仪表盘

    完成 Prometheus 配置后,直接打开 Grafana 页面,引入 Dashboard ,输入编号 “3070” 的仪表盘:

    可以看到监控 ETCD 的各个看板:

    三、安装方法2

    1.1、查看接口信息

    二进制和kubeadm安装方式不同,他们etcd的存放证书位置也不同

    二进制

    [root@k8s-master01 ~]# curl --cert /opt/etcd/ssl/server.pem --key /opt/etcd/ssl/server-key.pem  https://10.0.0.34:2379/metrics -k
    # 这样也行
    curl -L http:// 10.0.0.34:2379/metrics
    kubeadm
    [root@k8s-master01 ~]# find / -name "etcd"
    /home/kubernetes/TLS/etcd
    curl --cert / /home/kubernetes/TLS/etcd/server.pem --key /home/kubernetes/TLS/etcd/server-key.pem  https:// 10.0.0.34:2379/metrics -k

     

    1.2、创建service和Endpoints

    创建ep和svc代理外部的etcd服务,其他自带metrics接口的服务也是如此!

    apiVersion: v1
    kind: Endpoints
    metadata:
      labels:
        app: etcd-k8s
      name: etcd-k8s
      namespace: kube-system
    subsets:
    - addresses:   
      - ip: 10.0.0.34
        nodeName: k8s-master01
      ports:
      - name: etcd-port
        port: 2379
        protocol: TCP
    - addresses:    
      - ip: 10.30.16.154
        nodeName: k8s-node01
      ports:
      - name: etcd-port
        port: 2379
        protocol: TCP
    - addresses:    
      - ip: 10.30.16.224
        nodeName: k8s-node02
      ports:
      - name: etcd-port
        port: 2379
        protocol: TCP
    ---
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app: etcd-k8s
      name: etcd-k8s
      namespace: kube-system
    spec:
      ports:
      - name: etcd-port
        port: 2379
        protocol: TCP
        targetPort: 2379
      type: ClusterIP
    

      

    1.3、测试是否代理成功

    #再次curl,把IP换成svc的IP测试,输出相同内容即创建成功

    [root@k8s-master01 ~]# kubectl get svc -n kube-system etcd-k8s
    NAME      TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
    etcd-ep   ClusterIP   10.0.0.118   <none>        2379/TCP   8m54s
    

     

    # 再次请求接口

    [root@k8s-master01 ~]#curl --cert /home/kubernetes/TLS/etcd/server.pem --key /home/kubernetes/TLS/etcd/server-key.pem  https://10.0.0.118:2379/metrics -k

    有上面测试数值,代表接口已经暴露出来,现在包证书挂载上去。

     

    1.4、创建secret

    # 1、这里我们k8s-master01节点进行创建,ca为k8sca证书,剩下2个为etcd证书,这是我证书所在位置

      cert-file: '/opt/etcd/ssl/server.pem'

      key-file: '/opt/etcd/ssl/server-key.pem'

      trusted-ca-file: '/opt/etcd/ssl/ca.pem'

     

    # 2、接下来我们需要创建一个secret,让prometheus pod节点挂载

    kubectl create secret generic etcd-ssl --from-file=/opt/etcd/ssl/ca.pem --from-file=/opt/etcd/ssl/server.pem --from-file=/opt/etcd/ssl/server-key.pem -n monitoring

    # 3、创建完成后可以检查一下

    [root@k8s-master01 prometheus-down]# kubectl describe secrets -n monitoring etcd-ssl
    Name:         etcd-ssl
    Namespace:    monitoring
    Labels:       <none>
    Annotations:  <none>
    Type:  Opaque
    Data
    ====
    ca.pem:   1367 bytes
    server-key.pem:  1679 bytes
    server.pem:      1509 bytes

    1.5、编辑prometheus,把证书挂载进去

    # 1、通过edit直接编辑prometheus 或者修改yaml文件

    [root@k8s-master01 ~]# kubectl edit prometheus k8s -n monitoring
    # 在replicas底下加上secret名称
    replicas:2
    secrets:
    - etcd-ssl #添加secret名称
    # 进入容器查看,就可以看到证书挂载进去了
    [root@k8s-master01 prometheus-down]# kubectl exec -it -n monitoring prometheus-k8s-0 /bin/sh
    # 查看文件是否存在
    /prometheus $ ls /etc/prometheus/secrets/etcd-ssl/
    ca.pem   server-key.pem  server.pem

    1.6、创建ServiceMonitor

     

     

    [root@k8s-master01 ~]# cat eprometheus-serviceMonitorEtcd.yaml
    apiVersion: monitoring.coreos.com/v1
    kind: ServiceMonitor
    metadata:
      name: etcd-k8s
      namespace: monitoring
      labels:
        app: etcd-k8s
    spec:
      jobLabel: app
      endpoints:
        - interval: 30s
          port: etcd-port  # 这个port对应 Service.spec.ports.name
          scheme: https
          tlsConfig:
            caFile: /etc/prometheus/secrets/etcd-ssl/ca.pem #证书路径 (在prometheus pod里路径)
            certFile: /etc/prometheus/secrets/etcd-ssl/server.pem
            keyFile: /etc/prometheus/secrets/etcd-ssl/server-key.pem
            insecureSkipVerify: true  # 关闭证书校验
      selector:
        matchLabels:
          app: etcd-k8s  # 跟scv的lables保持一致
      namespaceSelector:
        matchNames:
        - kube-system    # 跟svc所在namespace保持一致
    

      

    # 匹配Kube-system这个命名空间下面具有app=etcd-k8s这个label标签的Serve,job label用于检索job任务名称的标签。由于证书serverName和etcd中签发的证书可能不匹配,所以添加了insecureSkipVerify=true将不再对服务端的证书进行校验

    1.7、页面查看etcd节点都获取到数据

    此处数据获取有点慢,需要等待一下

    http://10.0.0.34:32104/targets

     

    1.8、grafana模板导入

    数据采集完成后,接下来可以在grafana中导入dashboard

    # 打开官网来的如下图所示,点击下载JSO文件

    grafana官网:https://grafana.com/grafana/dashboards/3070

    中文版ETCD集群插件:https://grafana.com/grafana/dashboards/9733

     

    Grafana页面地址:http://10.0.0.34:32102/d/mTemEyyizz/etcd-for-k8s-cnzhong-wen?orgId=1

    用户名admin密码K8s@#Prometh@#Def@u1t

     

    已经成功

     

  • 相关阅读:
    关于update set from,第一次碰到,汗!
    列表CheckBox全选 结合DataGrid 进行删除操作
    DataBinder.Eval的基本格式 效率 比较
    [转载](c#)数据结构与算法分析 栈与队列
    [转载]怎样设计递归算法
    Java httpclient.CloseableHttpClient跳过https证书验证
    LeetCode129求根节点到叶节点数字之和
    LeetCode117填充每个节点的下一个右侧节点指针 II
    LeetCode131分割回文串
    LeetCode130被围绕的区域
  • 原文地址:https://www.cnblogs.com/airen123/p/15438052.html
Copyright © 2011-2022 走看看