컨테이너에서의 호스트네임 감지 (Hostname Detection in Containers)
Kubernetes, Docker, 클라우드 플랫폼의 컨테이너화된 Datadog Agent 배포에서 호스트네임 해석 오류를 해결하는 방법을 알려드릴게요. 컨테이너 환경에서는 호스트네임 해석 과정이 일반 호스트와 달라서 이 부분을 이해하면 문제 해결이 훨씬 쉬워져요.
출처: 문서
본문
Datadog의 많은 기능은 Agent가 모니터링하는 호스트에 정확한 호스트네임을 제공하는 데 의존해요. Agent가 호스트에서 직접 실행될 때는 단순하지만, Agent가 컨테이너 환경에서 실행되면 호스트네임 해석 과정이 달라져요.
버전 7.40부터 Agent는 컨테이너 환경에서 호스트네임 해석 실패를 제대로 인식해요. 호스트네임이 해석되지 않으면 Agent는 시작 직후 오류와 함께 종료돼요.
그럴 때 로그에 다음 ERROR 메시지가 출력돼요:
Error while getting hostname, exiting: unable to reliably determine the host name. You can define one in the agent config file or in your hosts file
이 오류가 발생하면 보통 Agent 설정의 일부가 잘못됐다는 뜻이에요. 아래 정보를 사용해 이 잘못된 설정의 다양한 일반적인 경우를 해결하세요.
Kubernetes 호스트네임 오류
Kubernetes에서 호스트네임 오류는 보통 Agent가 다음 중 적어도 하나에 접근할 수 없다는 뜻이에요:
- Kubelet API
- 클라우드 제공자 메타데이터 엔드포인트
- 컨테이너 런타임 API
일부 Kubernetes 배포판은 전용 구성이 필요하므로, 설정이 권장 Kubernetes 설정과 일치하는지 확인하세요.
Kubelet API 접근
Agent가 Kubelet API에 접근할 수 있는지 확인하세요. 접근 가능하면 Agent는 다음 로그를 출력해요:
Successful configuration found for Kubelet, using URL: ******
Kubernetes RBAC 권한은 공식 Helm 차트, Datadog Operator 및 공식 매니페스트에서 자동으로 설정돼요. 다른 솔루션으로 Agent를 배포한다면 Agent 서비스 계정에 바인딩된 Role 또는 ClusterRole에 다음 권한이 있는지 확인하세요:
rules:
- apiGroups: # Kubelet connectivity
- ""
resources:
- nodes/metrics
- nodes/spec
- nodes/proxy
- nodes/stats
verbs:
- get
Kubelet API 연결을 막는 가장 흔한 오류는 Kubelet TLS 인증서 검증이에요. 많은 Kubernetes 배포판에서 Kubelet 인증서는 다음 중 하나예요:
- 클러스터 CA로 서명되지 않음.
- 접근 가능한 주소에 해당하는 SAN을 포함하지 않음.
TLS 검증이 기본적으로 활성화되어 있으므로 이 때문에 Agent가 HTTPS를 통해 Kubelet API에 연결하지 못해요.
전용 파라미터를 사용하거나 Agent 매니페스트의 모든 컨테이너에 DD_KUBELET_TLS_VERIFY 변수를 설정해 TLS 검증을 비활성화할 수 있어요:
Datadog Operator — DatadogAgent Kubernetes 리소스:
apiVersion: datadoghq.com/v2alpha1
metadata:
name: datadog
spec:
global:
kubelet:
tlsVerify: false
Helm — 커스텀 datadog-values.yaml:
datadog:
kubelet:
tlsVerify: false
수동 (DaemonSet) — DaemonSet 매니페스트:
apiVersion: apps/v1
metadata:
name: datadog
spec:
template:
spec:
containers:
- name: agent
env:
- name: DD_KUBELET_TLS_VERIFY
value: "false"
클라우드 제공자 메타데이터 엔드포인트 접근
AWS, Google Cloud, Azure에서 실행한다면 Agent는 메타데이터 엔드포인트를 사용해 호스트네임을 가져올 수 있어요.
클라우드 제공자 메타데이터 엔드포인트에 접근하면 Datadog가 애플리케이션에서 Agent 데이터와 클라우드 통합 데이터를 제대로 매칭할 수 있어요.
이 문제가 발생하면 보통 메타데이터 엔드포인트에 대한 접근이 제한됐다는 뜻이에요. 예를 들어 AWS에서는 홉 한도 설정(hop limit) 때문일 수 있어요.
컨테이너 런타임 API 접근
이 해결책은 Agent가 Kubelet API에 연결되는 것을 명시적으로 원하지 않고, 위에서 설명한 지원되는 클라우드 제공자에서 실행 중이 아닌 드문 경우에만 사용하세요.
이 경우 downward API를 사용해 DD_HOSTNAME을 설정할 수 있어요:
Datadog Operator — DatadogAgent Kubernetes 리소스:
apiVersion: datadoghq.com/v2alpha1
metadata:
name: datadog
spec:
override:
nodeAgent:
env:
- name: DD_HOSTNAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
Helm — 커스텀 datadog-values.yaml:
datadog:
env:
- name: DD_HOSTNAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
수동 (DaemonSet) — DaemonSet 매니페스트:
apiVersion: apps/v1
metadata:
name: datadog
spec:
template:
spec:
containers:
- name: agent
env:
- name: DD_HOSTNAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
Amazon ECS 및 Docker VM 호스트네임 오류
Agent가 클라우드 제공자의 Docker에서 실행될 때, 호스트네임 오류는 보통 Agent가 다음 중 적어도 하나에 접근할 수 없다는 뜻이에요:
- 컨테이너 런타임 API
- 클라우드 제공자 메타데이터 엔드포인트
컨테이너 런타임 API 접근
Agent가 Docker 소켓에 연결할 수 있게 허용하세요:
Amazon ECS on EC2 — 작업 정의(task definition)에 Docker 소켓이 마운트되어 있는지 확인하세요.
Docker on VM — docker run 명령어에 Docker 소켓이 마운트되어 있는지 확인하세요:
-v /var/run/docker.sock:/var/run/docker.sock:ro
클라우드 제공자 메타데이터 엔드포인트 접근
AWS, Google Cloud, Azure에서 실행한다면 Agent는 메타데이터 엔드포인트를 사용해 호스트네임을 가져올 수 있어요.
클라우드 제공자 메타데이터 엔드포인트에 접근하면 Datadog가 애플리케이션에서 Agent 데이터와 클라우드 통합 데이터를 제대로 매칭할 수 있어요.
이 문제가 발생하면 보통 메타데이터 엔드포인트에 대한 접근이 제한됐다는 뜻이에요. 예를 들어 AWS에서는 홉 한도 설정(hop limit) 때문일 수 있어요.
CI 환경, 사이드카 설정, 컨테이너 런타임에 접근할 수 없는 환경에서의 호스트네임 오류
CI 환경(Agent가 임시적)에서 또는 호스트 정보에 접근할 수 없는 사이드카로 Agent를 실행할 때, 두 가지 옵션이 있어요:
DD_HOSTNAME(datadog.yaml의hostname)을 호스트네임으로 명시적으로 설정:
-e DD_HOSTNAME=$(hostname)
DD_HOSTNAME_TRUST_UTS_NAMESPACE(datadog.yaml의hostname_trust_uts_namespace) 설정:
이 옵션은 Datadog Agent 7.42.0부터 사용할 수 있어요.
-e DD_HOSTNAME_TRUST_UTS_NAMESPACE=true
이 옵션을 설정하면 Agent는 컨테이너 내부의 호스트네임(보통 컨테이너 이름이나 pod 이름)을 사용해요.
참고: 이는 Fargate 같은 서버리스 솔루션에는 적용되지 않아요.
위 해결책으로도 Agent 설정이 해결되지 않았다면 Datadog 지원팀에 문의하세요.