Tabla de contenido
1. Cree un nuevo monitor de espacio de nombres
3. Efecto de monitoreo de prueba
Artículo de referencia:
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.