๐น ๊ฐ์
์ด๋ฒ ๊ธ์์๋ 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 ํ์์ ๋ก๊ทธ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ก๊ทธ ๋ถ์์ด ๋์ฑ ์ฉ์ดํ๋ฉฐ, ๊ฒ์ ๋ฐ ํํฐ๋ง ์๋๊ฐ ํฅ์๋ฉ๋๋ค.