Istio: Egress Gateway
์ด๋ฆผ์์ง! Istio๋ฅผ ์ฐ๋ฉด ์๋น์ค ๋ฉ์ฌ๋ฅผ ๋๊ฐ๋ ํธ๋ํฝ๋ ๋ชจ๋ํฐ๋ง ํ๋ค!!
Egress Gateway๋?
Istio๋ก ์๋น์ค ๋ฉ์ฌ๋ฅผ ๊ตฌ์ฑํ๋ฉด, ํด๋ฌ์คํฐ ๋ฐ๊นฅ์ผ๋ก ๋๊ฐ๋ ํธ๋ํฝ ํ๋ฆ๋ ๋ชจ๋ํฐ๋ง ํ ์ ์๋ค!! ๊ทธ ๊ณผ์ ์์ ์ฌ์ฉํ๋๊ฒ egress-gateway ์ปดํฌ๋ํธ์ istio์ ServiceEntry
๋ฆฌ์์ค๋ค!
์ผ๋จ ๋ฐ๋ชจ๋ถํฐ ํด๋ณด์ฃ !!
์ด๋ฒ ์์ ๋ Istio ๊ณต์ ๋ฌธ์์ โEgress Gatewayโ ๋ฌธ์๋ฅผ ๋ฐํ์ผ๋ก ์คํํด๋ณด์๋ค.
๊ทธ๋ฌ๋ ๋ช๋ช ๋ฆฌ์์ค์ yaml ์ ์๋ ์ดํด๊ฐ ์ฝ๋๋ก ๋ณํ์ ๊ฐํ๋ค.
egress-gateway ์ปดํฌ๋ํธ ๋์ฐ๊ธฐ
istioctl
์์ "default"
Profile๋ก istio๋ฅผ ์ค์นํ๋ค๋ฉด, egress-gateway ์ปดํฌ๋ํธ๊ฐ ์๋ ์ํ์ผ ๊ฒ์ด๋ค. ๊ทธ๋์ ์๋ ๋ช
๋ น์ด๋ก ์ง์ egress-gateway ์ปดํฌ๋ํธ๋ฅผ ๋์์ค์ผ ํ๋ค. "demo"
Profile๋ก ์ค์น ํ๋ค๋ฉด, egress-gateway๋ ์ด๋ฏธ ์์ ๊ฒ์ด๋ค!
$ istioctl install \
--set "spec.components.egressGateways[0].name=istio-egressgateway" \
--set "spec.components.egressGateways[0].enabled=true"
ํ ์คํธ ์ฉ Pod์ ๋์ฐ์.
$ kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.20/samples/sleep/sleep.yaml
์์ ์ปค๋งจ๋๋ฅผ ์คํํ๋ฉด, ์ ๋ง ์๋ ์ ๋ง๋ณด Pod์ด ํ๋ ๋ฌ๋ค. ์ Pod์ ์ ์ํด์ ์์ฒญ๋ค์ ๋ณด๋ผ ๊ฒ์ด๋ค.
์๋ ์ปค๋งจ๋๋ก Pod์ ์ ์ํ๊ณ ๋ฌดํ curl
์์ฒญ์ ๋ณด๋ด๋ณด์.
$ kubectl exec -it deploy/sleep -- sh
~ $ while true; do curl -s -o /dev/null -w "%{http_code}\n" https://edition.cnn.com/politics; done
์ด๋ ๊ฒ ํ ๊ฒฝ์ฐ, http status ์ฝ๋๋ง ๋ฐ์ ์ ์๋ค!!
์ด๋๋ Kiali์์ ํ์ธํด๋ด๋, ์ด๋ค ํธ๋ํฝ ํ๋ฆ๋ ๋ณด์ด์ง ์๋๋ค.
ServiceEntry
๋ก ๋๊ฐ๋ ํธ๋ํฝ ๋ชจ๋ํฐ๋งํ๊ธฐ
์๋ ๋ช
๋ น์ด๋ก ์ฐ๋ฆฌ๊ฐ ์์ฒญ์ ๋ณด๋ด๋ edition.cnn.com
์ผ๋ก ๊ฐ๋ ํธ๋ํฝ๋ค์ ๋ชจ๋ํฐ๋ง ํ ์ ์๊ฒ ํด๋ณด์.
$ kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: cnn
spec:
hosts:
- edition.cnn.com
ports:
- number: 443
name: tls
protocol: TLS
resolution: DNS
EOF
๊ทธ๋ฌ๊ณ curl
๋ก ๋ฌดํ ์์ฒญ์ ๋ณด๋ด๋ฉดโฆ
์์ฐ!! ์ด์ ๋ edition.cnn.com
์ฌ์ดํธ๋ก ๊ฐ๋ ํธ๋ํฝ์ ๋ชจ๋ํฐ๋ง ํ ์ ์๊ฒ ๋์๋ค!!
ํด๋น ์ฌ์ดํธ์ ์ด๋น ๋ช๋ฒ ์ฟผ๋ฆฌํ๋์ง๋ ์ ์ ์๋๊ฑด ๋ค!!
์ฐธ๊ณ ๋ก PassthroughCluster
๋ kubectl exec
๋ port-forward
์ ์ ํ์ ๋ ์ ๋ ๊ฒ ๋ฌ๋ค.
Egress Gateway๋ฅผ ํตํด ํธ๋ํฝ์ด ๋๊ฐ๋๋ก ์ค์
๋จ์ํ ServiceEntry
๋ฆฌ์์ค๋ฅผ ๋ง๋ค์ด์ ์ด์ํด๋ ์ถฉ๋ถ ํ ์๋ ์์ง๋ง, egress-gateway ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํด์, ํด๋ฌ์คํฐ ๋ฐ๊นฅ์ผ๋ก ๋๊ฐ๋ ์ถ๊ตฌ(exit point)๋ฅผ ์ง์ ํ ์๋ ์๋ค.
๋, ์ธ๋ถ๋ก ๋๊ฐ๋ ํธ๋ํฝ์ ๋ํด์๋ DestinationRule
์ ์ ์ฉํ ์ ์๋ค!!
์ด๋ฅผ ์ํด Gateway
, VirtualService
๋ฆฌ์์ค๋ฅผ ์ถ๊ฐ๋ก ๋ง๋ค์ด ์ฃผ์. (DestinationRule
์ ์ฉ์ ์ข ์๋ค๊ฐ ํด๋ณผ๊ฑฐ๋ค!)
$ kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: istio-egressgateway
spec:
selector:
istio: egressgateway
servers:
- port:
number: 443 # egress gateway์ ํฌํธ
name: tls
protocol: TLS
hosts:
- edition.cnn.com
tls:
mode: PASSTHROUGH
EOF
* โTLS Pass-throughโ์ ๋ํด์ Istio TLS Network ๊ด๋ จ ์ฌ์ ์ง์ ๋ฌธ์์ ๋ฐ๋ก ์ ๋ฆฌ ํ์ผ๋ ์ฐธ๊ณ ํ์. ์ฌ๊ธฐ์๋ Egress GW๋ฅผ ํตํด ์๋น์ค ๋ฉ์ ๋ฐ๊นฅ์ผ๋ก ๋๊ฐ๋ ํธ๋ํฝ์ ๋ฐ๋ก TLS ๋ณตํธํ ์์ด ๊ทธ๋๋ก ํต๊ณผ ์ํจ๋ค๋ ์๋ฏธ๋ก ๋ฐ์๋ค์ด์.
์ด์ 2๊ฐ์ VirtrualService
๋ฆฌ์์ค๋ฅผ ๋ง๋ค์ด ์ฃผ๋๋ฐ
์ฒซ๋ฒ์งธ ๊ฒ์ Service Mesh์์ edition.cnn.com
์ผ๋ก ๋ณด๋ด๋ ํธ๋ํฝ์ Egress GW๋ก ๋ณด๋ด๋๋ก ์ค์ ํ๊ณ
$ kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: mesh-to-egress-gateway
spec:
hosts:
- edition.cnn.com
gateways:
- mesh
tls:
- match:
- port: 443
sniHosts:
- edition.cnn.com
route:
- destination:
host: istio-egressgateway.istio-system.svc.cluster.local
port:
number: 443
EOF
๋๋ฒ์งธ ๊ฒ์ Egress GW๊ฐ Forward ํ๋ ํธ๋ํฝ์ด ์ด๋๋ก ๊ฐ์ง๋ฅผ ์ค์ ํ๋ค.
$ kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: egressgateway-to-external
spec:
hosts:
- edition.cnn.com
gateways:
- istio-egressgateway
tls:
- match:
- port: 443
sniHosts:
- edition.cnn.com
route:
- destination:
host: edition.cnn.com
port:
number: 443
EOF
๊ทธ๋ฆฌ๊ณ ์์ฒญ์ ๋ณด๋ด๋ฉดโฆ
์ด๋ ๊ฒ ํธ๋ํฝ์ด Egress GW๋ฅผ ํตํด์ ๋๊ฐ๊ฒ ๋๋ค!!
์ธ๋ถ host์๋ DestinationRule
์ ์ฉํ๊ธฐ
์ค์ต์์ ์ฐ๊ณ ์๋ edition.cnn.com
์ Service Mesh ๋ด๋ถ์ ๊ฒ์ด ์๋๊ธฐ ๋๋ฌธ์ ์๋ DestinationRule
์ ์ ์ฉํ ์ ์๋ค.
๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ edition.cnn.com
์ผ๋ก ๋๊ฐ๋ ํธ๋ํฝ์ Egress GW์ Envoy Proxy๋ฅผ ๊ฑฐ์ณ์ ๊ฐ๊ณ ์๊ธฐ ๋๋ฌธ์ DestinationRule
์ Egress GW์ ๊ฑธ์ด์ค๋ค๋ฉด, edition.cnn.com
์ผ๋ก ๋๊ฐ๋ ํธ๋ํฉ์๋ DR ๊ท์น๋ค์ ์ ์ฉํ ์ ์๋ค.
์ผ๋จ ๋ฐ๋ก Egress GW์ ์ ์ฉ๋ DestinationRule
๋ถํฐ ์ดํด๋ณด์!!
$ kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: egressgateway-for-cnn
spec:
host: istio-egressgateway.istio-system.svc.cluster.local
trafficPolicy:
connectionPool:
tcp:
maxConnections: 1
EOF
์ด๋ ๊ฒ ํ๋ฉด, Egress GW๋ก ๋ค์ด์ค๋ ํธ๋ํฝ์ DestinationRule
์ด ์ ์ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ ์ด์์ ํฐ๋ฏธ๋์์ Egress GW๋ก ์์ฒญ์ ๋ณด๋ด๊ฒ ๋๋ฉด maxConnections
์ ์ ์ํ ์ซ์ ๋งํผ์ Connection๋ง ์ ์ง๋๊ณ ๋๋จธ์ง๋ Drop ๋๋ค!!!
์ฆ, ์ธ๋ถ๋ก ๋๊ฐ๋ ํธ๋ํฝ๋ ์ ์ดํ ์ ์๊ฒ ๋๊ฑฐ๋ค!!
Out-bound ํธ๋ํฝ์ ๋ํ ์ ์ฑ ์ค์ ํ๊ธฐ
https://istio.io/latest/docs/tasks/traffic-management/egress/egress-control/#envoy-passthrough-to-external-services
istio๊ฐ ์ ์ฉ๋ pod๋ค์ ๋ชจ๋ in/out ํธ๋ํฝ์ ํด๋น Pod์ envoy sidecar๋ฅผ ํตํด ์ ์ด๋๋ค. istio๋ unknown host/service๋ก ํฅํ๋ ํธ๋ํฝ์ ๊ฒฝ์ฐ, ๊ทธ๋ฅ ํ๋ ค๋ณด๋ด๋(Passthrough)๊ฒ ๊ธฐ๋ณธ ๋์์ด๋ค. ๊ทธ๋ฌ๋ ๋์ ๋ฐ๋ผ์๋(์๋ฅผ ๋ค์ด ๊ฐํ ๋คํธ์ํฌ ๋ณด์ ์กฐ๊ฑด์ด ํ์ํ๋ค๋ฉด) ์ด๋ฐ unknown ๋ชฉ์ ์ง๋ก ๊ฐ๋ ํธ๋ํฝ์ ์ ์ดํด์ผ ํ ๋๊ฐ ์๋ค.
Istio์์๋ ๋ฐ์ผ๋ก ๋๊ฐ๋ ํธ๋ํฝ์ 3๊ฐ์ง ์ ์ฑ ์ ์ธ์ธ ์ ์๋ค.
- mesh ๋ด์ ์ ์๋์ง ์์ ๋ชฉ์ ์ง๋ก ๊ฐ๋ ํธ๋ํฝ์ ๋ชจ๋ ํ์ฉํ๊ธฐ
ServiceEntry
๋ฅผ ๊ตฌ์ฑํ ์ธ๋ถ ๋ชฉ์ ์ง๋ง ํ์ฉํ๊ธฐ- ํน์ IP ๋์ญ์ผ๋ก ๊ฐ๋ ์ธ๋ถ ํธ๋ํฝ๋ง ํ์ฉํ๊ธฐ
isito ํด๋ฌ์คํฐ์ ํธ๋ํฝ ์ ์ด ์ต์
istio ํด๋ฌ์คํฐ๋ฅผ ๊ตฌ์ฑํ ๋, IstioOperator์ meshConfig.outboundTrafficPolicy.mode
์ต์
์ ์กฐ์ ํด์ ์ธ๋ถ๋ก ๋๊ฐ๋ ํธ๋ํฝ์ ์ ๋ฉด ํ์ฉํ ์ง, ๋ฑ๋กํ ๊ฒ๋ง ํ์ฉํ ์ง ์ ํ ์ ์๋ค.
ALLOW_ANY
(default)REGISTRY_ONLY
ALLOW_ANY
๋ ์ ๋ฉด ํ์ฉ์ด๋ฏ๋ก ์ด๋ฏธ ์ ๊ฒ์ด๊ณ , ์๋ ์ปค๋งจ๋๋ก REGISTRY_ONLY
๋ก ์ต์
์ ๋ฐ๊พผ ํ, ์คํํด๋ณด์.
$ istioctl install \
--set "spec.components.egressGateways[0].name=istio-egressgateway" \
--set "spec.components.egressGateways[0].enabled=true" \
--set meshConfig.outboundTrafficPolicy.mode=REGISTRY_ONLY
์์์ edition.cnn.com
์ฃผ์์ ๋ํด์๋ ์คํ์ ํด๋ดค์ผ๋, ์ด๋ฒ์๋ google.com
์ ๋ฑ๋กํ์ง ์์ ์ํ์์ ping์ ๋ ๋ ค๋ณด์.
$ kubectl exec -it deploy/sleep -- sh
~ $ while true; do curl -s -o /dev/null https://google.com; done
Kiali๋ก ํ์ธํ๋ณด๋ฉด, BlackHoleCluster
๋ผ๋ ์ด์ํ ๊ณณ์ผ๋ก ํธ๋ํฝ์ด ๋ชจ์์ ธ๋ฒ๋ฆฐ๋ค!
์๋์ ๊ฐ์ด ๋จ์ผ ์์ฒญ์ ๋ณด๋ด๋ฉด, Connection reset by peer
๋ผ๋ ์ด์ํ ์๋ฌ๋ ๋ฑ๋๋ค.
์ด๋ฐ ํ์์ google.com
์ ๋ฑ๋กํด์ฃผ์ง ์์์ ๊ทธ๋ฐ ๊ฑฐ๋ผ์, ์๋์ ๊ฐ์ด ServiceEntry
๋ก ๋ฑ๋กํ๊ณ ๋๋ฉด, ๋์ด์ ํด๋น ์๋ฌ๋ ๋จ์ง ์๋๋ค!!
$ kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: google
spec:
hosts:
- google.com
ports:
- number: 443
name: tls
protocol: TLS
resolution: DNS
EOF
์ํผ ๋ฑ๋ก๋ ์ธ๋ถ ํธ์คํธ๋ก๋ง ํธ๋ํฝ์ ํ๋ ค์ผ ํ๋ค๋ฉด, REGISTRY_ONLY
์ต์
์ผ๋ก ์ค์ ํ์!!
๋งบ์๋ง
ํ์โฆ ์ ๋ง ServiceEntry
์ ์ปจ์
์์ฒด๋ ์ธ๋ถ ํธ๋ํฝ์ Istio๋ก ๋ชจ๋ํฐ๋ง ํ๋ค๋ ๊ฑด๋ฐ, Egress Gateway๋ฅผ ๊ฐ์ด ์ฐ๊ธฐ ์์ํ๋ฉด์ ์ดํด ํ๋๊ฒ ์ ๋ง ์ด๋ ค์ ์ก๋ค. ๋ถ๋ช
๋๋ Udemy ๊ฐ์ข๋ฅผ ๋ค ๋ฃ๊ณ , ๋ค์ ๊ณต๋ถํ๊ณ ์๋ ๊ฑด๋ฐโฆ
๋๋ถ์ VS
, DR
, Gateway
๊น์ง ๋ค์ ๊ผผ๊ผผํ ๊ณต๋ถํ๊ณ , ์ด์ ๋ ์ด ์
์ด ์ด๋ค ์ญํ ์ ํ๋ ๊ฑด์ง ์ดํด ํ๊ธฐ ์์ ํ๋ค!!
์ด์ Istio ๊ณต์ ๋ธ๋ก๊ทธ ํฌ์คํธ๋ค ์ข ์ฝ์ด๋ณด๊ณ , ๋ฌธ์ ์ข ๊ผผ๊ผผํ ์ฝ์ด๋ณด๋ฉด์ ์ํ ์ค๋น๋ฅผ ๊ณ์ ํ ๊ฒ ๊ฐ๋ค. ์ํ๊น์ง ์ด์ D-16
โฆ ํ์ดํ
โฆ! ๐ฅ