Kubernetes Tools/Istio

[Istio ๊ฐ€์ด๋“œ ep.30] 4๋ถ€ ๋ชจ๋‹ˆํ„ฐ๋ง #6 | Istio์—์„œ ๋กœ๊ทธ ๋ฐ์ดํ„ฐ ์ค‘์•™ํ™” ๋ฐ Fluentd ์—ฐ๋™

ygtoken 2025. 3. 18. 12:10
728x90

๐Ÿ”น ๊ฐœ์š”

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” Istio์—์„œ ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์ค‘์•™ํ™”ํ•˜๊ณ  Fluentd๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋กœ๊ทธ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ˆ˜์ง‘, ์ €์žฅ ๋ฐ ๋ถ„์„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ํ™˜๊ฒฝ์—์„œ๋Š” ๊ฐ ์„œ๋น„์Šค๊ฐ€ ๊ฐœ๋ณ„์ ์ธ ๋กœ๊ทธ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋กœ๊ทธ๋ฅผ ์ค‘์•™์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
Istio๋Š” Envoy Proxy๋ฅผ ํ†ตํ•ด ๋ชจ๋“  ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์„ ๋กœ๊น…ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ Fluentd์™€ ์—ฐ๋™ํ•˜๋ฉด ๋กœ๊ทธ ๋ถ„์„์ด ๋”์šฑ ์šฉ์ดํ•ด์ง‘๋‹ˆ๋‹ค.

์ด ๊ธ€์—์„œ๋Š” Istio์˜ ๋กœ๊ทธ ์ˆ˜์ง‘ ๊ตฌ์กฐ, Fluentd ์—ฐ๋™ ๋ฐฉ๋ฒ• ๋ฐ ์‹ค์ „ ์˜ˆ์ œ๋ฅผ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


๐Ÿ”น 1. Istio ๋กœ๊ทธ ๋ฐ์ดํ„ฐ ์ค‘์•™ํ™”์˜ ํ•„์š”์„ฑ

โœ… 1.1 ๋กœ๊ทธ ์ค‘์•™ํ™”๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ํ™˜๊ฒฝ์—์„œ๋Š” ๊ฐ Pod๊ฐ€ ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰๋˜๋ฉฐ ๊ฐœ๋ณ„์ ์ธ ๋กœ๊ทธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์ค‘์•™์—์„œ ๊ด€๋ฆฌํ•˜์ง€ ์•Š์œผ๋ฉด, ์žฅ์•  ๋ฐœ์ƒ ์‹œ ๋กœ๊ทธ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  ๋ถ„์„ํ•˜๋Š” ๊ฒƒ์ด ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

๋กœ๊ทธ ์ค‘์•™ํ™”์˜ ์ฃผ์š” ์žฅ์ 

1๏ธโƒฃ ์„œ๋น„์Šค ๊ฐ„ ์—ฐ๊ด€๋œ ๋กœ๊ทธ๋ฅผ ํ•˜๋‚˜์˜ ์‹œ์Šคํ…œ์—์„œ ๋ถ„์„ ๊ฐ€๋Šฅ
2๏ธโƒฃ ๊ฒ€์ƒ‰ ๋ฐ ํ•„ํ„ฐ๋ง์„ ํ†ตํ•ด ์žฅ์•  ์›์ธ ๋ถ„์„ ์†๋„ ํ–ฅ์ƒ
3๏ธโƒฃ ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ๋ณด์•ˆ ๊ฐ์‚ฌ ๊ฐ€๋Šฅ
4๏ธโƒฃ ์žฅ์•  ๋ฐœ์ƒ ์‹œ ์‹ค์‹œ๊ฐ„ ์•Œ๋žŒ ์„ค์ • ๊ฐ€๋Šฅ (์˜ˆ: Elastic Stack, Loki ๋“ฑ๊ณผ ์—ฐ๋™)

๐Ÿ’ก Istio์—์„œ๋Š” Envoy Proxy๋ฅผ ํ†ตํ•ด ๋ชจ๋“  ํŠธ๋ž˜ํ”ฝ์„ ๋กœ๊น…ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, Fluentd๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ค‘์•™ ๋กœ๊ทธ ์‹œ์Šคํ…œ์œผ๋กœ ์ „์†กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


โœ… 1.2 Istio์˜ ๋กœ๊ทธ ์ˆ˜์ง‘ ํ๋ฆ„

Istio์—์„œ ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์ค‘์•™ํ™”ํ•˜๋Š” ๊ธฐ๋ณธ์ ์ธ ํ๋ฆ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

1๏ธโƒฃ Envoy Proxy → ์„œ๋น„์Šค ๊ฐ„ ํŠธ๋ž˜ํ”ฝ์„ ๊ฐ์ง€ํ•˜๊ณ  ๋กœ๊ทธ ์ƒ์„ฑ
2๏ธโƒฃ Fluentd → Envoy Proxy ๋กœ๊ทธ๋ฅผ ์ˆ˜์ง‘ ๋ฐ ํ•„ํ„ฐ๋ง
3๏ธโƒฃ Elasticsearch, Loki, Splunk ๋“ฑ → ์ˆ˜์ง‘๋œ ๋กœ๊ทธ๋ฅผ ์ €์žฅ ๋ฐ ๋ถ„์„
4๏ธโƒฃ Grafana/Kibana → ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ๋ถ„์„


๐Ÿ”น 2. Istio ๋กœ๊ทธ ์ค‘์•™ํ™” ๊ตฌ์ถ•: Fluentd ์—ฐ๋™ ๋ฐฉ๋ฒ•

โœ… 2.1 Fluentd ์„ค์น˜ (Helm ์‚ฌ์šฉ)

Fluentd๋Š” Kubernetes ํ™˜๊ฒฝ์—์„œ ๋กœ๊ทธ๋ฅผ ์ˆ˜์ง‘ํ•˜์—ฌ ์ค‘์•™ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ์˜คํ”ˆ์†Œ์Šค ๋กœ๊ทธ ์ˆ˜์ง‘๊ธฐ์ž…๋‹ˆ๋‹ค.
Fluentd๋ฅผ Istio์™€ ์—ฐ๋™ํ•˜๋ ค๋ฉด Helm์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

helm repo add fluent https://fluent.github.io/helm-charts
helm repo update
helm install fluentd fluent/fluentd -n logging --create-namespace

 

์„ค์น˜ ํ›„ Fluentd๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

kubectl get pods -n logging | grep fluentd

 

์ถœ๋ ฅ ์˜ˆ์ œ:

fluentd-5d8b6f8d7c-xyz12   1/1   Running   0     2m

๐Ÿ’ก Fluentd๊ฐ€ ์‹คํ–‰๋˜๋ฉด, Istio์˜ Envoy Proxy ๋กœ๊ทธ๋ฅผ ์ˆ˜์ง‘ํ•  ์ค€๋น„๊ฐ€ ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค.


โœ… 2.2 Istio Envoy Proxy ๋กœ๊ทธ ํฌ๋งท ๋ณ€๊ฒฝ (Fluentd ์—ฐ๋™)

Istio์˜ Envoy Proxy ๋กœ๊ทธ๊ฐ€ Fluentd์™€ ํ˜ธํ™˜๋˜๋„๋ก JSON ํ˜•์‹์œผ๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

โ‘  Istio Proxy์˜ ๋กœ๊ทธ ์„ค์ •์„ JSON ํ˜•์‹์œผ๋กœ ๋ณ€๊ฒฝ

apiVersion: telemetry.istio.io/v1alpha1
kind: Telemetry
metadata:
  name: access-logs
  namespace: istio-system
spec:
  accessLogging:
    providers:
      - name: envoy
    format: |
      {
        "start_time": "%START_TIME%",
        "method": "%REQ(:METHOD)%",
        "path": "%REQ(X-ENVOY-ORIGINAL-PATH?:PATH)%",
        "protocol": "%PROTOCOL%",
        "response_code": "%RESPONSE_CODE%",
        "response_flags": "%RESPONSE_FLAGS%",
        "bytes_received": "%BYTES_RECEIVED%",
        "bytes_sent": "%BYTES_SENT%",
        "duration": "%DURATION%",
        "upstream_service_time": "%RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)%",
        "x_forwarded_for": "%REQ(X-FORWARDED-FOR)%",
        "user_agent": "%REQ(USER-AGENT)%",
        "request_id": "%REQ(X-REQUEST-ID)%",
        "authority": "%REQ(:AUTHORITY)%",
        "upstream_host": "%UPSTREAM_HOST%"
      }

์„ค๋ช…:

  • format → ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ JSON ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ Fluentd์™€ ์—ฐ๋™ ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค์ •
  • "start_time" → ์š”์ฒญ์ด ์‹œ์ž‘๋œ ์‹œ๊ฐ„
  • "method" → HTTP ์š”์ฒญ ๋ฐฉ์‹ (GET, POST ๋“ฑ)
  • "path" → ์š”์ฒญ ๊ฒฝ๋กœ
  • "response_code" → ์‘๋‹ต ์ฝ”๋“œ (200, 404, 500 ๋“ฑ)
  • "bytes_received" → ์ˆ˜์‹ ๋œ ๋ฐ์ดํ„ฐ ํฌ๊ธฐ
  • "bytes_sent" → ์ „์†ก๋œ ๋ฐ์ดํ„ฐ ํฌ๊ธฐ
  • "duration" → ์š”์ฒญ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„ (ms)

๐Ÿ’ก JSON ํ˜•์‹์˜ ๋กœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Fluentd์™€ ์‰ฝ๊ฒŒ ์—ฐ๋™ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, Elasticsearch ๋ฐ Loki์™€๋„ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค.


โœ… 2.3 Fluentd ์„ค์ • (ConfigMap ์ ์šฉ)

Fluentd๊ฐ€ Istio์˜ Envoy ๋กœ๊ทธ๋ฅผ ์ˆ˜์ง‘ํ•˜๋„๋ก ์„ค์ •ํ•˜๋ ค๋ฉด, ConfigMap์„ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

apiVersion: v1
kind: ConfigMap
metadata:
  name: fluentd-config
  namespace: logging
data:
  fluent.conf: |
    <source>
      @type tail
      path /var/log/containers/*istio-proxy*.log  # Istio Proxy ๋กœ๊ทธ ๊ฒฝ๋กœ
      pos_file /var/log/fluentd-istio.pos
      tag istio.*
      format json
    </source>

    <match istio.**>
      @type elasticsearch
      host elasticsearch.logging.svc.cluster.local  # Elasticsearch ์ฃผ์†Œ
      port 9200
      logstash_format true
      logstash_prefix istio-logs
      include_tag_key true
      type_name _doc
    </match>

์„ค๋ช…:

  • <source> → Istio Proxy ๋กœ๊ทธ ํŒŒ์ผ(/var/log/containers/*istio-proxy*.log)์„ ์ฝ์–ด์˜ด
  • <match istio.**> → Elasticsearch๋กœ ๋กœ๊ทธ๋ฅผ ์ „์†กํ•˜๋„๋ก ์„ค์ •
  • logstash_prefix istio-logs → Elasticsearch์— ์ €์žฅ๋  ์ธ๋ฑ์Šค ์ด๋ฆ„์„ istio-logs๋กœ ์ง€์ •

๐Ÿ’ก Elasticsearch๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, Fluentd๋ฅผ Loki ๋˜๋Š” Splunk ๋“ฑ ๋‹ค๋ฅธ ๋กœ๊ทธ ๋ถ„์„ ์‹œ์Šคํ…œ๊ณผ ์—ฐ๋™ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.


โœ… 2.4 Fluentd ์„ค์ • ์ ์šฉ ๋ฐ ์žฌ์‹œ์ž‘

ConfigMap์„ ์ƒ์„ฑํ•œ ํ›„ Fluentd์— ์ ์šฉํ•˜๋ ค๋ฉด, Deployment๋ฅผ ์žฌ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

kubectl rollout restart deployment fluentd -n logging

 

์ •์ƒ์ ์œผ๋กœ ๋กœ๊ทธ๊ฐ€ ์ˆ˜์ง‘๋˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

kubectl logs -l app=fluentd -n logging --tail=100

 

์ถœ๋ ฅ ์˜ˆ์ œ:

{
  "start_time": "2024-03-16T12:34:56.123Z",
  "method": "GET",
  "path": "/api/data",
  "protocol": "HTTP/1.1",
  "response_code": 200,
  "bytes_received": 512,
  "bytes_sent": 1024,
  "duration": 20
}

๐Ÿ’ก ๋กœ๊ทธ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ถœ๋ ฅ๋˜๋ฉด, Fluentd๊ฐ€ Istio์˜ Envoy Proxy ๋กœ๊ทธ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.


๐Ÿ“Œ ๊ฒฐ๋ก 

  • Istio์˜ Envoy Proxy ๋กœ๊ทธ๋ฅผ ์ค‘์•™์—์„œ ์ˆ˜์ง‘ํ•˜๋ฉด, ์„œ๋น„์Šค ๊ฐ„ ํŠธ๋ž˜ํ”ฝ์„ ํšจ๊ณผ์ ์œผ๋กœ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Fluentd๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Istio์˜ ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ Elasticsearch, Loki, Splunk ๋“ฑ ๋‹ค์–‘ํ•œ ์‹œ์Šคํ…œ์œผ๋กœ ์ „์†กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • JSON ํ˜•์‹์˜ ๋กœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋กœ๊ทธ ๋ถ„์„์ด ๋”์šฑ ์šฉ์ดํ•˜๋ฉฐ, ๊ฒ€์ƒ‰ ๋ฐ ํ•„ํ„ฐ๋ง ์†๋„๊ฐ€ ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค.
728x90