monitoreo de clúster k8s despliegue de cadvisor+prometheus+grafana

Tabla de contenido

1. Cree un nuevo monitor de espacio de nombres

2. Despliegue

2.1 desplegar cadvisor

2.2 implementar node_exporter

2.3 desplegar prometeo

2.4 Implementar permisos rbac

2.5 Implementar métricas

2.6 desplegar grafana

3. Efecto de monitoreo de prueba


Artículo de referencia:

despliegue de clúster k8s cadvisor+node-exporter+prometheus+grafana sistema de monitoreo - cyh00001 - 博客园

Preparación:

Introducción al nodo de clúster de clúster:

maestro: 192.168.136.21 (todos los siguientes pasos se realizan en este nodo)

trabajador:192.168.136.22

trabajador:192.168.136.23

##Confusión de sangría de vim, en el modo de dos puntos, :set paste ingresa al modo de pegado, :set nopaste sale del modo de pegado (predeterminado). ##

1. Cree un nuevo monitor de espacio de nombres

kubectl crear monitor ns

Tire de la imagen de cadvisor, porque la imagen oficial está en la imagen de Google y no se puede acceder a ella en China. Uso la imagen de otra persona aquí, simplemente sáquela directamente, tenga en cuenta que el nombre de la imagen es lagoudocker/cadvisor:v0.37.0.

docker pull lagoudocker/cadvisor:v0.37.0 

2. Despliegue

Cree un nuevo directorio /opt/cadvisor_prome_gra, hay muchos archivos de configuración, así que cree un nuevo directorio por separado.

2.1 desplegar cadvisor

Implemente el recurso DaemonSet de cadvisor.El recurso DaemonSet puede garantizar que cada nodo en el clúster ejecute el mismo conjunto de pods, e incluso los nodos recién agregados crearán automáticamente los pods correspondientes.

 vim case1-daemonset-deploy-cadvisor.yaml

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: cadvisor
  namespace: monitor
spec:
  selector:
    matchLabels:
      app: cAdvisor
  template:
    metadata:
      labels:
        app: cAdvisor
    spec:
      tolerations:    #污点容忍,忽略master的NoSchedule
        - effect: NoSchedule
          key: node-role.kubernetes.io/master
      hostNetwork: true
      restartPolicy: Always   # 重启策略
      containers:
      - name: cadvisor
        image: lagoudocker/cadvisor:v0.37.0
        imagePullPolicy: IfNotPresent  # 镜像策略
        ports:
        - containerPort: 8080
        volumeMounts:
          - name: root
            mountPath: /rootfs
          - name: run
            mountPath: /var/run
          - name: sys
            mountPath: /sys
          - name: docker
            mountPath: /var/lib/containerd
      volumes:
      - name: root
        hostPath:
          path: /
      - name: run
        hostPath:
          path: /var/run
      - name: sys
        hostPath:
          path: /sys
      - name: docker
        hostPath:
          path: /var/lib/containerd

kubectl apply -f case1-daemonset-deploy-cadvisor.yaml

kubectl get pod -n monitor -owide consulta

Debido a que hay tres nodos, habrá tres pods. Si se agrega un nodo trabajador más tarde, DaemonSet lo agregará automáticamente. 

cadvisor de prueba  <masterIP>:<8080>

2.2 implementar node_exporter

Implemente el recurso DaemonSet y el recurso de servicio de node-exporter.

vim case2-daemonset-deploy-node-exportador.yaml

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: node-exporter
  namespace: monitor
  labels:
    k8s-app: node-exporter
spec:
  selector:
    matchLabels:
        k8s-app: node-exporter
  template:
    metadata:
      labels:
        k8s-app: node-exporter
    spec:
      tolerations:
        - effect: NoSchedule
          key: node-role.kubernetes.io/master
      containers:
      - image: prom/node-exporter:v1.3.1 
        imagePullPolicy: IfNotPresent
        name: prometheus-node-exporter
        ports:
        - containerPort: 9100
          hostPort: 9100
          protocol: TCP
          name: metrics
        volumeMounts:
        - mountPath: /host/proc
          name: proc
        - mountPath: /host/sys
          name: sys
        - mountPath: /host
          name: rootfs
        args:
        - --path.procfs=/host/proc
        - --path.sysfs=/host/sys
        - --path.rootfs=/host
      volumes:
        - name: proc
          hostPath:
            path: /proc
        - name: sys
          hostPath:
            path: /sys
        - name: rootfs
          hostPath:
            path: /
      hostNetwork: true
      hostPID: true
---
apiVersion: v1
kind: Service
metadata:
  annotations:
    prometheus.io/scrape: "true"
  labels:
    k8s-app: node-exporter
  name: node-exporter
  namespace: monitor
spec:
  type: NodePort
  ports:
  - name: http
    port: 9100
    nodePort: 39100
    protocol: TCP
  selector:
    k8s-app: node-exporter

 kubectl obtener pod-n monitor

 

 Verifique los datos del exportador de nodos, preste atención al puerto 9100, <nodeIP>:<9100>

2.3 desplegar prometeo

Los recursos de Prometheus incluyen recursos de ConfigMap, recursos de implementación y recursos de servicio.

vim case3-1-prometheus-cfg.yaml

---
kind: ConfigMap
apiVersion: v1
metadata:
  labels:
    app: prometheus
  name: prometheus-config
  namespace: monitor 
data:
  prometheus.yml: |
    global:
      scrape_interval: 15s
      scrape_timeout: 10s
      evaluation_interval: 1m
    scrape_configs:
    - job_name: 'kubernetes-node'
      kubernetes_sd_configs:
      - role: node
      relabel_configs:
      - source_labels: [__address__]
        regex: '(.*):10250'
        replacement: '${1}:9100'
        target_label: __address__
        action: replace
      - action: labelmap
        regex: __meta_kubernetes_node_label_(.+)
    - job_name: 'kubernetes-node-cadvisor'
      kubernetes_sd_configs:
      - role:  node
      scheme: https
      tls_config:
        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
      bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
      relabel_configs:
      - action: labelmap
        regex: __meta_kubernetes_node_label_(.+)
      - target_label: __address__
        replacement: kubernetes.default.svc:443
      - source_labels: [__meta_kubernetes_node_name]
        regex: (.+)
        target_label: __metrics_path__
        replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor
    - job_name: 'kubernetes-apiserver'
      kubernetes_sd_configs:
      - role: endpoints
      scheme: https
      tls_config:
        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
      bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
      relabel_configs:
      - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
        action: keep
        regex: default;kubernetes;https
    - job_name: 'kubernetes-service-endpoints'
      kubernetes_sd_configs:
      - role: endpoints
      relabel_configs:
      - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape]
        action: keep
        regex: true
      - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme]
        action: replace
        target_label: __scheme__
        regex: (https?)
      - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path]
        action: replace
        target_label: __metrics_path__
        regex: (.+)
      - source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port]
        action: replace
        target_label: __address__
        regex: ([^:]+)(?::\d+)?;(\d+)
        replacement: $1:$2
      - action: labelmap
        regex: __meta_kubernetes_service_label_(.+)
      - source_labels: [__meta_kubernetes_namespace]
        action: replace
        target_label: kubernetes_namespace
      - source_labels: [__meta_kubernetes_service_name]
        action: replace
        target_label: kubernetes_service_name

Tenga en cuenta que el k8s-master en el archivo de configuración case3-2 debe cambiarse y no puede cambiarse a la IP del host local (se desconoce el motivo)

Configure el nodo 192.168.136.21 (k8s-master) como la ruta de almacenamiento de datos de Prometheus /data/prometheus.

vim case3-2-prometheus-deployment.yaml

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: prometheus-server
  namespace: monitor
  labels:
    app: prometheus
spec:
  replicas: 1
  selector:
    matchLabels:
      app: prometheus
      component: server
    #matchExpressions:
    #- {key: app, operator: In, values: [prometheus]}
    #- {key: component, operator: In, values: [server]}
  template:
    metadata:
      labels:
        app: prometheus
        component: server
      annotations:
        prometheus.io/scrape: 'false'
    spec:
      nodeName: k8s-master
      serviceAccountName: monitor
      containers:
      - name: prometheus
        image: prom/prometheus:v2.31.2
        imagePullPolicy: IfNotPresent
        command:
          - prometheus
          - --config.file=/etc/prometheus/prometheus.yml
          - --storage.tsdb.path=/prometheus
          - --storage.tsdb.retention=720h
        ports:
        - containerPort: 9090
          protocol: TCP
        volumeMounts:
        - mountPath: /etc/prometheus/prometheus.yml
          name: prometheus-config
          subPath: prometheus.yml
        - mountPath: /prometheus/
          name: prometheus-storage-volume
      volumes:
        - name: prometheus-config
          configMap:
            name: prometheus-config
            items:
              - key: prometheus.yml
                path: prometheus.yml
                mode: 0644
        - name: prometheus-storage-volume
          hostPath:
           path: /data/prometheusdata
           type: Directory

Crear sa y clusterrolebinding

kubectl crear cuenta de servicio monitor -n monitor

kubectl create clusterrolebinding monitor-clusterrolebinding -n monitor --clusterrole=cluster-admin --serviceaccount=monitor:monitor

kubectl apply -f case3-2-prometheus-deployment.yaml

 En el caso 3-2, hay un gran agujero en este paso. ¡Es posible usar "k8s-master", pero no usar "192.168.136.21"! La implementación y el pod no han podido levantarse. La verificación del registro del pod muestra que no se puede encontrar el host "192.168.136.21", y cambiar a "k8s-master" no funcionará. Todo estará bien después de unos días, y el la máquina se apagará durante el período. (razón desconocida)

 

vim case3-3-prometeo-svc.yaml

---
apiVersion: v1
kind: Service
metadata:
  name: prometheus
  namespace: monitor
  labels:
    app: prometheus
spec:
  type: NodePort
  ports:
    - port: 9090
      targetPort: 9090
      nodePort: 30090
      protocol: TCP
  selector:
    app: prometheus
    component: server

kubectl apply -f case3-3-prometheus-svc.yaml

2.4 Implementar permisos rbac

Incluyendo recursos secretos, recursos ServiceAccount, recursos ClusterRole y recursos ClusterRoleBinding, ServiceAccount es una cuenta de servicio, ClusterRole es una regla de permiso y ClusterRoleBinding es para vincular ServiceAccount y ClusterRole.

La información de autenticación de pod y apserver se define por secreto. Dado que la información de autenticación es información confidencial, debe almacenarse en el recurso secreto y montarse en el pod como un volumen de almacenamiento. De esta manera, la aplicación que se ejecuta en el Pod puede conectarse al servidor a través de la información en el secreto correspondiente y completar la autenticación.

La gestión de permisos de rbac es un conjunto de sistemas de autenticación de k8s. Lo anterior es solo una breve explicación. Para una comprensión más profunda, puede navegar: Autorización de rbac de k8s Mecanismo de seguridad del servidor API_Stupid child@GF Knowledge and action blog-CSDN blog_Which file is k8s rbac escrito en

vim case4-prom-rbac.yaml

apiVersion: v1
kind: ServiceAccount
metadata:
  name: prometheus
  namespace: monitor

---
apiVersion: v1
kind: Secret
type: kubernetes.io/service-account-token
metadata:
  name: monitor-token
  namespace: monitor
  annotations:
    kubernetes.io/service-account.name: "prometheus"
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: prometheus
rules:
- apiGroups:
  - ""
  resources:
  - nodes
  - services
  - endpoints
  - pods
  - nodes/proxy
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - "extensions"
  resources:
    - ingresses
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - configmaps
  - nodes/metrics
  verbs:
  - get
- nonResourceURLs:
  - /metrics
  verbs:
  - get
---
#apiVersion: rbac.authorization.k8s.io/v1beta1
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: prometheus
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: prometheus
subjects:
- kind: ServiceAccount
  name: prometheus
  namespace: monitor

kubectl apply -f case4-prom-rbac.yaml

2.5 Implementar métricas

Incluido el recurso de implementación, el recurso de servicio, el recurso de ServiceAccount, el recurso de ClusterRole, el recurso de ClusterRoleBinding.

¡Tenga en cuenta que se implementa en el sistema kube!

vim case5-kube-state-metrics-deploy.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: kube-state-metrics
  namespace: kube-system
spec:
  replicas: 1
  selector:
    matchLabels:
      app: kube-state-metrics
  template:
    metadata:
      labels:
        app: kube-state-metrics
    spec:
      serviceAccountName: kube-state-metrics
      containers:
      - name: kube-state-metrics
        image: registry.cn-hangzhou.aliyuncs.com/zhangshijie/kube-state-metrics:v2.6.0 
        ports:
        - containerPort: 8080

---
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: kube-state-metrics
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: kube-state-metrics
rules:
- apiGroups: [""]
  resources: ["nodes", "pods", "services", "resourcequotas", "replicationcontrollers", "limitranges", "persistentvolumeclaims", "persistentvolumes", "namespaces", "endpoints"]
  verbs: ["list", "watch"]
- apiGroups: ["extensions"]
  resources: ["daemonsets", "deployments", "replicasets"]
  verbs: ["list", "watch"]
- apiGroups: ["apps"]
  resources: ["statefulsets"]
  verbs: ["list", "watch"]
- apiGroups: ["batch"]
  resources: ["cronjobs", "jobs"]
  verbs: ["list", "watch"]
- apiGroups: ["autoscaling"]
  resources: ["horizontalpodautoscalers"]
  verbs: ["list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: kube-state-metrics
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: kube-state-metrics
subjects:
- kind: ServiceAccount
  name: kube-state-metrics
  namespace: kube-system

---
apiVersion: v1
kind: Service
metadata:
  annotations:
    prometheus.io/scrape: 'true'
  name: kube-state-metrics
  namespace: kube-system
  labels:
    app: kube-state-metrics
spec:
  type: NodePort
  ports:
  - name: kube-state-metrics
    port: 8080
    targetPort: 8080
    nodePort: 31666
    protocol: TCP
  selector:
    app: kube-state-metrics

 kubectl apply -f case5-kube-state-metrics-deploy.yaml

2.6 desplegar grafana

La interfaz gráfica de grafana está conectada a la fuente de datos de Prometheus, incluidos los recursos de implementación y los recursos de servicio.

vim grafana-enterprise.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: grafana-enterprise
  namespace: monitor
spec:
  replicas: 1
  selector:
    matchLabels:
      app: grafana-enterprise
  template:
    metadata:
      labels:
        app: grafana-enterprise
    spec:
      containers:
      - image: grafana/grafana
        imagePullPolicy: Always
        #command:
        #  - "tail"
        #  - "-f"
        #  - "/dev/null"
        securityContext:
          allowPrivilegeEscalation: false
          runAsUser: 0
        name: grafana
        ports:
        - containerPort: 3000
          protocol: TCP
        volumeMounts:
        - mountPath: "/var/lib/grafana"
          name: data
        resources:
          requests:
            cpu: 100m
            memory: 100Mi
          limits:
            cpu: 500m
            memory: 2500Mi
      volumes:
      - name: data
        emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
  name: grafana
  namespace: monitor
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 3000
    nodePort: 31000
  selector:
    app: grafana-enterprise

kubectl apply -f grafana-enterprise.yaml

Administrador de cuenta Administrador de contraseña

Agregue las fuentes de datos de la fuente de datos, denominada prometheus, preste atención al número de puerto 30090 .

 Agregue la plantilla 13332, también puede agregar otras plantillas, como: 14981, 13824, 14518.

Haga clic en el signo "+" a la izquierda y seleccione "importar" para importar la plantilla.

 Plantilla 13332

El número de plantilla de cadvisor es 14282. Aquí hay un error que no se ha resuelto. Puede monitorear los recursos de rendimiento de todos los contenedores en el clúster, pero si se selecciona uno de los contenedores, los datos no se pueden mostrar. (debe ser reparable).

 El ID del pod se muestra ahora, lo que no es conveniente para que el administrador navegue. Para mostrar el nombre del pod para mayor comodidad, seleccione el "Icono de configuración" en el lado derecho de la plantilla, seleccione "Variables", seleccione el segundo y cambie "nombre" a "pod" Eso es todo.

  Cada sección del tablero también debe cambiarse. Haga clic en el título de la sección, seleccione "Editar" y cambie "nombre" a "pod".

3. Efecto de monitoreo de prueba

Cree una nueva tarea de implementación denominada nginx01 para probar los resultados de la supervisión.

vim nginx01.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx01
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx01
  template:
    metadata:
      labels:
        app: nginx01
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9

 kubectl apply -f nginx01.yaml 

Aparecen dos nginx01 porque se establecieron 2 réplicas.

 Hasta el momento se ha completado el despliegue de la monitorización del clúster cadvisor+prometheus+grafana.

Supongo que te gusta

Origin blog.csdn.net/weixin_48878440/article/details/128374447
Recomendado
Clasificación