En esta página, se muestra cómo configurar un clúster para GKE en Bare Metal a fin de que los registros y las métricas personalizados de las aplicaciones de usuario se envíen a Cloud Logging, Cloud Monitoring y servicio administrado para Prometheus.
Para obtener la mejor experiencia de registro y supervisión de aplicaciones de usuario, te recomendamos que uses la siguiente configuración:
A fin de habilitar Google Cloud Managed Service para Prometheus, configura
enableGMPForApplications
comotrue
en el objetoStackdriver
. Esta configuración te permite supervisar tus cargas de trabajo de forma global y generar alertas sobre ellas mediante Prometheus. Si quieres obtener instrucciones e información adicional, consulta Habilita el servicio administrado para Prometheus en esta página.A fin de habilitar Cloud Logging para las aplicaciones de los usuarios, configura
enableCloudLoggingForApplications
comotrue
en el objetoStackdriver
. Esta configuración proporciona registros para tus cargas de trabajo. Si deseas obtener instrucciones y más información, consulta Habilita Cloud Logging para las aplicaciones de usuario en esta página.Inhabilita Logging y Monitoring heredados para las aplicaciones de usuario si configuras
enableApplication
comofalse
en el recurso del clúster. Inhabilitar esta función evita que las métricas de la aplicación se recopilen dos veces. Sigue los pasos que se indican en Habilita Logging y Monitoring para las aplicaciones de usuario (heredados), pero estableceenableApplication
enfalse
, en lugar detrue
.
Habilita Managed Service para Prometheus
La configuración del servicio administrado para Prometheus se especifica en un objeto Stackdriver
llamado stackdriver
. Si deseas obtener información adicional, incluidas las prácticas recomendadas y la solución de problemas, consulta la documentación del servicio administrado para Prometheus.
Si deseas configurar el objeto stackdriver
a fin de habilitar Google Cloud Managed Service para Prometheus, haz lo siguiente:
Abre el objeto de Stackdriver para editarlo:
kubectl --kubeconfig=CLUSTER_KUBECONFIG \ --namespace kube-system edit stackdriver stackdriver
Reemplaza
CLUSTER_KUBECONFIG
por la ruta del archivo kubeconfig del clúster de administrador.En
spec
, configuraenableGMPForApplications
comotrue
:apiVersion: addons.gke.io/v1alpha1 kind: Stackdriver metadata: name: stackdriver namespace: kube-system spec: projectID: ... clusterName: ... clusterLocation: ... proxyConfigSecretName: ... enableGMPForApplications: true enableVPC: ... optimizedMetrics: true
Guarda y cierra el archivo editado.
Los componentes de Prometheus administrados por Google se inician de forma automática en el clúster en el espacio de nombres
gmp-system
.Verifica los componentes de Prometheus administrados por Google:
kubectl --kubeconfig=CLUSTER_KUBECONFIG --namespace gmp-system get pods
El resultado de este comando es similar al siguiente:
NAME READY STATUS RESTARTS AGE collector-abcde 2/2 Running 1 (5d18h ago) 5d18h collector-fghij 2/2 Running 1 (5d18h ago) 5d18h collector-klmno 2/2 Running 1 (5d18h ago) 5d18h gmp-operator-68d49656fc-abcde 1/1 Running 0 5d18h rule-evaluator-7c686485fc-fghij 2/2 Running 1 (5d18h ago) 5d18h
El servicio administrado para Prometheus admite la evaluación de reglas y las alertas. Para configurar la evaluación de reglas, consulta Evaluación de reglas.
Ejecuta una aplicación de ejemplo
El servicio administrado proporciona un manifiesto para una aplicación de ejemplo, prom-example
, que emite métricas de Prometheus en su puerto metrics
. La aplicación usa tres réplicas.
Para implementar la aplicación, haz lo siguiente:
Crea el espacio de nombres
gmp-test
para los recursos que crees como parte de la aplicación de ejemplo:kubectl --kubeconfig=CLUSTER_KUBECONFIG create ns gmp-test
Aplica el manifiesto de la aplicación con el siguiente comando:
kubectl -n gmp-test apply \ -f https://raw.githubusercontent.com/GoogleCloudPlatform/prometheus-engine/v0.4.1/examples/example-app.yaml
Configura un recurso PodMonitoring
En esta sección, configurarás un recurso personalizado PodMonitoring
a fin de capturar los datos de métricas emitidos por la aplicación de ejemplo y enviarlos al servicio administrado para Prometheus. El recurso personalizado PodMonitoring
usa la recopilación de objetivos. En este caso, los agentes recolectores extraen el extremo /metrics
al que la aplicación de muestra emite datos.
Un recurso personalizado PodMonitoring
recopila los objetivos del espacio de nombres en el que solo se implementa. Para recopilar objetivos en varios espacios de nombres, implementa el mismo recurso personalizado PodMonitoring
en cada espacio de nombres. Puedes verificar que el recurso PodMonitoring
esté instalado en el espacio de nombres deseado mediante la ejecución del siguiente comando:
kubectl --kubeconfig CLUSTER_KUBECONFIG get podmonitoring -A
Para ver la documentación de referencia sobre todos los servicios personalizados de los servicios administrados de Prometheus, consulta la referencia de prometheus-engine/doc/api.
El siguiente manifiesto define un recurso PodMonitoring
, prom-example
, en el espacio de nombres gmp-test
. El recurso encuentra todos los Pods en el espacio de nombres que tienen la etiqueta app
con el valor prom-example
. Los Pods coincidentes se copian en un puerto llamado metrics
, cada 30 segundos, en la ruta HTTP /metrics
.
apiVersion: monitoring.googleapis.com/v1
kind: PodMonitoring
metadata:
name: prom-example
spec:
selector:
matchLabels:
app: prom-example
endpoints:
- port: metrics
interval: 30s
Para aplicar este recurso, ejecuta el siguiente comando:
kubectl --kubeconfig CLUSTER_KUBECONFIG -n gmp-test apply \
-f https://raw.githubusercontent.com/GoogleCloudPlatform/prometheus-engine/v0.4.1/examples/pod-monitoring.yaml
El servicio administrado para Prometheus ahora recopila los Pods coincidentes.
Consulta datos de métricas
La forma más sencilla de verificar que tus datos de Prometheus se exporten es usar consultas de PromQL en el Explorador de métricas en la consola de Google Cloud.
Para ejecutar una consulta de PromQL, haz lo siguiente:
En la consola de Google Cloud, ve a la página Monitoring o haz clic en el siguiente botón:
En el panel de navegación, selecciona Explorador de métricas.
Usa el lenguaje de consulta de Prometheus (PromQL) para especificar los datos que se mostrarán en el gráfico:
En la barra de herramientas del panel Seleccionar una métrica, selecciona Editor de código.
Selecciona PromQL en el botón de activación Language. El botón de activación de idioma se encuentra en la parte inferior del panel Editor de código.
Ingresa tu consulta en el editor de consultas. Por ejemplo, para graficar la cantidad promedio de segundos que pasaron las CPU en cada modo durante la última hora, usa la siguiente consulta:
avg(rate(kubernetes_io:anthos_container_cpu_usage_seconds_total {monitored_resource="k8s_node"}[1h]))
Para obtener más información sobre el uso de PromQL, consulta PromQL en Cloud Monitoring.
En la siguiente captura de pantalla, se muestra un gráfico con la métrica anthos_container_cpu_usage_seconds_total
:
Si recopilas grandes cantidades de datos, te recomendamos filtrar las métricas exportadas para reducir los costos.
Habilita Cloud Logging para aplicaciones de usuario
La configuración de Cloud Logging y Cloud Monitoring se conserva en un objeto de Stackdriver llamado stackdriver
.
Abre el objeto de Stackdriver para editarlo:
kubectl --kubeconfig=CLUSTER_KUBECONFIG \ --namespace kube-system edit stackdriver stackdriver
Reemplaza
CLUSTER_KUBECONFIG
con la ruta de tu archivo kubeconfig del clúster de usuario.En la sección
spec
, configuraenableCloudLoggingForApplications
comotrue
:apiVersion: addons.gke.io/v1alpha1 kind: Stackdriver metadata: name: stackdriver namespace: kube-system spec: projectID: ... clusterName: ... clusterLocation: ... proxyConfigSecretName: ... enableCloudLoggingForApplications: true enableVPC: ... optimizedMetrics: true
Guarda y cierra el archivo editado.
Ejecuta una aplicación de ejemplo
En esta sección, crearás una aplicación que escriba registros personalizados.
Guarda los siguientes manifiestos de Gateway en un archivo llamados
my-app.yaml
.apiVersion: apps/v1 kind: Deployment metadata: name: "monitoring-example" namespace: "default" labels: app: "monitoring-example" spec: replicas: 1 selector: matchLabels: app: "monitoring-example" template: metadata: labels: app: "monitoring-example" spec: containers: - image: gcr.io/google-samples/prometheus-dummy-exporter:latest name: prometheus-example-exporter imagePullPolicy: Always command: - /bin/sh - -c - ./prometheus-dummy-exporter --metric-name=example_monitoring_up --metric-value=1 --port=9090 resources: requests: cpu: 100m
Crea el objeto Deployment
kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f my-app.yaml
Ver los registros de la aplicación
Consola
Ve al Explorador de registros en la consola de Google Cloud.
Haz clic en Recurso. En el menú TODOS LOS TIPOS DE RECURSOS, selecciona Contenedor de Kubernetes.
En CLUSTER_NAME, selecciona el nombre de tu clúster de usuario.
En NAMESPACE_NAME, selecciona predeterminado.
Haz clic en Agregar y, luego, en Ejecutar consulta.
En Resultados de la consulta, puedes ver las entradas de registro del Deployment
monitoring-example
. Por ejemplo:{ "textPayload": "2020/11/14 01:24:24 Starting to listen on :9090\n", "insertId": "1oa4vhg3qfxidt", "resource": { "type": "k8s_container", "labels": { "pod_name": "monitoring-example-7685d96496-xqfsf", "cluster_name": ..., "namespace_name": "default", "project_id": ..., "location": "us-west1", "container_name": "prometheus-example-exporter" } }, "timestamp": "2020-11-14T01:24:24.358600252Z", "labels": { "k8s-pod/pod-template-hash": "7685d96496", "k8s-pod/app": "monitoring-example" }, "logName": "projects/.../logs/stdout", "receiveTimestamp": "2020-11-14T01:24:39.562864735Z" }
gcloud CLI
Ejecuta este comando:
gcloud logging read 'resource.labels.project_id="PROJECT_ID" AND \ resource.type="k8s_container" AND resource.labels.namespace_name="default"'
Reemplaza
PROJECT_ID
por el ID de tu proyecto.En el resultado, puedes ver las entradas de registro del Deployment
monitoring-example
. Por ejemplo:insertId: 1oa4vhg3qfxidt labels: k8s-pod/app: monitoring-example k8s- pod/pod-template-hash: 7685d96496 logName: projects/.../logs/stdout receiveTimestamp: '2020-11-14T01:24:39.562864735Z' resource: labels: cluster_name: ... container_name: prometheus-example-exporter location: us-west1 namespace_name: default pod_name: monitoring-example-7685d96496-xqfsf project_id: ... type: k8s_container textPayload: | 2020/11/14 01:24:24 Starting to listen on :9090 timestamp: '2020-11-14T01:24:24.358600252Z'
Filtrar los registros de la aplicación
El filtrado de registros de aplicaciones puede reducir la facturación del registro de aplicaciones y el tráfico de red del clúster a Cloud Logging. A partir de la versión 1.15.0 de GKE en Bare Metal, cuando enableCloudLoggingForApplications
se configura como true
, puedes filtrar los registros de la aplicación según los siguientes criterios:
- Etiquetas de Pod (
podLabelSelectors
) - Espacios de nombres (
namespaces
) - Expresiones regulares para el contenido del registro (
contentRegexes
)
GKE en Bare Metal envía solo los resultados del filtro a Cloud Logging.
Define filtros de registro de la aplicación
La configuración de Logging se especifica en un objeto de Stackdriver llamado stackdriver
.
Abre el objeto
stackdriver
para editarlo:kubectl --kubeconfig USER_CLUSTER_KUBECONFIG --namespace kube-system \ edit stackdriver stackdriver
Reemplaza USER_CLUSTER_KUBECONFIG por la ruta de acceso al archivo kubeconfig del clúster de usuario.
Agrega una sección
appLogFilter
aspec
:apiVersion: addons.gke.io/v1alpha1 kind: Stackdriver metadata: name: stackdriver namespace: kube-system spec: enableCloudLoggingForApplications: true projectID: ... clusterName: ... clusterLocation: ... appLogFilter: keepLogRules: - namespaces: - prod ruleName: include-prod-logs dropLogRules: - podLabelSelectors: - disableGCPLogging=yes ruleName: drop-logs
Guarda y cierra el archivo editado.
Si usas
podLabelSelectors
, reinicia el DaemonSet destackdriver-log-forwarder
para aplicar los cambios lo antes posible (opcional):kubectl --kubeconfig USER_CLUSTER_KUBECONFIG --namespace kube-system \ rollout restart daemonset stackdriver-log-forwarder
Por lo general, los
podLabelSelectors
son efectivos después de 10 minutos. Reiniciar el DaemonSetstackdriver-log-forwarder
hace que los cambios se apliquen con mayor rapidez.
Ejemplo: Incluye los registros ERROR
o WARN
solo en el espacio de nombres prod
En el siguiente ejemplo, se ilustra el funcionamiento de un filtro de registro de la aplicación. Debes definir un filtro que use un espacio de nombres (prod
), una expresión regular (.*(ERROR|WARN).*
) y una etiqueta de Pod (disableGCPLogging=yes
). Luego, para verificar que el filtro funcione, ejecuta un Pod en el espacio de nombres prod
a fin de probar estas condiciones del filtro.
Para definir y probar un filtro de registro de la aplicación, sigue estos pasos:
Especifica un filtro de registro de la aplicación en el objeto Stackdriver:
En el siguiente ejemplo de
appLogFilter
, solo se conservan los registrosERROR
oWARN
en el espacio de nombresprod
. Se descartan todos los registros para Pods con la etiquetadisableGCPLogging=yes
:apiVersion: addons.gke.io/v1alpha1 kind: Stackdriver metadata: name: stackdriver namespace: kube-system spec: ... appLogFilter: keepLogRules: - namespaces: - prod contentRegexes: - ".*(ERROR|WARN).*" ruleName: include-prod-logs dropLogRules: - podLabelSelectors: - disableGCPLogging=yes # kubectl label pods pod disableGCPLogging=yes ruleName: drop-logs ...
Implementa un Pod en el espacio de nombres
prod
y ejecuta una secuencia de comandos que genere entradas de registroERROR
yINFO
:kubectl --kubeconfig USER_CLUSTER_KUBECONFIG run pod1 \ --image gcr.io/cloud-marketplace-containers/google/debian10:latest \ --namespace prod --restart Never --command -- \ /bin/sh -c "while true; do echo 'ERROR is 404\\nINFO is not 404' && sleep 1; done"
Los registros filtrados deben contener solo las entradas
ERROR
, no las entradasINFO
.Agrega la etiqueta
disableGCPLogging=yes
al Pod:kubectl --kubeconfig USER_CLUSTER_KUBECONFIG label pods pod1 \ --namespace prod disableGCPLogging=yes
El registro filtrado ya no debe contener entradas para el Pod
pod1
.
Definición de la API de filtro de registro de aplicaciones
La definición del filtro de registro de la aplicación se declara dentro de la definición del recurso personalizado de Stackdriver.
Para obtener la definición del recurso personalizado de Stackdriver, ejecuta el siguiente comando:
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get crd stackdrivers.addons.gke.io \
--namespace kube-system -o yaml
Habilita Logging y Monitoring para aplicaciones de usuario (heredada)
Te recomendamos que sigas la guía de configuración que se encuentra al comienzo de este documento.
Los siguientes pasos siguen funcionando, pero no se recomiendan. Lee este problema conocido antes de realizar los siguientes pasos.
A fin de habilitar Logging y Monitoring para tus aplicaciones, usa el campo spec.clusterOperations.enableApplication
en el archivo de configuración del clúster.
Actualiza el archivo de configuración del clúster para establecer
enableApplication
entrue
:apiVersion: v1 kind: Namespace metadata: name: cluster-user-basic --- apiVersion: baremetal.cluster.gke.io/v1 kind: Cluster metadata: name: user-basic namespace: cluster-user-basic spec: type: user ... clusterOperations: projectID: project-fleet location: us-central1 enableApplication: true ...
Usa
bmctl update
para aplicar los cambios:bmctl update cluster -c CLUSTER_NAME --admin-kubeconfig=ADMIN_KUBECONFIG
Reemplaza lo siguiente:
CLUSTER_NAME
: el nombre del clúster que se actualizaráADMIN_KUBECONFIG
es la ruta al archivo kubeconfig del clúster de administrador.
Anota las cargas de trabajo
Para habilitar la recopilación de métricas personalizadas de una aplicación, agrega la anotación prometheus.io/scrape: "true"
al manifiesto de servicio o pod de la aplicación, o agrega la misma anotación a la sección spec.template
del manifiesto de Deployment o DaemonSet para pasarla a sus pods.
Ejecuta una aplicación de ejemplo
En esta sección, crearás una aplicación que escriba registros personalizados y exponga una métrica personalizada.
Guarda los siguientes manifiestos de Service y Deployment en un archivo llamado
my-app.yaml
. Ten en cuenta que el Service tiene la anotaciónprometheus.io/scrape: "true"
:kind: Service apiVersion: v1 metadata: name: "monitoring-example" namespace: "default" annotations: prometheus.io/scrape: "true" spec: selector: app: "monitoring-example" ports: - name: http port: 9090 --- apiVersion: apps/v1 kind: Deployment metadata: name: "monitoring-example" namespace: "default" labels: app: "monitoring-example" spec: replicas: 1 selector: matchLabels: app: "monitoring-example" template: metadata: labels: app: "monitoring-example" spec: containers: - image: gcr.io/google-samples/prometheus-dummy-exporter:latest name: prometheus-example-exporter imagePullPolicy: Always command: - /bin/sh - -c - ./prometheus-dummy-exporter --metric-name=example_monitoring_up --metric-value=1 --port=9090 resources: requests: cpu: 100m
Crea el Deployment y el Service:
kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f my-app.yaml
Ver los registros de la aplicación
Consola
Ve al Explorador de registros en la consola de Google Cloud.
Haz clic en Recurso. En TODOS LOS TIPOS DE RECURSOS, selecciona Contenedor de Kubernetes.
En CLUSTER_NAME, selecciona el nombre de tu clúster de usuario.
En NAMESPACE_NAME, selecciona predeterminado.
Haz clic en Agregar y, luego, en Ejecutar consulta.
En Resultados de la consulta, puedes ver las entradas de registro del Deployment
monitoring-example
. Por ejemplo:{ "textPayload": "2020/11/14 01:24:24 Starting to listen on :9090\n", "insertId": "1oa4vhg3qfxidt", "resource": { "type": "k8s_container", "labels": { "pod_name": "monitoring-example-7685d96496-xqfsf", "cluster_name": ..., "namespace_name": "default", "project_id": ..., "location": "us-west1", "container_name": "prometheus-example-exporter" } }, "timestamp": "2020-11-14T01:24:24.358600252Z", "labels": { "k8s-pod/pod-template-hash": "7685d96496", "k8s-pod/app": "monitoring-example" }, "logName": "projects/.../logs/stdout", "receiveTimestamp": "2020-11-14T01:24:39.562864735Z" }
gcloud CLI
Ejecuta este comando:
gcloud logging read 'resource.labels.project_id="PROJECT_ID" AND \ resource.type="k8s_container" AND resource.labels.namespace_name="default"'
Reemplaza
PROJECT_ID
por el ID de tu proyecto.En el resultado, puedes ver las entradas de registro del Deployment
monitoring-example
. Por ejemplo:insertId: 1oa4vhg3qfxidt labels: k8s-pod/app: monitoring-example k8s- pod/pod-template-hash: 7685d96496 logName: projects/.../logs/stdout receiveTimestamp: '2020-11-14T01:24:39.562864735Z' resource: labels: cluster_name: ... container_name: prometheus-example-exporter location: us-west1 namespace_name: default pod_name: monitoring-example-7685d96496-xqfsf project_id: ... type: k8s_container textPayload: | 2020/11/14 01:24:24 Starting to listen on :9090 timestamp: '2020-11-14T01:24:24.358600252Z'
Ve las métricas de la aplicación en la consola de Google Cloud
Tu aplicación de ejemplo expone una métrica personalizada llamada example_monitoring_up
.
Puedes ver los valores de esa métrica en la consola de Google Cloud.
Ve al Explorador de métricas en la consola de Google Cloud.
En Resource type, selecciona
Kubernetes Pod
oKubernetes Container
.En Métrica (Metric), selecciona
external.googleapis.com/prometheus/example_monitoring_up
.En el gráfico, puedes ver que
example_monitoring_up
tiene un valor repetido de 1.