Service Mesh ์์๋ณด๊ธฐ
- [Service Mesh] 1. Service Mesh๋?
- [Service Mehs] 2. Envoy Proxy
- [Service Mesh] 3. Istio?
- [Service Mesh] 4. Istio Traffic Management (1) - Virtual Service & Destination Rule
- [Service Mesh] 5. Istio Traffic Managerment (2) - Gateway & Service Entry
- [Service Mesh] 6. Service Monitoring in Istio
- [Service Mesh] 7. Logging
์ด๋ฒ ๊ธ์์๋ ์๋น์ค ๋ฉ์ ์ํคํ ์ณ์์ ์ดํ๋ฆฌ์ผ์ด์ ๋ฉํธ๋ฆญ์ ์ด๋ป๊ฒ ์์งํ๋์ง์ ๋ํด์ ์์๋ณด๊ฒ ์ต๋๋ค. ์ดํ๋ฆฌ์ผ์ด์ ์ด ์ ์์ ์ผ๋ก ๋์ํ๊ณ ์๋์ง ํ์ธํ๊ธฐ ์ํด์๋ ์ด๋ฅผ ์ธก์ ํ ์ ์๋ ๋ฉํธ๋ฆญ์ ์์งํด์ผ ํฉ๋๋ค. ๋ํ, ๊ณ ๊ฐ์ฉ์ฑ์ ๋ชฉํ๋ก ํ๋ค๋ฉด ์ฅ์ ๊ฐ ๋ฐ์ํ ํ ๋ณต๊ตฌํ๋ ๊ฒ๋ ์ค์ํ์ง๋ง ์ฅ์ ์ ๋ํด ๋ฏธ๋ฆฌ ์์ฒญ ์, ์๋ต ์๊ฐ, ์๋ต ์ํ์ ๊ฐ์ ์ดํ๋ฆฌ์ผ์ด์ ๋ฉํธ๋ฆญ๊ณผ CPU ๋ฐ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ฅ ๊ณผ ๊ฐ์ ์์คํ ๋ฉํธ๋ฆญ์ ์๊ณ๊ฐ์ ์ ํด๋๊ณ ์ฅ์ ์ํฉ์ ์๋ฐฉํ๋ ๊ณผ์ ๋ ํ์ํฉ๋๋ค. ์ด๋ฌํ ๊ณผ์ ์ ๋ชจ๋ํฐ๋ง์ด๋ผ๊ณ ํ๋ฉฐ ์ ์ฒด ๋ชจ๋ํฐ๋ง ๊ณผ์ ์ ๋ณดํต ๋ฉํธ๋ฆญ ์์ง => ๋ฉํธ๋ฆญ ๋ถ์ => ์๋ ํ๋ก์ธ์ค๋ก ๋๋์ด์ง๋๋ค.
Istio๋ฅผ ๋์ ํจ์ ์์ด ๋ง์ ์ฅ์ ๋ค์ด ์กด์ฌํ์ง๋ง ๊ทธ ์ค ์ง์คํด๋ณผ ์ ์ ํฅ์๋ ๊ด์ธก์ฑ๊ณผ ๊ด๋ จ๋ ๋ด์ฉ์ ๋๋ค. Istio ์๋น์ค ๋ฉ์ ์ํคํ ์ณ๋ ๋ชจ๋ ์๋น์ค๊ฐ ํต์ ์ด Envoy Proxy๋ฅผ ํตํด ์ด๋ฃจ์ด์ง๊ณ ์ด๋ฅผ ํตํด Istio Control Plane์ ๋ก๊ทธ ๋ฐ ๋ฉํธ๋ฆญ ๋ฐ์ดํฐ๋ฅผ ์ป์ ์ ์๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ผ ์ง๊ธ๋ถํฐ Istio์์ ์ด๋ฌํ ํ๋ก์ธ์ค๋ฅผ ์ด๋ป๊ฒ ์ํํ๋์ง ์์๋ณด๊ฒ ์ต๋๋ค.
Istio Mixer (Deprecated)
1.8๋ฒ์ ์ด์ ์ Istio ์์๋ ์๋น์ค ๋ฉ์์ ๊ด๋ จ๋ ๋ฉํธ๋ฆญ์ ๋ชจ์ ์๋ํฌ์ธํธ๋ก ๋ ธ์ถํ๋ Prometheus Adapter๊ฐ Mixer์ ๋ด์ฅ๋์ด ์์ต๋๋ค. Mixer๋ ๊ฐ Envoy Proxy์ ์ฐ๊ฒฐ์ ๋งบ๊ณ ์์ผ๋ฉฐ ์ด๋ฅผ ํตํด Service Metric์ ์์งํ์ฌ endpoint๋ก ๋ ธ์ถํ๊ฒ ๋ฉ๋๋ค. ์ถ๊ฐ๋ก Envoy Proxy Level์์์ ๋ฉํธ๋ฆญ๋ ์์งํ ์ ์๋๋ฐ, ์ด๋ Proxy Container์์ ์ง์ endpoint๋ฅผ ๋ ธ์ถํ์ฌ Prometheus๊ฐ ์ด๋ฅผ ์์งํ๋ ๋ฐฉ์์ผ๋ก ๋์ํฉ๋๋ค.
Mixer๊ฐ ์ด๋ค ๋ฐฉ์์ผ๋ก ๋์ํ๊ฒ ๋๋์ง ๊ด๋ จ๋ ๋ด์ฉ์ alice_k106๋์ ๋ธ๋ก๊ทธ์ ์ ๋ฆฌ๋์ด ์์ด ์ด๋ฅผ ์ฐธ๊ณ ํ์ฌ ๊ฐ๋จํ๊ฒ ์ ๋ฆฌํด๋ณด๊ฒ ์ต๋๋ค.
์ด์ ๊ธ์์ ์ค๋ช ํ๋ ๊ฒ์ฒ๋ผ Adapter๋ Mixer์ ์ ์ก๋ Envoy Attribute๋ฅผ ๊ฐ๊ณตํ์ฌ ์ ์ ํ ์ธํ๋ผ ๋ฐฑ์๋์ ์ ์กํ๋ ๊ธฐ๋ฅ์ ๋ด๋นํฉ๋๋ค. ์ด ๋ Envoy Attribute๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ์ง๋ Configuration Model์ ํตํด ์ ์๋ฉ๋๋ค. Configuration Model์ ๋ค์๊ณผ ๊ฐ์ 3๊ฐ์ง ์์๋ฅผ ์ ์ํฉ๋๋ค.
- Instance
Mixer๊ฐ ์์ ํ Attribute๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ๊ฒ์ธ์ง์ ๋ํ ์ ์๋ฅผ ์๋ฏธํฉ๋๋ค. ์ด ๋ฐ์ดํฐ ํ ํ๋ฆฟ์ Handler์๊ฒ ๋๊ฒจ์ฃผ๊ฒ ๋ฉ๋๋ค. - Handler
Instance์ ๋ฐ์ดํฐ๋ฅผ Adapter ์ ๋ ฅ์ ์ด๋ป๊ฒ ๋งคํํ ๊ฒ์ธ์ง๋ฅผ ์ ์ํ๋ ๋ถ๋ถ์ ๋๋ค. ์๋ฅผ ๋ค๋ฉด CloudWatch Adapter์ ๋ณด๋ด๊ธฐ ์ํด Json Payload๋ฅผ ์ ์ํ๋ ๋ถ๋ถ์ด ๋ฉ๋๋ค. - Rule
Instance์ Handler๋ฅผ ๋งคํํด Adapter์ ์ค์ ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ฉฐ, ๋งคํํ๊ธฐ ์ํ๋ ์กฐ๊ฑด(ex. TCP์ธ ๊ฒฝ์ฐ)์ ์ ์ํ ์ ์์ต๋๋ค.
Custom Metric (with Mixer)
๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณต๋๋ ๋ฉํธ๋ฆญ ์ด์ธ์๋ ์์์ ์ธ๊ธํ Configuration Model์ ํตํด ์ฌ์ฉ์ ์ ์ ๋ฉํธ๋ฆญ ๋ํ ๋ ธ์ถ์ํฌ ์ ์์ต๋๋ค. Istio๋ก ์์ํ๋ ์๋น์ค ๋ฉ์ ์ฑ ์ ๋์์๋ ์์ ๋ฅผ ํตํด ๊ฐ๋จํ๊ฒ ์ฌ์ฉ์ ์ ์ ๋ฉํธ๋ฆญ์ ๋ ธ์ถ์ํค๋ ๋ฐฉ๋ฒ์ ์์๋ณด๊ฒ ์ต๋๋ค.
๋จผ์ Envoy Attribute๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ์ง ์ ์ํ Instance๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
apiVersion: config.istio.io/v1alpha2
kind: instance
metadata:
name: requestdouble
namespace: istio-system
spec:
compiledTemplate: metric
params:
value: "2"
dimensions:
source: source.workload.name | "unknown"
destination: destination.workload.name | "unknown"
compiledTemplate์ Envoy Attribute๋ฅผ ์ฒ๋ฆฌํด์ ๋ง๋ค์ด ๋ผ ๋ฐ์ดํฐ ํ ํ๋ฆฟ์ ์๋ฏธํฉ๋๋ค. params ํ๋์ dimensions ํ๋์๋ ๋ฐ์ดํฐ์ ๋ด๊ธธ ์ค์ ์ ๋ณด๋ฅผ ์ ์ํ๊ณ , value ํ๋์ ์ค์ ๋ฉํธ๋ฆญ ๊ฐ์ ์ ๋ ฅํฉ๋๋ค.
๋ค์์ผ๋ก Instance์ ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ๋งคํํ ์ง ์ ์ํ Handler๋ฅผ ์ ์ํด๋ณด๊ฒ ์ต๋๋ค.
apiVersion: config.istio.io/v1alpha2
kind: handler
metadata:
name: doublehandler
namespace: istio-system
spec:
compiledAdapter: prometheus
params:
metrics:
- name: doublerequest-count
instance_name: requestdouble.instance.istio-system
kind: COUNTER
label_names:
- source
- destination
๋จผ์ ํด๋น ๋ฐ์ดํฐ๋ฅผ Prometheus Adapter์ ๋ณด๋ผ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ compiledAdapter: prometheus๋ก ์ ์ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ metrics ํ๋์์๋ prometheus์ ์ ์ฅ๋ ๋ฉํธ๋ฆญ ์ ๋ณด์ ๋ํด ์ ์ํฉ๋๋ค. name์ prometheus์ ๋ฉํธ๋ฆญ ์ด๋ฆ์, instance_name์ ๋งคํ๋ instance์ ์ด๋ฆ์, kind๋ prometheus์ ๋ฐ์ดํฐ ํ์ ์, label_name์ prometheus ๋ฉํธ๋ฆญ์ label ์ด๋ฆ์ ์๋ฏธํฉ๋๋ค.
๋ง์ง๋ง์ผ๋ก Instance์ Handler๋ฅผ ๋งคํํ๊ธฐ ์ํ Rule์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
apiVersion: config.istio.io/v1alpha2
kind: rule
metadata:
name: requestdouble-prometheus
namespace: istio-system
spec:
actions:
- handler: doublehandler
instances: [ requestdouble ]
match: match(destination.service.name, "webservice")
match ์กฐ๊ฑด์ ๋ง์กฑํ ๋ actions์ ์ ์๋ handler์ instance๋ฅผ ๋งคํํ๊ฒ ๋ฉ๋๋ค.
์์ ๋ฉ๋ํ์คํธ๋ฅผ ์ ์ํ๋ฉด ์ด๋ฆ์ด webservice์ธ ์๋น์ค์ ๋ํด instance์ handler์ ์ค์ ์ด ์ ์ฉ๋๊ณ , Prometheus Adapter์ ๋ฉํธ๋ฆญ์ด ์ ๋ฌ๋์ด ์ต์ข ์ ์ผ๋ก endpoint๋ก ๋ ธ์ถ๋ฉ๋๋ค.
Web Assembly (After Istio 1.8)
์กฐ๊ธ ๋ง์ด ๋์์จ ๊ฒ ๊ฐ๊ธฐ๋ ํ์ง๋ง ์ด๋ฒ๊ธ์์ ๋ค๋ฃจ๊ณ ์ ํ๋ ๋ถ๋ถ์ Mixer๊ฐ Deprecated๋ 1.8 ๋ฒ์ ์ดํ WebAssembly(WASM)๋ฅผ ํตํด ์ด๋ป๊ฒ ์ด๋ฅผ ์ํํ๋์ง ์์๋ณด๊ณ ์ ํฉ๋๋ค. Mixer๋ฅผ ํตํ ๋ฐฉ๋ฒ๋ ๋์ ํ์ฅ์ฑ์ ๊ฐ์ถ๊ณ ์์ง๋ง ์์์ ์ธ๊ธํ ๊ฒ์ฒ๋ผ service level ๋ฉํธ๋ฆญ์ ์์งํ๊ธฐ ์ํด Mixer๋ ๊ฐ Envoy Proxy์ ์ฐ๊ฒฐ์ ๋งบ๊ณ ์์ด์ผ ํ๊ณ ์ด๋ก ์ธํด ๋ง์ ๋ฆฌ์์ค ์ฌ์ฉ๊ณผ ๊ฐ์ ์ฑ๋ฅ์ ์ด์๊ฐ ์กด์ฌํฉ๋๋ค. ์ฑ๋ฅ ๊ฐ์ ์ ์ํด Istio์์๋ Envoy Proxy ์ชฝ์ WebAssembly Extension์ ๋ถํ๋ ๋ฐฉ๋ฒ์ ์ฑํํ์์ต๋๋ค. (Istio ๋ฌธ์์ ๋ฐ๋ฅด๋ฉด ๊ฐ์ ๋ ๋ฐฉ๋ฒ์ด ์ง์ฐ์๊ฐ์ 50~90% ๊ฐ์์์ผฐ์ผ๋ฉฐ, CPU ์ฌ์ฉ๋๋ 50% ์ ๋ ๊ฐ์ํ ์ฑ๋ฅ ๊ฐ์ ์ ๋ณด์ฌ์ค๋ค๊ณ ํฉ๋๋ค.)
์ด์ ๋ฒ์ ์ Envoy๋ ํ์ฅ์ ์์ด ๋์ ๋ฌ๋์ปค๋ธ๋ฅผ ๊ฐ์ง๊ณ ์์์ต๋๋ค. Extension์ C++๋ก ์์ฑํด์ผ ํ์ผ๋ฉฐ, Extension์ ์ถ๊ฐํ Envoy๋ฅผ ๋ค์ ๋น๋ํด์ผ ํ๋ ๋ฌธ์ ๊ฐ ์กด์ฌํ์์ต๋๋ค. ์ด๋ฐ ํ์ฅ์ฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Istio ์ปค๋ฎค๋ํฐ๋ Envoy๋ฅผ ์ํ WASM ๋ฐํ์์ ๊ตฌํํ์๊ณ , ๊ฐ๋ฐ์๋ custom ์ฝ๋๋ฅผ ์์ฑํ๊ณ WASM ์ต์คํ ์ ์ผ๋ก ์ปดํ์ผ ํ Envoy๊ฐ ์ด๋ฅผ ์คํํ๋๋ก ์ค์ ํ๋ ๋ฐฉ์์ผ๋ก ์ ์ฐํ๊ฒ ํ์ฅํ ์ ์๊ฒ ๋์์ต๋๋ค.
Service Level Metric
WASM์ ํตํด ๊ธฐ์กด์ Mixer์์ ์ฒ๋ฆฌํ๋ Service Level์ ๋ฉํธ๋ฆญ์ metadata-exchange, stats 2๊ฐ์ง ํ๋ฌ๊ทธ์ธ์ ํตํด Envoy Proxy์์ ์ฒ๋ฆฌ๋ฉ๋๋ค.
Metadata Exchange Plugin
Service Level ๋ฉํธ๋ฆญ์ ์์งํ๊ธฐ ์ํด Client / Server์ ์ ๋ณด๊ฐ ํ์ํฉ๋๋ค. ํ์ง๋ง ์ฌ๊ธฐ์๋ ํ๊ฐ์ง ๋ฌธ์ ๊ฐ ์กด์ฌํฉ๋๋ค. Service Mesh์์ Envoy Sidecae Proxy๋ ์๊ธฐ ์์ ์ด์ธ์ ๋ค๋ฅธ Proxy์ ์ ๋ณด๋ฅผ ์์ง ๋ชปํ๋ฉฐ, ์ด๋ฐ ์ ๋ณด๋ค์ Control Plane์ ํตํด ์ป์ ์ ์์ต๋๋ค. Control Plane์ ์ปดํฌ๋ํธ์ธ Mixer๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ ๋ฌธ์ ๊ฐ ๋์ง ์์์ง๋ง Envoy Proxy์์ ์์ฒด์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ฒฝ์ฐ, ์ด๋ฌํ ์ ๋ณด๋ฅผ ์ป์ ์ ์ป๊ธฐ ์ํ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด ํ์ํฉ๋๋ค.
์ด๋ฅผ ์ํด ๋์ ํ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- HTTP ๊ธฐ๋ฐ ํธ๋ํฝ์ ๊ฒฝ์ฐ HTTP header์ ์ด์ ๊ด๋ จ๋ ํ๋(envoy.wasm.metadata_exchange.upstream/downstream)๋ฅผ ์ถ๊ฐํ์ฌ ๋ณด๋์ผ๋ก ํด๊ฒฐํ์์ต๋๋ค.
- TCP ๊ธฐ๋ฐ ํธ๋ํฝ์ธ ๊ฒฝ์ฐ ALPN ๊ธฐ๋ฐ ํฐ๋๋ง ๋ฐ ์ ๋์ฌ ๊ธฐ๋ฐ ํ๋กํ ์ฝ์ ์ฌ์ฉํฉ๋๋ค. ์ด๋ ์๋น์ค ๋ฉ์ ๋ด๋ถ์์ client/server์ ์ํ ์ฐ์ ์์๋ฅผ ๋ถ์ฌํจ์ผ๋ก์จ ์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค. ํ์ง๋ง, ์ด ๊ธ์ ๋ฐ๋ฅด๋ฉด Istio ๋ด๋ถ์ Proxy ๊ฐ์๋ ๊ฐ๋ฅํ์ง๋ง ๋ค๋ฅธ Client์ Istio ๋ด๋ถ Proxy์ ์ฌ์ด์ ๊ด๊ณ์์๋ ๋ถ๊ฐ๋ฅํ๋ค๋ ํ๊ณ์ ์ด ์กด์ฌํฉ๋๋ค.
Stats Plugin
Stats Plugin์ inbound / outbound ํธ๋ํฝ์ Envoy ๋ด๋ถ์ ๊ธฐ๋กํ๊ณ Prometheus๊ฐ ์์ง ๊ฐ๋ฅํ๋๋ก ๋ ธ์ถ์ํค๋ ์ญํ ์ ๋ด๋นํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๋ ธ์ถ๋๋ ๋ฉํธ๋ฆญ์ ์ข ๋ฅ์ Label์ Istio ๋ฌธ์์์ ํ์ธํ์ค ์ ์์ต๋๋ค.
Custom Metric (with WASM)
์ด๋ฒ์๋ WASM์ ํตํด Custom Metric์ Expose ํ๋ ๋ฐฉ๋ฒ์ ๋ํด์ ์์๋ณด๊ฒ ์ต๋๋ค. WASM Plugin์ ๊ฐ๋ฐํ ์ ์๋ ์ฌ๋ฌ๊ฐ์ง ์ธ์ด๋ค์ ์ง์ํ๊ณ ์๋๋ฐ Golang์ ์ฌ์ฉํด์ ์งํํด๋ณด๊ฒ ์ต๋๋ค. ํด๋น ๊ณผ์ ์ proxy-wasm-go-sdk์ ์ฐธ๊ณ ํ์ฌ ์งํํ์์ต๋๋ค.
example/metrics ํด๋์ ๋ด์ฉ์ ์ดํด๋ณด๋ฉด custom metric์ ์์งํ๊ธฐ ์ํ ๋ก์ง์ ์์ฑํ main.go ํ์ผ๊ณผ ์ด๋ฅผ ์ถ๊ฐํ envoy์ ์ค์ ํ์ผ์ด ์กด์ฌํฉ๋๋ค. main.go๋ถํฐ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
package main
import (
"github.com/tetratelabs/proxy-wasm-go-sdk/proxywasm"
"github.com/tetratelabs/proxy-wasm-go-sdk/proxywasm/types"
)
func main() {
proxywasm.SetNewRootContext(newRootContext)
proxywasm.SetNewHttpContext(newHttpContext)
}
var counter proxywasm.MetricCounter
const metricsName = "sphong_custom.request_counter"
type metricRootContext struct {
// you must embed the default context so that you need not to reimplement all the methods by yourself
proxywasm.DefaultRootContext
}
func newRootContext(uint32) proxywasm.RootContext {
return &metricRootContext{}
}
// override
func (ctx *metricRootContext) OnVMStart(vmConfigurationSize int) bool {
counter = proxywasm.DefineCounterMetric(metricsName)
return true
}
type metricHttpContext struct {
// you must embed the default context so that you need not to reimplement all the methods by yourself
proxywasm.DefaultHttpContext
}
func newHttpContext(uint32, uint32) proxywasm.HttpContext {
return &metricHttpContext{}
}
// override
func (ctx *metricHttpContext) OnHttpRequestHeaders(numHeaders int, endOfStream bool) types.Action {
prev := counter.Get()
proxywasm.LogInfof("previous value of %s: %d", metricsName, prev)
counter.Increment(1)
return types.ActionContinue
}
๋จผ์ Metric์ ์ํ Root Context์ Http Context๋ฅผ ์์ฑํ๋๋ฐ ๋ชจ๋ ๋ฉ์๋๋ฅผ ์ฌ๊ตฌํํ์ง ์๊ธฐ ์ํด์๋ default context๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ Metric ๊ฐ์ ์ ์ฅํ counter ๋ณ์๋ฅผ ์์ฑํ๊ณ OnVMStart ๋ฉ์๋์์ "sphong_custom.request_counter"๋ผ๋ ์ด๋ฆ์ผ๋ก ์ด๊ธฐํํฉ๋๋ค. ๋ง์ง๋ง์ผ๋ก OnHttpRequestHeaders ๋ฉ์๋์์ counter์ ๊ฐ์ ์ฆ๊ฐ์์ผ์ฃผ๋ ๋ฐฉ์์ผ๋ก ๋์ํ๊ฒ ๋ฉ๋๋ค.
Build
ํด๋น ์ฝ๋๋ฅผ ๋น๋ํด์ผ ํ๋๋ฐ ๊ณต์์ ์ธ go ์ปดํ์ผ๋ฌ๊ฐ ์ง์ํ์ง ์๊ธฐ ๋๋ฌธ์ TinyGo๋ฅผ ํตํด ๋น๋ํด์ผํฉ๋๋ค. ์ ๋ tinygo docker image๋ฅผ ํตํด ๋น๋๋ฅผ ์ํํ์์ต๋๋ค.
> docker run -it -w /tmp/proxy-wasm-go -v $(shell pwd):/tmp/proxy-wasm-go tinygo/tinygo:0.16.0 /bin/bash -c \
'find /tmp/proxy-wasm-go/examples/ -type f -name "main.go" | xargs -Ip tinygo build -o p.wasm -scheduler=none -target=wasi p'
Run
๋ค์์ผ๋ก local์ ์ค์น๋ envoy์ ์ถ๊ฐํ WASM์ ๋ถํ ์ํํ์์ต๋๋ค.
> envoy -c ./examples/${name}/envoy.yaml --concurrency 2 --log-format '%v'
์ฌ๊ธฐ์ ๋ณด๊ณ ์๋ envoy config ํ์ผ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
static_resources:
listeners:
- name: main
address:
socket_address:
address: 0.0.0.0
port_value: 18000
filter_chains:
- filters:
- name: envoy.http_connection_manager
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
stat_prefix: ingress_http
codec_type: auto
route_config:
name: local_route
virtual_hosts:
- name: local_service
domains:
- "*"
routes:
- match:
prefix: "/"
route:
cluster: web_service
http_filters:
- name: envoy.filters.http.wasm
typed_config:
"@type": type.googleapis.com/udpa.type.v1.TypedStruct
type_url: type.googleapis.com/envoy.extensions.filters.http.wasm.v3.Wasm
value:
config:
name: "my_plugin"
root_id: "my_root_id"
vm_config:
vm_id: "my_vm_id"
runtime: "envoy.wasm.runtime.v8"
code:
local:
filename: "./examples/metrics/main.go.wasm"
allow_precompiled: true
- name: envoy.filters.http.router
typed_config: {}
- name: staticreply
address:
socket_address:
address: 127.0.0.1
port_value: 8099
filter_chains:
- filters:
- name: envoy.http_connection_manager
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
stat_prefix: ingress_http
codec_type: auto
route_config:
name: local_route
virtual_hosts:
- name: local_service
domains:
- "*"
routes:
- match:
prefix: "/"
direct_response:
status: 200
body:
inline_string: "example body\n"
http_filters:
- name: envoy.filters.http.router
typed_config: {}
clusters:
- name: web_service
connect_timeout: 0.25s
type: STATIC
lb_policy: ROUND_ROBIN
load_assignment:
cluster_name: mock_service
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: 127.0.0.1
port_value: 8099
admin:
access_log_path: "/dev/null"
address:
socket_address:
address: 0.0.0.0
port_value: 8001
์ค์ ์ค Custom Metric์ Plugin๊ณผ ๊ด๋ จ๋ ๋ถ๋ถ๋ง ์ดํด๋ณด๋ฉด 18000์ผ๋ก http ์์ฒญ์ด ๋ค์ด์ค๊ฒ ๋๋ฉด ์์์ ๋น๋ํ main.go.wasm์ ํ๋ฌ๊ทธ์ธ์ผ๋ก ๋ฑ๋กํ์ฌ ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค. ์ด ๋ ํ๋ฌ๊ทธ์ธ์ ์ด๋ฆ๊ณผ vm์ ๋ฐํ์๊ณผ ๊ฐ์ ์ค์ ๋ ๊ฐ๋ฅํฉ๋๋ค.
Custom Metric Test
Envoy๋ฅผ ์ํํ ํ http://localhost:18000์ ์์ฒญ์ ๋ณด๋ด๋ฉด Custom Metric์ธ "sphong_custom.request_counter"๊ฐ 1์ฉ ์ฆ๊ฐํจ์ ๋ณด์ฌ์ฃผ๋ ๋ก๊ทธ๋ฅผ ๋จ๊ธฐ๊ณ , localhost:8001/stats๋ฅผ ํ์ธํด๋ณด๋ฉด ํด๋น Custom Metric์ ๊ฐ์ ํ์ธํ ์ ์์ต๋๋ค.
์ด๋ฒ ๊ธ์์๋ Istio์์ ์ด๋ป๊ฒ ๋ชจ๋ํฐ๋ง์ ์ง์ํ๋์ง, Custom Metric์ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ ๋ํด Mixer๋ฅผ ์ฌ์ฉํ๋ ๋ฒ์ ๊ณผ WASM์ ์ฌ์ฉํ๋ ๋ฒ์ ์ ๋๋์ด ์ดํด๋ณด์์ต๋๋ค. WASM์ ์ฌ์ฉํ๋ ๋ถ๋ถ์ ์์ง ๋ชจ๋ฅด๋ ๋ถ๋ถ์ด ๋ง์ ๊ธฐ๋ณธ์ ์ธ ํ์ฉ๋ฐฉ๋ฒ๋ง ๋ค๋ค๋ณด์์ต๋๋ค. ๋ฌผ๋ก ์์์ ๋ค๋ฃฌ ๋ฐฉ๋ฒ๋ค์ Mesh ๋ฐ Service์ ๊ด๋ จ๋ Metric์ ์ป์ ์ ์์ง๋ง Node๋ K8S Cluster, Application Metric์ ์์ง ๋ฐ ์ ์ฅํ๊ธฐ ์ํด์๋ ํต์์ ์ธ Exporter๋ฅผ ํตํด Prometheus๊ฐ Scarapingํ๋ ๋ฐฉ๋ฒ์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
๋ค์ ๊ธ์์๋ Istio Service Mesh์์ Logging Architecture๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ํด์ ์์๋ณด๊ฒ ์ต๋๋ค.
์ฐธ๊ณ ์๋ฃ
- github.com/proxy-wasm/spec/blob/master/docs/WebAssembly-in-Envoy.md
- banzaicloud.com/blog/istio-mixerless-telemetry/
- banzaicloud.com/blog/envoy-wasm-filter/
- github.com/tetratelabs/proxy-wasm-go-sdk
- istio.io/latest/docs/reference/config/metrics
- blog.naver.com/alice_k106
- Istio๋ก ์์ํ๋ ์๋น์ค ๋ฉ์ - ์์ด์ฝ ์ถํ์ฌ
๊ธ์์ ์ฌ์ฉ๋ ๋ชจ๋ ์ฝ๋๋ Github์ ์กด์ฌํฉ๋๋ค.
'๐ Service Mesh' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Service Mesh] 7. Logging (0) | 2021.01.28 |
---|---|
[Service Mesh] 5. Istio Traffic Management (2) - Gateway & Service Entry (0) | 2021.01.16 |
[Service Mesh] 4. Istio Traffic Management (1) - Virtual Service & Destination Rule (0) | 2021.01.14 |
[Service Mesh] 3. Istio? (0) | 2020.12.22 |
[Service Mesh] 2. Envoy Proxy (0) | 2020.12.21 |
๋๊ธ