Envoy 액세스 로그

Envoy 액세스 로그 (Envoy Access Logs)

이 작업은 Envoy 프록시가 액세스 로그를 표준 출력으로 출력하도록 구성하는 방법을 보여드려요. 가장 단순한 종류의 Istio 로깅이 바로 Envoy 액세스 로깅이에요.

출처: Istio 문서

본문

가장 단순한 종류의 Istio 로깅은 Envoy의 액세스 로깅이에요. Envoy 프록시는 액세스 정보를 자신의 표준 출력으로 출력해요. 그러면 kubectl logs 명령으로 Envoy 컨테이너의 표준 출력을 볼 수 있어요.

시작하기 전에 (Before you begin)

  • 설치 가이드의 지침을 따라 Istio를 설정하세요.

[!note] demo 구성 프로필을 설치하면 egress 게이트웨이와 액세스 로깅이 활성화돼요.

  • 요청을 보낼 테스트 소스로 사용할 curl 샘플 앱을 배포하세요. 자동 사이드카 주입이 활성화되어 있으면 다음 명령으로 샘플 앱을 배포하세요.
$ kubectl apply -f @samples/curl/curl.yaml@

그렇지 않으면 curl 애플리케이션을 배포하기 전에 다음 명령으로 사이드카를 수동으로 주입하세요.

$ kubectl apply -f <(istioctl kube-inject -f @samples/curl/curl.yaml@)

[!note] curl이 설치된 어떤 파드라도 테스트 소스로 사용할 수 있어요.

  • SOURCE_POD 환경 변수를 소스 파드의 이름으로 설정하세요.
$ export SOURCE_POD=$(kubectl get pod -l app=curl -o jsonpath={.items..metadata.name})
  • httpbin 샘플을 시작하세요. 자동 사이드카 주입이 활성화되어 있으면 httpbin 서비스를 배포하세요.
$ kubectl apply -f @samples/httpbin/httpbin.yaml@

그렇지 않으면 httpbin 애플리케이션을 배포하기 전에 사이드카를 수동으로 주입해야 해요.

$ kubectl apply -f <(istioctl kube-inject -f @samples/httpbin/httpbin.yaml@)

Envoy 액세스 로그 활성화하기 (Enable Envoy's access logging)

Istio는 액세스 로그를 활성화하는 몇 가지 방법을 제공해요. Telemetry API 사용을 권장해요.

Telemetry API 사용하기

Telemetry API를 사용해서 액세스 로그를 활성화하거나 비활성화할 수 있어요.

apiVersion: telemetry.istio.io/v1
kind: Telemetry
metadata:
  name: mesh-default
  namespace: istio-system
spec:
  accessLogging:
    - providers:
      - name: envoy

위 예시는 기본 envoy 액세스 로그 프로바이더를 사용하며, 기본 설정 외에 아무것도 구성하지 않아요. 비슷한 구성을 개별 네임스페이스나 개별 워크로드에 적용해서 더 세밀한 수준으로 로깅을 제어할 수도 있어요. Telemetry API 사용에 대한 자세한 내용은 Telemetry API 개요를 참고하세요.

Mesh Config 사용하기

IstioOperator 구성을 사용해서 Istio를 설치했다면, 구성에 다음 필드를 추가하세요.

spec:
  meshConfig:
    accessLogFile: /dev/stdout

그렇지 않으면 원래 istioctl install 명령에 동등한 설정을 추가하세요. 예를 들어:

$ istioctl install <flags-you-used-to-install-Istio> --set meshConfig.accessLogFile=/dev/stdout

accessLogEncoding을 JSON 또는 TEXT로 설정해서 JSON과 텍스트 사이에서 선택할 수도 있어요. 또한 accessLogFormat을 편집해서 액세스 로그의 형식을 커스터마이징할 수도 있어요. 이 세 가지 설정에 대한 자세한 내용은 전역 메시 옵션을 참고하세요.

  • meshConfig.accessLogFile
  • meshConfig.accessLogEncoding
  • meshConfig.accessLogFormat

기본 액세스 로그 형식 (Default access log format)

accessLogFormat이 지정되지 않은 경우 Istio는 다음 기본 액세스 로그 형식을 사용해요.

[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% %RESPONSE_CODE_DETAILS% %CONNECTION_TERMINATION_DETAILS%
\"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\"
\"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER_RAW% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME% %ROUTE_NAME%\n

다음 표는 curl에서 httpbin으로 보낸 요청에 기본 액세스 로그 형식을 사용한 예시를 보여줘요. | Log operator | access log in curl | access log in httpbin | | [%START_TIME%] | [2020-11-25T21:26:18.409Z] | [2020-11-25T21:26:18.409Z] | | \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" | "GET /status/418 HTTP/1.1" | "GET /status/418 HTTP/1.1" | | %RESPONSE_CODE% | 418 | 418 | | %RESPONSE_FLAGS% | - | - | | %RESPONSE_CODE_DETAILS% | via_upstream | via_upstream | | %CONNECTION_TERMINATION_DETAILS% | - | - | | \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" | "-" | "-" | | %BYTES_RECEIVED% | 0 | 0 | | %BYTES_SENT% | 135 | 135 | | %DURATION% | 4 | 3 | | %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% | 4 | 1 | | \"%REQ(X-FORWARDED-FOR)%\" | "-" | "-" | | \"%REQ(USER-AGENT)%\" | "curl/7.73.0-DEV" | "curl/7.73.0-DEV" | | \"%REQ(X-REQUEST-ID)%\" | "84961386-6d84-929d-98bd-c5aee93b5c88" | "84961386-6d84-929d-98bd-c5aee93b5c88" | | \"%REQ(:AUTHORITY)%\" | "httpbin:8000" | "httpbin:8000" | | \"%UPSTREAM_HOST%\" | "10.44.1.27:80" | "127.0.0.1:80" | | %UPSTREAM_CLUSTER_RAW% | outbound|8000||httpbin.foo.svc.cluster.local | inbound|8000|| | | %UPSTREAM_LOCAL_ADDRESS% | 10.44.1.23:37652 | 127.0.0.1:41854 | | %DOWNSTREAM_LOCAL_ADDRESS% | 10.0.45.184:8000 | 10.44.1.27:80 | | %DOWNSTREAM_REMOTE_ADDRESS% | 10.44.1.23:46520 | 10.44.1.23:37652 | | %REQUESTED_SERVER_NAME% | - | outbound_.8000_._.httpbin.foo.svc.cluster.local | | %ROUTE_NAME% | default | default |

액세스 로그 테스트 (Test the access log)

  1. curl에서 httpbin으로 요청을 보내세요.
$ kubectl exec "$SOURCE_POD" -c curl -- curl -sS -v httpbin:8000/status/418
...
< HTTP/1.1 418 Unknown
...
< server: envoy
...
I'm a teapot!
...
  1. curl의 로그를 확인하세요.
$ kubectl logs -l app=curl -c istio-proxy
[2020-11-25T21:26:18.409Z] "GET /status/418 HTTP/1.1" 418 - via_upstream - "-" 0 135 4 4 "-" "curl/7.73.0-DEV" "84961386-6d84-929d-98bd-c5aee93b5c88" "httpbin:8000" "10.44.1.27:80" outbound|8000||httpbin.foo.svc.cluster.local 10.44.1.23:37652 10.0.45.184:8000 10.44.1.23:46520 - default
  1. httpbin의 로그를 확인하세요.
$ kubectl logs -l app=httpbin -c istio-proxy
[2020-11-25T21:26:18.409Z] "GET /status/418 HTTP/1.1" 418 - via_upstream - "-" 0 135 3 1 "-" "curl/7.73.0-DEV" "84961386-6d84-929d-98bd-c5aee93b5c88" "httpbin:8000" "127.0.0.1:80" inbound|8000|| 127.0.0.1:41854 10.44.1.27:80 10.44.1.23:37652 outbound_.8000_._.httpbin.foo.svc.cluster.local default

요청에 해당하는 메시지가 소스와 대상의 Istio 프록시 로그(각각 curl과 httpbin)에 모두 나타나는 것을 확인할 수 있어요. 로그에서 HTTP 동사(GET), HTTP 경로(/status/418), 응답 코드(418) 및 기타 요청 관련 정보를 볼 수 있어요.

정리 (Cleanup)

curl과 httpbin 서비스를 종료하세요.

$ kubectl delete -f @samples/curl/curl.yaml@
$ kubectl delete -f @samples/httpbin/httpbin.yaml@

Envoy 액세스 로그 비활성화하기

Istio 설치 구성에서 meshConfig.accessLogFile 설정을 제거하거나 ""로 설정하세요.

[!note] 아래 예시에서 default는 Istio 설치 시 사용한 프로필 이름으로 바꾸세요.

$ istioctl install --set profile=default
✔ Istio core installed
✔ Istiod installed
✔ Ingress gateways installed
✔ Installation complete

더 알아보기 (Learn more)

  • Telemetry API를 사용한 액세스 로그 구성에 대한 자세한 내용은 Telemetry API 개요를 참고하세요.
  • 전역 메시 옵션에서 accessLogFile, accessLogEncoding, accessLogFormat에 대해 더 알아보세요.