第一部分:课前小菜:

image-20210425213550961

例子:
分布式:将多台Linux主机组合在一起,做成像一台主机一样来使用
微服务:将一台Linux主机拆分成多台Linux使用
淘宝:搜索页、商品详情页、订单页、支付页、物流、评论

淘宝:服装、手机数码、家纺、手表、房产

微服务:按照不同的功能、按照不同的业务拆分成多个模块,以至于某一个模块出问题不至于导致整站的不可用

image-20210425181506948

第二部分:普罗米修斯监控服务之-监控携带metric接口的服务

1.普罗米修斯监控分为两种:

​ 1、携带metric接口的服务

​ 2、不携带metric接口的服务

普罗米修斯监控携带metric接口的服务的流程

​ 1、通过EndPrints获取需要监控的ETCD的地址

​ 2、创建Service,给予集群内部的ServiceMoniter使用

​ 3、创建ServiceMoniter部署需要访问证书

​ 4、重启普罗米修斯监控Pod,载入监控项

2.携带metric接口的意义

携带metric接口的服务就表示可以通过metric接口获取服务的监控项和监控信息。本次课以ETCD作为载体。

3.测试ETCD服务的metrics接口

##如果出现一大堆东西代表metric接口正常携带
(curl -k允许连接到SSL站点而不需要证书(H))
curl -k --cert /etc/kubernetes/pki/apiserver-etcd-client.crt --key /etc/kubernetes/pki/apiserver-etcd-client.key https://127.0.0.1:2379/metrics
(简略的写一点)
# HELP promhttp_metric_handler_requests_total Total number of scrapes by HTTP status code.
# TYPE promhttp_metric_handler_requests_total counter
promhttp_metric_handler_requests_total{code="200"} 0
promhttp_metric_handler_requests_total{code="500"} 0
promhttp_metric_handler_requests_total{code="503"} 0


image-20210425182127434

4.关于端口的说明

[root@k8s-master-01 ~]# netstat -lntp | grep etcd
tcp        0      0 192.168.15.31:2379      0.0.0.0:*               LISTEN      2456/etcd           
tcp        0      0 127.0.0.1:2379          0.0.0.0:*               LISTEN      2456/etcd           
tcp        0      0 192.168.15.31:2380      0.0.0.0:*               LISTEN      2456/etcd           
tcp        0      0 127.0.0.1:2381          0.0.0.0:*               LISTEN      2456/etcd           
[root@k8s-master-01 ~]# 

5.关于ServiceMonitor的简介(非常重要)

Prometheus Operator默认的监控指标并不能完全满足实际的监控需求,这时候就需要我们自己根据业务添加自定义监控。添加一个自定义监控的步骤如下:
1、创建一个ServiceMonitor对象,用于Prometheus添加监控项
2、为ServiceMonitor对象关联metrics数据接口的Service对象
3、确保Services对象可以正确获取到metrics数据


ServiceMonitor通过标签筛选需要被监控的对象(k8s service),并且指定从它的哪个端口和url路径来拉取指标,并定义拉取操作的间隔时间。

ServiceMonitor本质是对 prometheus 配置中指标数据来源(endpoint)的抽象,每新建一个 service monitor 资源,prometheus operator 就会在自定义资源 promethues 的配置文件中添加相应的配置,以达到和使用原生 prometheus 相同的效果,这就把原来需要需要手动和统一配置的任务通过 crd 来自动化实现了。

第三部分:通过普罗米修斯监控ETCD(携带metric的一种类型)

1.流程梳理:普罗米修斯监控携带metric接口的服务的流程:

​ 1、通过EndPrints获取需要监控的ETCD的地址

​ 2、创建Service,给予集群内部的ServiceMoniter使用

​ 3、创建ServiceMoniter部署需要访问证书,给予prometheus-k8s-0来使用

​ 4、重启普罗米修斯监控Pod(prometheus-k8s-0),载入监控项

因为ETCD是携带metric接口的服务,所以会用上述流程。

2.通过EndPoints获取需要监控的ETCD的地址

[root@k8s-master-01 ~]# kubectl get pods -n kube-system
##可以看出etcd在kube-system这个空间内部
etcd-k8s-master-01   1/1     Running   11         31d


vim etcd_endpoints.yaml
kind: Endpoints
apiVersion: v1
metadata:
  namespace: kube-system
  name: etcd-moniter
  labels:
    k8s: etcd
subsets:
  - addresses:
      - ip: "192.168.12.31"
    ports:
      - port: 2379
        protocol: TCP
        name: etcd
        
##部署etcd_endpoints.yaml
[root@k8s-master-01 ~]# mkdir etcd
[root@k8s-master-01 ~]# cd etcd/
[root@k8s-master-01 etcd]# ls
[root@k8s-master-01 etcd]# vim etcd_endpoints.yaml
[root@k8s-master-01 etcd]# kubectl apply -f etcd_endpoints.yaml 
endpoints/etcd-moniter created

##得到etcd的ip和端口
[root@k8s-master-01 etcd]# kubectl get  endpoints -n kube-system
NAME                                              ENDPOINTS                                                                 AGE

etcd-moniter                                      192.168.12.31:2379                                                        109s

3.创建Service,给予集群内部的ServiceMoniter使用

kind: Service
apiVersion: v1
metadata:
  namespace: kube-system
  name: etcd-moniter       ###重要:必须和上面的name名称保持一致因为endpoints的名称来源于service
  labels:
    k8s: etcd     
spec:
  ports:
    - port: 2379
      targetPort: 2379
      name: etcd
      protocol: TCP
      
      
      


4.创建Service,给予集群内部的ServiceMoniter使用

kind: Service
apiVersion: v1
metadata:
  namespace: kube-system
  name: etcd-moniter       ###重要:必须和上面的name名称保持一致因为endpoints的名称来源于service
  labels:
    k8s: etcd
spec:
  ports:
    - port: 2379
      targetPort: 2379
      name: etcd
      protocol: TCP
      
##部署Service
root@k8s-master-01 etcd]# vim etcd_service.yaml

[root@k8s-master-01 etcd]# kubectl apply -f etcd_service.yaml 
service/etcd-moniter created
[root@k8s-master-01 etcd]# kubectl get svc -n kube-system
NAME           TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                        AGE
etcd-moniter   ClusterIP   10.110.31.122   <none>        2379/TCP                       18s     
     
     
##测试service创建成功与否(报错待解决)



[root@k8s-master-01 etcd]# kubectl get svc -n kube-system
NAME           TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                        AGE
etcd-moniter   ClusterIP   10.96.144.71   <none>        2379/TCP                       4s
kube-dns       ClusterIP   10.96.0.10     <none>        53/UDP,53/TCP,9153/TCP         31d
kubelet        ClusterIP   None           <none>        10250/TCP,10255/TCP,4194/TCP   39h
[root@k8s-master-01 etcd]# curl -k  --cert /etc/kubernetes/pki/apiserver-etcd-client.crt  --key /etc/kubernetes/pki/apiserver-etcd-client.key https://10.96.144.71:2379/metrics
curl: (7) Failed connect to 10.96.144.71:2379; 拒绝连接

找到问题的原因了:
1.endpoints 后来发现没有部署(这个很奇怪,我明明部署了了)
2.在创建Endpoints时候,我把etcd的ip地址写成老师的机子上的了。错了。



5.创建ServiceMoniter部署需要访问证书

image-20210425202822915

##就是这个Endpoints的ports的name

image-20210425202847468

image-20210425203229723

###重要点:ServiceMonitor是给prometheus-k8s-0来使用的。而后者就在namespace: monitoring中,所以写namespace: monitoring

[root@k8s-master-01 etcd]# vi etcd_servicemonitor.yaml
kind: ServiceMonitor
apiVersion: monitoring.coreos.com/v1
metadata:
  labels:
    k8s: etcd
  name: etcd-monitor
  namespace: monitoring  
spec:
  endpoints:
  - interval: 3s
    port: etcd
    scheme: https
    tlsConfig:
      caFile: /etc/prometheus/secrets/etcd-certs/ca.crt
      certFile: /etc/prometheus/secrets/etcd-certs/peer.crt
      keyFile: /etc/prometheus/secrets/etcd-certs/peer.key
      insecureSkipVerify: true                ##相当于curl -k 选项,关闭禁用目标证书 打开
  selector:
    matchLabels:
      k8s: etcd                              ###这个只能选用Endpoints的标签
  namespaceSelector:       ###空间选择器。这些endpoints里的东西都是kube-system里的,所以这样选用
    matchNames:               
      - "kube-system"                           
      
      
 ###检测结果查找servicemonitor
[root@k8s-master-01 etcd]# kubectl get servicemonitor -n monitoring
NAME                      AGE

etcd-monitor              38s

6.重启普罗米修斯监控Pod(prometheus-k8s-0),载入监控项

##主要是创建这一步来的:

secrets:

- etcd-certs
kind: Prometheus
apiVersion: monitoring.coreos.com/v1
metadata:
  labels:
    prometheus: k8s
  name: k8s
  namespace: monitoring
spec:
  alerting:
    alertmanagers:
      - name: alertmanager-main
        namespace: monitoring
        port: web
      - name: alertmanager-main-etcd
        namespace: kube-system
        port: etcd
  image: quay.io/prometheus/prometheus:v2.15.2
  nodeSelector:
    kubernetes.io/os: linux
  podMonitorNamespaceSelector: {}
  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.15.2
  secrets:
    - etcd-certs

7.创建一个secrets:用来保存prometheus监控的etcd的证书

##用命令行的格式创建secret,因为这个secrets是用给prometheus的,它在monitoring空间,所以指定在这个空间里
kubectl create secret generic etcd-certs -n monitoring --from-file=/etc/kubernetes/pki/etcd/ca.crt --from-file=/etc/kubernetes/pki/etcd/peer.crt --from-file=/etc/kubernetes/pki/etcd/peer.key
secret/etcd-certs created

8.再创建好证书的基础上开始部署prometheus并测试

[root@k8s-master-01 etcd]# kubectl apply -f prometheus.yaml 
prometheus.monitoring.coreos.com/k8s configured


[root@k8s-master-01 etcd]# kubectl get pods -n monitoring
##测试成功
NAME                                   READY   STATUS    RESTARTS   AGE

prometheus-k8s-0                       3/3     Running   1          2m4s
prometheus-k8s-1                       3/3     Running   1          2m14s

9.测试是否监控成功

image-20210425211450728

10.加入Grafana

image-20210425211527036

Logo

更多推荐