kubernetes

istio envoy access log

misankim 2023. 3. 8. 23:44
istio envoy access log



# istio 를 설치한 경우
-> istio-system 네임스페이스에 Telemetry 를 생성하는 경우 전역적으로 envoy 액세스 로그가 활성화됨
-> 개별 네임스페이스에 생성하면 해당 네임스페이스만 envoy 액세스 로그가 활성화됨

 

 

vim istio-access-log.yaml

 

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

 

## istioctl 로 istio 를 설치한 경우

 

혹은 mesh.accessLogFile 설정의 값을 "/dev/stdout" 으로 설정

 

kubectl edit cm istio -n istio-system

 

apiVersion: v1
data:
  mesh: |-
    accessLogFile: /dev/stdout -> 로그 설정 추가
    defaultConfig:
      discoveryAddress: istiod.istio-system.svc:15012
      proxyMetadata: {}
      tracing:
        zipkin:
          address: zipkin.istio-system:9411
    enablePrometheusMerge: true
    rootNamespace: istio-system
    trustDomain: cluster.local
  meshNetworks: 'networks: {}'
...

 

## istio operator 로 istio 를 설치한 경우
-> spec.meshConfig.accessLogFile 옵션의 값을 /dev/stdout 으로 설정하여 IstioOperator 업데이트

 

kubectl apply -f - <<EOF
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  namespace: istio-system
  name: istiocontrolplane
spec:
  profile: demo
  meshConfig:
    accessLogFile: /dev/stdout
  values:
    gateways:
      istio-ingressgateway:
        autoscaleEnabled: true
        type: ClusterIP
        serviceAnnotations:
          cloud.google.com/backend-config: '{"default": "istio-ingressgateway"}'
      istio-egressgateway:
        autoscaleEnabled: true
EOF



# asm 을 설치한 경우
-> asm 의 경우 Telemetry 를 생성하는 경우 http 통신에 대한 액세스 로그는 남는데, https 통신에 대한 액세스 로그가 남지 않는 현상이 있음
-> mesh.accessLogFile 설정의 값을 "/dev/stdout" 으로 설정

 

 

kubectl get cm -n istio-system
-> istio-release-channel(istio-asm-1127-2) 확인

 

kubectl edit cm istio-asm-1127-2 -n istio-system

 

apiVersion: v1
data:
  mesh: |-
    accessLogFile: /dev/stdout -> 로그 설정 추가
    defaultConfig:
      discoveryAddress: istiod-asm-1127-2.istio-system.svc:15012
      meshId: proj-332990818870
...

 

# istio service 요구사항
-> service 요구사항에 맞춰 포트 이름을 설정해줘야 envoy 의 액세스 로그가 http 포맷으로 남음

 

 

 

 

## TCP 포맷
[2022-12-30T05:26:53.319Z] "- - -" 0 - - - "-" 5475 2916 1428 - "-" "-" "-" "-" "100.120.11.98:80" inbound|80|| 127.0.0.6:35525 100.120.11.98:80 100.120.1.35:49132 outbound_.80_.stable_.svc-my-flask-app.sample.svc.cluster.local -

 

## HTTP 포맷
[2022-12-30T05:58:45.558Z] "GET / HTTP/1.1" 200 - via_upstream - "-" 0 615 0 0 "172.31.101.68,10.43.244.101,100.66.96.6" "curl/7.85.0" "06e165b8-e420-4c93-8297-b529c78eeab6" "sample.10.43.244.101.nip.io" "100.120.11.98:80" inbound|80|| 127.0.0.6:47763 100.120.11.98:80 100.66.96.6:0 outbound_.80_.stable_.svc-my-flask-app.sample.svc.cluster.local default

 

k8s service 리소스에 반드시 ports.[*].name 을 지정해줘야함
이름 지정 시 반드시 <protocol>[-<suffix>] 포맷을 따를 것

 

## 유효한 이름
name: http2-foo
name: http

 

## 유효하지 않은 이름
name: http2foo

 

## 예시

 

apiVersion: v1
kind: Service
metadata:
  name: svc-my-flask-app
  namespace: sample
spec:
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: my-flask-app
  sessionAffinity: None
  type: ClusterIP

 

# envoy debug 로그 활성화

 

kubectl exec -it my-flask-app-6cd76fccb8-5fxrh -c istio-proxy -- curl -X POST -s -o /dev/null http://localhost:15000/logging?level=debug

kubectl exec -it my-flask-app-6cd76fccb8-5fxrh -c istio-proxy -- curl -X POST -s -o /dev/null http://localhost:15000/logging?level=info