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