버전 2를 실행 중인 경우 일반적인 Kubernetes 통합 오류를 확인하세요. 이러한 오류는 상세하지 않은 표준 인프라 에이전트 로그에 표시됩니다. 더 자세한 로그가 필요한 경우 Kubernetes 로그 를 참조하세요.
Kubernetes 통합에는 kube-state-metrics
필요합니다. 이것이 누락된 경우 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"
이 오류의 일반적인 이유는 다음과 같습니다.
kube-state-metrics
클러스터에 배포되지 않았습니다.kube-state-metrics
사용자 지정 배포를 사용하여 배포됩니다.- 실행 중인
kube-state-metrics
의 여러 버전이 있으며 Kubernetes 통합이 올바른 버전을 찾지 못합니다.
Kubernetes 통합은 다음 로직을 사용하여 클러스터에서 kube-state-metrics
을 자동으로 검색합니다.
kube-system
네임스페이스에서 실행 중인kube-state-metrics
서비스를 찾습니다.- 찾을 수 없는 경우 레이블이
"k8s-app: kube-state-metrics"
인 서비스를 찾습니다.
또한 통합을 위해서는 kube-state-metrics 포드에 k8s-app: kube-state-metrics
또는 app: kube-state-metrics
레이블이 있어야 합니다. 둘 중 어느 것도 찾지 못하면 다음과 같은 로그 항목이 표시됩니다.
$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\"\n
이 문제를 해결하려면 k8s-app=kube-state-metrics
레이블을 kube-state-metrics
포드에 추가하세요.
Kubernetes 노드, 파드 및 컨테이너에 대한 지표가 표시되지만 지우스페이스, 배포 및 ReplicaSets
에 대한 지표가 누락된 경우 Kubernetes 통합은 kube-state-metrics
에 연결할 수 없습니다.
누락된 네임스페이스, 배포 및 ReplicaSet
데이터 표시기:
- # of K8s objects 차트에서 해당 데이터가 누락되었습니다.
K8sNamespaceSample
,K8sDeploymentSample
및K8sReplicasetSample
에 대한 쿼리는 데이터를 표시하지 않습니다.
여기에는 몇 가지 가능한 이유가 있습니다.
kube-state-metrics
서비스는 포트 80에서 수신 대기하도록 사용자 정의되었습니다. 다른 포트를 사용하는 경우verbose
로그에 다음과 같은 오류가 표시될 수 있습니다.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"이는
kube-state-metrics
에서 통합으로 보내기 전에 모든 클러스터 정보를 수집하는 데 너무 많은 시간이 걸리는 일부 클러스터에서 발생하는 알려진 문제입니다.kube-state-metrics
인스턴스가kube-rbac-proxy
뒤에서 실행 중입니다. 뉴렐릭은 현재 이 설정을 지원하지 않습니다.verbose
로그에 다음과 같은 오류가 표시될 수 있습니다.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"KSM 페이로드는 상당히 크고 날짜를 처리하는 Kubernetes 통합은 OOM이 종료됩니다. 통합은 컨테이너의 주요 프로세스가 아니므로 포드가 다시 시작되지 않습니다. 이 상황은 KSM의 동일한 노드에서 실행 중인
newrelic-infra
포드의 로그에서 확인할 수 있습니다.bash$time="2020-12-10T17:40:44Z" level=error msg="Integration command failed" error="signal: killed" instance=nri-kubernetes integration=com.newrelic.kubernetes이 문제를 해결하려면 프로세스가 종료되지 않도록 DaemonSet 메모리 제한을 늘리십시오.
Newrelic 포드 및 newrelic 서비스 계정은 동일한 네임스페이스에 배포되지 않습니다. 이는 일반적으로 현재 컨텍스트가 네임스페이스를 지정하기 때문입니다. 이 경우 다음과 같은 오류가 표시됩니다.
$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\"
이 경우인지 확인하려면 다음을 실행하십시오.
$kubectl describe serviceaccount newrelic | grep Namespace$kubectl get pods -l name=newrelic-infra --all-namespaces$kubectl config get-contexts
이 문제를 해결하려면 New Relic DaemonSet
YAML 파일에서 서비스 계정의 네임스페이스를 현재 컨텍스트의 네임스페이스와 동일하게 변경합니다.
- kind: ServiceAccount name: newrelic namespace: default---
제어 영역 데이터가 표시되지 않음
다음 명령을 실행하여 수동으로 제어 평면 노드를 찾으세요.
$kubectl get nodes -l node-role.kubernetes.io/control-plane=""
제어 평면 노드가 제어 평면 구성 요소 에 정의된 라벨링 규칙을 따르는 경우 다음과 같은 출력이 표시됩니다.
$NAME STATUS ROLES AGE VERSION$ip-10-42-24-4.ec2.internal Ready control-plane 42d v1.14.8
노드를 찾을 수 없는 경우 두 가지 시나리오가 있습니다.
제어 평면 노드에 제어 평면임을 식별하는 데 필요한 레이블이 없습니다. 이 경우에는 두 레이블을 모두 제어 평면 노드에 추가해야 합니다.
관리형 클러스터에 있으며 공급자가 사용자를 대신하여 제어 평면 노드를 처리합니다. 이 경우에는 공급자가 해당 노드에 대한 액세스를 제한하고 있으므로 할 수 있는 일이 없습니다.
제어 평면 노드에서 실행 중인 통합 패드를 식별하려면 다음 명령의 NODE_NAME
이전 단계에 나열된 노드 이름 중 하나로 바꾸세요.
$kubectl get pods --field-selector spec.nodeName=NODE_NAME -l name=newrelic-infra --all-namespaces
다음 명령은 이전 명령과 동일하지만 노드를 선택한다는 점만 다릅니다.
$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-namespaces
모든 것이 정확하면 다음과 같은 출력이 표시되어야 합니다.
$NAME READY STATUS RESTARTS AGE$newrelic-infra-whvzt 1/1 Running 0 6d20h
제어 평면 노드에서 통합이 실행되지 않는 경우 데몬셋에 모든 원하는 인스턴스가 실행 중이고 준비되어 있는지 확인하세요.
$kubectl get daemonsets -l app=newrelic-infra --all-namespaces
제어 평면 노드 및 구성 요소 문서 섹션을 참조하고 통합이 구성 요소를 검색하는 데 사용하는 레이블을 찾으세요. 그런 다음 다음 명령을 실행하여 이러한 레이블이 있는 파드가 있는지와 해당 파드가 실행되는 노드가 있는지 확인하세요.
$kubectl get pods -l k8s-app=kube-apiserver --all-namespaces
지정된 레이블이 있는 구성 요소가 있는 경우 다음과 같이 표시되어야 합니다.
$NAMESPACE NAME READY STATUS RESTARTS AGE$kube-system kube-apiserver-ip-10-42-24-42.ec2.internal 1/1 Running 3 49d
나머지 구성 요소에 대해서도 동일한 작업을 수행해야 합니다.
$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-namespaces
로그를 검색하려면 제어 평면 노드에서 실행되는 파드에서 로그를 가져오는 방법 에 대한 지침을 따르세요. 모든 구성 요소에 대한 통합 로그는 다음 메시지 Running job: COMPONENT_NAME
를 기록합니다. 예를 들어:
$Running job: scheduler
$Running job: etcd
$Running job: controller-manager
$Running job: api-server
ETCD_TLS_SECRET_NAME
설정 옵션을 지정하지 않은 경우 로그에서 다음 메시지를 찾을 수 있습니다.
$Skipping job creation for component etcd: etcd requires TLS configuration, none given
구성 요소의 지표를 쿼리하는 동안 오류가 발생하면 Running job
메시지 다음에 기록됩니다.
쿼리하려는 제어 플레인 구성요소의 엔드포인트를 얻으려면 제어 플레인 구성요소를 참조하세요. 엔드포인트를 사용하면 동일한 노드에서 실행되는 통합 파드를 컴포넌트와 함께 쿼리할 수 있습니다. Kubernetes 스케줄러를 쿼리하는 방법에 대한 다음 예를 참조하세요.
$kubectl exec -ti POD_NAME -- wget -O - localhost:10251/metrics
다음 명령은 이전 명령과 동일하지만 파드도 선택합니다.
$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/metrics
모든 것이 정확하다면 다음과 같은 Prometheus 형식의 지표를 얻어야 합니다.
$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