Si está ejecutando la versión 2, consulte estos errores comunes de integración de Kubernetes. Estos errores aparecen en el registro estándar no detallado del agente de infraestructura. Si necesita un registro más detallado, consulte RegistroKubernetes .
La integración de Kubernetes requiere kube-state-metrics. Si falta esto, verá un error como el siguiente en el registro del contenedor newrelic-infra :
$2018-04-11T08:02:41.765236022Z time="2018-04-11T08:02:41Z" level=error $msg="executing data source" data prefix="integration/com.newrelic.kubernetes" $error="exit status 1" plugin name=nri-kubernetes stderr="time=\"2018-04-11T08:02:41Z\" $level=fatal msg=\"failed to discover kube-state-metrics endpoint, $got error: no service found by label k8s-app=kube-state-metrics\"\n"Las razones comunes para este error incluyen:
kube-state-metricsno se ha implementado en el clúster.kube-state-metricses desplegar usando un despliegue personalizado.- Hay varias versiones de
kube-state-metricsejecutándose y la integración de Kubernetes no encuentra la correcta.
La integración de Kubernetes descubre automáticamente kube-state-metrics en su clúster usando esta lógica:
- Busca un servicio
kube-state-metricsejecutándose en el namespacekube-system. - Si no lo encuentra, busca un servicio etiquetado con la etiqueta
"k8s-app: kube-state-metrics".
La integración también requiere que el pod kube-state-métrica tenga la etiqueta k8s-app: kube-state-metrics o app: kube-state-metrics. Si no se encuentra ninguno de ellos, habrá una entrada log como la siguiente:
$2018-04-11T09:25:00.825532798Z time="2018-04-11T09:25:00Z" level=error $msg="executing data source" data prefix="integration/com.newrelic.kubernetes" $error="exit status 1" plugin name=nri-kubernetes stderr="time=\"2018-04-11T09:25:00Z\" $level=fatal msg=\"failed to discover nodeIP with kube-state-metrics, $got error: no pod found by label k8s-app=kube-state-metrics\"\nPara resolver este problema, agregue la etiqueta k8s-app=kube-state-metrics al pod kube-state-metrics .
Si se muestran las métricas para los nodos, pod y contenedor Kubernetes , pero faltan las métricas para el espacio de nombres, la implementación y ReplicaSets, la integración Kubernetes no puede conectarse a kube-state-metrics.
Indicadores de namespace faltantes, implementación y datos ReplicaSet:
- En el gráfico # of K8s objects , faltan esos datos.
- Consulta para
K8sNamespaceSample,K8sDeploymentSampleyK8sReplicasetSampleno muestra ningún dato.
Hay algunas razones posibles para esto:
kube-state-metricsEl servicio se personalizó para escuchar en el puerto 80. Si está empleando un puerto diferente, es posible que vea un error como el siguiente en el registroverbose:bash$time="2018-04-04T09:35:47Z" level=error msg="executing data source"$data prefix="integration/com.newrelic.kubernetes" error="exit status 1"$plugin name=nri-kubernetes stderr="time=\"2018-04-04T09:35:47Z\"$level=fatal msg=\"Non-recoverable error group: error querying KSM.$Get http://kube-state-metrics.kube-system.svc.cluster.local:0/metrics:$net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)\"\n"Este es un problema conocido que ocurre en algún clúster donde le toma demasiado tiempo a
kube-state-metricsrecopilar toda la información del clúster antes de enviarla a la integración.Como solución alternativa, aumente el tiempo de espera del cliente kube-state-métrica.
kube-state-metricsla instancia se está ejecutando detráskube-rbac-proxy. New Relic actualmente no admite esta configuración. Es posible que vea un error como el siguiente en el registroverbose:bash$time="2018-03-28T23:09:12Z" level=error msg="executing data source"$data prefix="integration/com.newrelic.kubernetes" error="exit status 1"$plugin name=nri-kubernetes stderr="time=\"2018-03-28T23:09:12Z\"$level=fatal msg=\"Non-recoverable error group: error querying KSM.$Get http://192.168.132.37:8443/metrics: net/http: HTTP/1.x$transport connection broken: malformed HTTP response \\\"\\\\x15\\\\x03\\\\x01\\\\x00\\\\x02\\\\x02\\\"\"\n"La carga útil de KSM es bastante grande y la integración de Kubernetes que procesa la fecha está siendo eliminada por OOM. Dado que la integración no es el proceso principal del contenedor, el pod no se reinicia. Esta situación se puede detectar en el registro del pod
newrelic-infraque se ejecuta en el mismo nodo de KSM:bash$time="2020-12-10T17:40:44Z" level=error msg="Integration command failed" error="signal: killed" instance=nri-kubernetes integration=com.newrelic.kubernetesComo solución alternativa, aumente los límites de memoria de DaemonSet para que el proceso no finalice.
Newrelic pod y la cuenta de servicio newrelic no se implementan en el mismo namespace. Esto suele deberse a que el contexto actual especifica un namespace. Si este es el caso, verá un error como el siguiente:
$time=\"2018-05-31T10:55:39Z\" level=panic msg=\"p$ods is forbidden: User \\\"system:serviceaccount:kube-system:newrelic\\\" cannot list pods at the cluster scope\"Para comprobar si este es el caso, ejecute:
$kubectl describe serviceaccount newrelic | grep Namespace$kubectl get pods -l name=newrelic-infra --all-namespaces$kubectl config get-contextsPara resolver este problema, cambie el namespace de la cuenta de servicio en el archivo YAML New Relic DaemonSet para que sea el mismo namespace para el contexto actual:
- kind: ServiceAccount name: newrelic namespace: default---No ver datos del plano de control
Ejecute los siguientes comandos para encontrar manualmente los nodos del plano de control:
$kubectl get nodes -l node-role.kubernetes.io/control-plane=""Si los nodos del plano de control siguen la convención de etiquetado definida en el componente Plano de control, debería obtener un resultado como el siguiente:
$NAME STATUS ROLES AGE VERSION$ip-10-42-24-4.ec2.internal Ready control-plane 42d v1.14.8Si no se encuentran nodos, existen dos escenarios:
Los nodos de su plano de control no tienen las etiquetas necesarias que los identifican como planos de control. En este caso, debe agregar ambas etiquetas a los nodos del plano de control.
Estás en un clúster gestionado y tu proveedor maneja los nodos del plano de control por ti. En este caso, no hay nada que puedas hacer, ya que tu proveedor está limitando el acceso a esos nodos.
Para identificar un pod de integración que se ejecuta en un nodo del plano de control, reemplace NODE_NAME en el siguiente comando con uno de los nombres de nodo enumerados en el paso anterior:
$kubectl get pods --field-selector spec.nodeName=NODE_NAME -l name=newrelic-infra --all-namespacesEl siguiente comando es el mismo que el anterior, solo que selecciona el nodo por ti:
$kubectl get pods --field-selector spec.nodeName=$(kubectl get nodes -l node-role.kubernetes.io/control-plane="" -o jsonpath="{.items[0].metadata.name}") -l name=newrelic-infra --all-namespacesSi todo es correcto deberías obtener algún resultado como:
$NAME READY STATUS RESTARTS AGE$newrelic-infra-whvzt 1/1 Running 0 6d20hSi la integración no se está ejecutando en los nodos de su plano de control, verifique que el daemonset tenga todas las instancias deseadas ejecutar y listas.
$kubectl get daemonsets -l app=newrelic-infra --all-namespacesConsulte la sección de documentación de descubrimiento de nodos y componentes del plano de control y busque las etiquetas que emplea la integración para descubrir los componentes. Luego, ejecute los siguientes comandos para ver si hay algún pod con dichas etiquetas y los nodos donde se están ejecutando:
$kubectl get pods -l k8s-app=kube-apiserver --all-namespacesSi hay un componente con la etiqueta dada, deberías ver algo como:
$NAMESPACE NAME READY STATUS RESTARTS AGE$kube-system kube-apiserver-ip-10-42-24-42.ec2.internal 1/1 Running 3 49dLo mismo se debe hacer con el resto de componentes:
$kubectl get pods -l k8s-app=etcd-manager-main --all-namespaces$kubectl get pods -l k8s-app=kube-scheduler --all-namespaces$kubectl get pods -l k8s-app=kube-kube-controller-manager --all-namespacesPara recuperar el log, siga las instrucciones en Obtener log del pod que se ejecuta en un nodo del plano de control. El log de integración de cada componente muestra el siguiente mensaje Running job: COMPONENT_NAME. Por ejemplo:
$Running job: scheduler$Running job: etcd$Running job: controller-manager$Running job: api-serverSi no especificaste la opción de configuración ETCD_TLS_SECRET_NAME , encontrarás este mensaje en el registro:
$Skipping job creation for component etcd: etcd requires TLS configuration, none givenSi ocurre algún error al consultar la métrica de cualquier componente, se registrará luego del mensaje Running job .
Para obtener el extremo del componente del plano de control que desea consultar, consulte el componente Plano de control. Con el extremo, puede emplear el pod de integración que se ejecuta en el mismo nodo que el componente a consultar. Vea estos ejemplos sobre cómo consultar el programador Kubernetes :
$kubectl exec -ti POD_NAME -- wget -O - localhost:10251/metricsEl siguiente comando hace lo mismo que el anterior, pero también elige el pod por usted:
$kubectl exec -ti $(kubectl get pods --all-namespaces --field-selector spec.nodeName=$(kubectl get nodes -l node-role.kubernetes.io/control-plane="" -o jsonpath="{.items[0].metadata.name}") -l name=newrelic-infra -o jsonpath="{.items[0].metadata.name}") -- wget -O - localhost:10251/metricsSi todo está correcto, deberías obtener alguna métrica en el formato Prometheus, algo como esto:
$Connecting to localhost:10251 (127.0.0.1:10251)$# HELP apiserver_audit_event_total Counter of audit events generated and sent to the audit backend.$# TYPE apiserver_audit_event_total counter$apiserver_audit_event_total 0$# HELP apiserver_audit_requests_rejected_total Counter of apiserver requests rejected due to an error in audit logging backend.$# TYPE apiserver_audit_requests_rejected_total counter$apiserver_audit_requests_rejected_total 0$# HELP apiserver_client_certificate_expiration_seconds Distribution of the remaining lifetime on the certificate used to authenticate a request.$# TYPE apiserver_client_certificate_expiration_seconds histogram$apiserver_client_certificate_expiration_seconds_bucket{le="0"} 0$apiserver_client_certificate_expiration_seconds_bucket{le="1800"} 0$apiserver_client_certificate_expiration_seconds_bucket{le="3600"} 0