ํด๋น ๊ธ์ ์ด์คํฐ์ค ์ธ ์ก์ ์ด๋ผ๋ ์ฑ ์ ์ผ๋ถ ํํธ๋ฅผ ์ฐธ๊ณ ํ์๊ณ , ์ฑ ์์ ๋ค๋ค๋ ๋ฐฉ๋ฒ๋ณด๋ค ํ ๋จ๊ณ ๋ ๋์๊ฐ์ ์งํํ๋ ๋ด์ฉ์ ๋ฐํ์ผ๋ก ์์ฑํ์์ต๋๋ค.
์ด์คํฐ์ค ์ธ ์ก์ ์ ์ด์คํฐ์ค์ ๊ดํ ์ฑ ์ธ๋ฐ, ์ต๊ทผ์ ์ฝ์๋ ์ค์ ์ฑ ์ค์ ๊ฐ์ฅ ํฅ๋ฏธ๋กญ๊ฒ ์ฝ์ ์ฑ ์ด์์ต๋๋ค.
์ด์คํฐ์ค๊ฐ ๊ถ๊ธํ๋ค๋ฉด ๋ง์ ๋์์ ์ป์ ์ ์๋ ์ฑ ์ผ๋ก ์ ๊ทน ์ถ์ฒํฉ๋๋ค!
๋ค์ ๋ณธ๋ก ์ผ๋ก ๋์์์ ksniff ๋ tcpdump ๋ฅผ ์ฌ์ฉํด ํ๋์ ๋คํธ์ํฌ ํธ๋ํฝ์ ํฌ์ฐฉํ๊ณ ์ด๋ฅผ ์์ด์ด์คํฌ๋ก ๋ฆฌ๋ค์ด๋ ํธํ๋ kubectl ํ๋ฌ๊ทธ์ธ์ ๋๋ค.
ksniff ๋ฅผ ์ค์นํ๊ธฐ ์ํด์ ์ฐ์ krew ๋ฅผ ๋จผ์ ์ค์นํด์ฃผ์ด์ผ ํฉ๋๋ค.
krew ๋ฌธ์๋ก ๊ฐ์ ๊ทธ๋๋ก ์งํํด์ค๋๋ค.
์ ๊ฐ์ ๊ฒฝ์ฐ๋ ์๋ ์ ์คํฌ๋ฆฝํธ๋ฅผ ์คํ์์ผฐ์ต๋๋ค.
$ (
set -x; cd "$(mktemp -d)" &&
OS="$(uname | tr '[:upper:]' '[:lower:]')" &&
ARCH="$(uname -m | sed -e 's/x86_64/amd64/' -e 's/\(arm\)\(64\)\?.*/\1\2/' -e 's/aarch64$/arm64/')" &&
KREW="krew-${OS}_${ARCH}" &&
curl -fsSLO "https://github.com/kubernetes-sigs/krew/releases/latest/download/${KREW}.tar.gz" &&
tar zxvf "${KREW}.tar.gz" &&
./"${KREW}" install krew
)
์ดํ ~/.zshrc์ PATH ๋ฅผ ๋ฑ๋กํด์ฃผ์์ต๋๋ค.
$ export PATH="${KREW_ROOT:-$HOME/.krew}/bin:$PATH"
krew ๋ฅผ ์ค์นํ์ผ๋ฉด ์๋ ๋ช ๋ น์ด๋ฅผ ํตํด ksniff ๋ฅผ kubectl ํ๋ฌ๊ทธ์ธ์ผ๋ก ์ค์นํด์ค๋๋ค.
$ kubectl krew install sniff
install ํด์ค ๋๋ ksniff ๊ฐ ์๋๊ณ sniff ๋ก ์์ฑํฉ๋๋ค.
๊ทธ ๋ค์์ผ๋ก ์์ด์ด์คํฌ๋ ์ค์นํด์ค๋๋ค.
$ brew install wireshark
๊ทผ๋ฐ ์ฌ๊ธฐ์ ํ๊ฐ์ง ์์๋ ๊ฒ์ด ์๋๋ฐ ksniff ๋ wireshark ๋ฅผ CLI ๋ก ์คํ์ํค๊ธฐ ๋๋ฌธ์ ํฐ๋ฏธ๋์์ wireshark ๋ฅผ ์คํํ ์ ์์ด์ผ ํฉ๋๋ค.
๊ทธ๋ฐ๋ฐ ์๋์ฒ๋ผ ๋ช ๋ น์ด๋ฅผ ๋ ๋ฆฌ๋ฉด not found wireshark ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค.
$ wireshark -v
wireshark(v4.4.2) ๊ธฐ์ค์ผ๋ก ํฐ๋ฏธ๋์ฉ์ tshark๋ฅผ ์ฌ์ฉํด์ผ ํ๋๋ฐ, ์ ๋ ์ฌ์ ํ wireshark ๋ช ๋ น์ด๋ฅผ ์ฐ๊ณ ์ถ์์ต๋๋ค.
๋ฌผ๋ก tshark๋ฅผ ์ฐ๋ ๋ฐฉ๋ฒ๋ ๋ฌธ์์๋ ๋์์๊ธด ํฉ๋๋ค.
๊ทธ๋ฐ๋ฐ ์ด๋ ๊ฒ ํ ๊ฒฝ์ฐ ์์ด์ด์คํฌ์ GUI ํ๋ฉด์ด ์๋๊ณ CLI ํ๋ฉด์ผ๋ก ํ ์คํธ๋ง ๋ด์ผํด์ ๋ถํธํ๊ธฐ ๋๋ฌธ์ wireshark ๋ฅผ ๊ณ ์งํ์ต๋๋ค.
๊ทธ๋์ ์ด๊ฒ์ ๊ฒ ์ฐพ์๋ณธ ๊ฒฐ๊ณผ ๋คํํ ๋ฐฉ๋ฒ์ ์ฐพ์ ์ ์์์ต๋๋ค.
Home Brew ๋ก ์์ด์ด์คํฌ๋ฅผ ์ค์นํ์ผ๋ฉด /Applications/Wireshark.app/Contents/MacOS/Wireshark ๊ฒฝ๋ก์ ์คํํ์ผ์ด ์กด์ฌํ๊ฒ ๋ ํ ๋ฐ,
์ด ์คํํ์ผ์ PATH bin ์ผ๋ก ์ํํธ๋งํฌ ๊ฑธ์ด์ฃผ๋ฉด ๋ฉ๋๋ค.
$ sudo ln -s /Applications/Wireshark.app/Contents/MacOS/Wireshark /usr/local/bin/wireshark
๊ทธ๋ฌ๋ฉด wireshark ๋ช ๋ น์ด๊ฐ ์ ์คํ๋ฉ๋๋ค.
์ํํธ๋งํฌ๋ ์ ๊ฑธ๋ ค์๋ค์
ํน์ ๋ ๋์ ๋ฐฉ๋ฒ์ด ์๋ค๋ฉด ์๋ ค์ฃผ์ธ์!
๊ทธ๋ผ ์ด์ ksniff ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ ์ค๋น๋ฅผ ๋ง์ณค์ผ๋, ๋ค์์ผ๋ก ์์ ์ํฉ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์์ ์ํฉ์ ์ฐ์ธ ์ฝ๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค๋ฃจ์ง ์๊ฒ ์ต๋๋ค.
๊ถ๊ธํ์๋ค๋ฉด ์ด์คํฐ์ค ์ธ ์ก์ ์ฑ ์ ๊ตฌ๋งคํ์ ์ ํ์ธํ์๊ธธ ๋ฐ๋๋๋ค.
์ธ๊ทธ๋ ์ค ๊ฒ์ดํธ์จ์ด๋ฅผ ํตํด์ ์์ฒญ์ด ๋ค์ด์ค๋ฉด ๊ฒ์ดํธ์จ์ด๋ v1 ๊ณผ v2 ์๋ธ์ ์ 2:8 ํ๋ฅ ๋ก ์์ฒญ์ ๋ผ์ฐํ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ catalog v2 ์ ํ ํ๋๋ ์๋ตํ๋ ๋ฐ 0.5์ด ์ด์์ด ๊ฑธ๋ฆฌ๋๋ฐ, ์ด๋ VirtualService ์์ ์ค์ ํ๋๋ก 0.5์ด ์ด์์ด ๊ฑธ๋ฆฌ๋ฉด ํ์ ์์์ด ๋ฐ์ํ๋์ง ํ ์คํธํ๊ธฐ ์ํจ์ ๋๋ค.
๋จผ์ ์ธ๊ทธ๋ ์ค ๊ฒ์ดํธ์จ์ด์ ํฌํธ ํฌ์๋ฉ์ ํด์ค๋๋ค.
$ kubectl port-forward -n istio-system deployments/istio-gateway 80:80
๊ทธ ๋ค์ ์์ฒญ์ ์์ฑํ๊ธฐ ์ํ ๋ช ๋ น์ด๋ฅผ ์คํ์์ผ์ค๋๋ค.
$ for i in {1..1000}; do curl http://localhost/items -H "Host: catalog.istioinaction.io" -w "\nStatus Code %{http_code}\n"; sleep .5s; done
ksniff ๋ ์คํํด์ค๋๋ค.
$ kubectl sniff catalog-v2-6c7cf7bf-2sptr -i lo
ํฐ๋ฏธ๋์๋ ์๋์ ๊ฐ์ ํ ์คํธ๊ฐ ์ฐํ ๊ฒ์ด๊ณ ,
์์ด์ด์คํฌ GUI ๊ฐ ๊ณง๋ฐ๋ก ์คํ๋ฉ๋๋ค.
์๋ ๋นจ๊ฐ์ ๋ค๋ชจ๋ฅผ ์ดํด๋ณผ ๊ฒ์ธ๋ฐ,
์ปค๋ฅ์ (3-way-handshake)์ด ์์ฑ๋์๋ค๊ฐ ์ข ๋ฃ(4-way-handshake) ๋๋ ๊ณผ์ ์ ๋ณผ ์ ์์ต๋๋ค.
๊ทธ๋ฐ๋ฐ /items ์๋ํฌ์ธํธ์ 200 ์๋ต์ ์๋ฐ๋ค๊ฐ ๊ฐ์๊ธฐ ์ปค๋ฅ์ ์ด ์ข ๋ฃ๋๋ ๊ฑธ ๋ณผ ์ ์๋๋ฐ, ์ด๋ ์๋ต ์๋๊ฐ ๋๋ฆฐ ํ๋๋ก ์ธํด ํ์ ์์(0.5 ์ด ์ด์)์ด ๋ฐ์ํด์ ์ด์คํฐ์ค ํ๋ก์๊ฐ ์ปค๋ฅ์ ์ ์ข ๋ฃ์ํจ ๊ฒ์ ๋๋ค.
์ด๋ก ์ธํด ์ธ๊ทธ๋ ์ค ๊ฒ์ดํธ์จ์ด๋ 504 ์๋ต์ ๋ฐ์์ ๊ฒ์ ๋๋ค.
catalog ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ์ ๊ฒฝ์ฐ์๋ ์ธ๊ทธ๋ ์ค ๊ฒ์ดํธ์จ์ด ์ ์ฅ์์ ์๋ฒ์ด๊ณ , ์ด ์๋ฒ๊ฐ ์ง์ 504 ์๋ต์ ํ๊ฑด ์๋๊ธฐ ๋๋ฌธ์(catalog ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด์คํฐ์ค ํ๋ก์๊ฐ ํด์ค) 504 ๊ด๋ จํ ์ฝ๋๋ ํ์ธํ ์ ์์ต๋๋ค.
์ด์คํฐ์ค ํ๋ก์ ๊ด์ ์์ ๋๊ฐ ํด๋ผ์ด์ธํธ์ด๊ณ , ๋๊ฐ ์๋ฒ์ธ์ง ๊ตฌ๋ถ์ ๋ช ํํ ํด์ผ ์ดํดํ๊ธฐ ์ฝ์ต๋๋ค.
์ฑ ์์ ์ฌ์ค ์ฌ๊ธฐ๊น์ง ๋ค๋ฃจ๊ณ ๋ค๋ฅธ ์คํ ์ผ๋ก ๋์ด๊ฐ๋๋ฐ, ์ ๋ ์ธ๊ทธ๋ ์ค ๊ฒ์ดํธ์จ์ด๊ฐ 504 ์๋ต์ ๋ฐ๋ ๊ฒ๊น์ง ์์ด์ด์คํฌ๋ก ํ์ธํ๊ณ ์ถ์์ต๋๋ค.
๊ทธ๋ฐ๋ฐ ๋ฌธ์ ๊ฐ ํ๋ ์์๋๋ฐ ksniff ๋ tcpdump ๊ฐ ํ์ํ๊ณ , tcpdump ๊ฐ /tmp/static-tcpdump ์์น์ ์์ด์ผ ํฉ๋๋ค.
์ธ๊ทธ๋ ์ค ๊ฒ์ดํธ์จ์ด ๊ฐ์ ๊ฒฝ์ฐ tcpdump ๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ค์น๋๊ธด ํ์ง๋ง ๋น์ฐํ /tmp/static-tcpdump ์ ์์ง๋ ์์ต๋๋ค. ์ํํธ๋งํฌ๋ฅผ ๊ฑธ์ด์ฃผ๋ฉด ํด๊ฒฐ๋๊ฒ ์ง๋ง, ๊ตณ์ด ์ธ๊ทธ๋ ์ค ๊ฒ์ดํธ์จ์ด๋ฅผ ๊ฑด๋ค๊ณ ์ถ์ง ์์์ด์.
์ด์ฐจํผ ์ธ๊ทธ๋ ์ค ๊ฒ์ดํธ์จ์ด๋ ์ด์คํฐ์ค ํ๋ก์๋ฅผ ํ๊ฒ ํ๊ธฐ ์ํ ์๋จ์ด์๊ธฐ ๋๋ฌธ์ ์ด์คํฐ์ค ํ๋ก์๋ฅผ ๊ฐ์ง๋ Nginx ํ๋๋ง ์์ผ๋ฉด ๊ฐ์ ํจ๊ณผ๋ฅผ ๋ณผ ์ ์๋ค๊ณ ์๊ฐํ์ฌ Nginx ํ๋๋ฅผ ์์ฑํ์์ต๋๋ค.
์ดํ VirtualService ๋ ์๋์ ๊ฐ์ด ์์ฑํ์ต๋๋ค.
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: nginx-catalog-v1-v2
namespace: istioinaction
spec:
hosts:
- "catalog.istioinaction"
http:
- route:
- destination:
host: catalog.istioinaction.svc.cluster.local
subset: version-v1
port:
number: 80
weight: 20
- destination:
host: catalog.istioinaction.svc.cluster.local
subset: version-v2
port:
number: 80
weight: 80
timeout: 0.5s
๊ทธ๋ฆฌ๊ณ Nginx ํ๋ ์์ผ๋ก ๋ค์ด๊ฐ์ ์๋์ ๊ฐ์ ๋ช ๋ น์ด๋ฅผ ๋๊ฐ์ด ๋ ๋ ค์ค๋๋ค.
$ for i in {1..1000}; do curl http://catalog.istioinaction/items -w "\nStatus Code %{http_code}\n"; sleep .5s; done
์ฟ ๋ฒ๋คํฐ์ค DNS ๋ก ์ ๊ทผํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ curl ๋ช ๋ น์ด์ ๋ ์ด์ Host ํค๋๋ ํ์์์ต๋๋ค.
504 ์๋ฌ๊ฐ ๋ฐ์ํ๋ ๊ฑธ ํ์ธํ ์ ์๊ณ , ์ด๊ฑธ ๊ณง๋ฐ๋ก ksniff ๋ก ํ์ธํด๋ด ๋๋ค.
์๋ ๋ช ๋ น์ด๋ก sniff ๋ฅผ ์คํํฉ๋๋ค.
$ kubectl sniff nginx -i lo
๊ทธ๋ฐ๋ฐ ์๋ง ์๋์ ๊ฐ์ ์๋ฌ๊ฐ ๋ฐ์ํ ๊ฒ์ ๋๋ค.
ksniff ๋ฅผ tcpdump ๋ฅผ ์ฌ์ฉํ๋ค๊ณ ํ๋๋ฐ ๊ธฐ๋ณธ์ ์ธ Nginx ์ด๋ฏธ์ง๋ tcpdump ๊ฐ ์๊ธฐ ๋๋ฌธ์ด์ฃ .
๊ทธ๋์ ์ค์นํด์ค๋๋ค.
$ apt update && apt install -y tcpdump
๊ทธ๋ฐ๋ฐ ์ฌ์ ํ ์๋ฌ๊ฐ ๋ฐ์ํ ํ ๋ฐ tcpdump ์คํ ํ์ผ์ ksniff ๊ฐ ์คํํ๋ ์์น๋ก ์ฎ๊ฒจ์ฃผ๋ฉด ๋ฉ๋๋ค.
$ rm /tmp/static-tcpdump && ln /bin/tcpdump /tmp/static-tcpdump
ํด๋น ์ด์๋ ์ฌ๊ธฐ์ ํ์ธํ ์ ์์ต๋๋ค.
๋ค์ ๋ณธ๋ก ์ผ๋ก ์์ ๋ค์ ksniff ๋ฅผ ์คํํ๋ฉด ์์ด์ด์คํฌ๋ก ๋ฆฌ๋ค์ด๋ ์ ์ด ๋ ๊ฒ์ด๊ณ , ์ด๋ฒ์ 504 ์๋ต์ ๋ฐ์ ํธ๋ํฝ์ ์บก์ฒํ ์ ์์ต๋๋ค.
catalog ์ ํ๋ฆฌ์ผ์ด์ ์์ ํ์ธํ ์ ์์๋ 504 ์๋ต ์ฝ๋๋ฅผ ์ด๋ป๊ฒ nginx ์ ํ๋ฆฌ์ผ์ด์ ์์ ํ์ธํ ์ ์์์๊น์?
์์์ ๋ดค๋ ๊ทธ๋ฆผ์์ ์ปจํ ์ด๋๊น์ง ํ์ํด๋ดค์ต๋๋ค.
catalog ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ์ ๊ฒฝ์ฐ๋ ์๋จ Istio Proxy ์์๋ถํฐ ์ปค๋ฅ์ ์ด ์ข ๋ฃ๋๊ธฐ ๋๋ฌธ์ 504 ์ ๊ดํ ์๋ต์ ๋ฐ์ ์ ์์ต๋๋ค.
์ปค๋ฅ์ ๋ง ์ฐ๊ฒฐ๋๊ณ ๊ธฐ๋ค๋ฆฌ๋ค๊ฐ 0.5์ด๊ฐ ์ง๋๋ฉด Istio Proxy ๊ฐ ๋์ด๋ฒ๋ฆฌ์ฃ .
๊ทธ๋ฆฌ๊ณ nginx ์ ํ๋ฆฌ์ผ์ด์ ์ Istio Proxy ๋ก๋ถํฐ ๋ฐ์ ์๋ต์ ๋ณธ์ธ ํ๋์ Istio Proxy ๋ก๋ถํฐ ์ ๋ฌ๋ฐ๊ธฐ ๋๋ฌธ์ ์๋ต์ ์บก์ฒํ ์ ์์์ต๋๋ค.
์ค๋์ ksniff ์ ๋ํด ์์๋ดค๋๋ฐ์, ๊ต์ฅํ ํฅ๋ฏธ๋ก์ด ๋๊ตฌ์ธ๊ฑฐ ๊ฐ์์. ํ๋ ๊ฐ ํธ๋ํฝ์ ์บก์ฒํ๋ ๊ฒ์ด ์์ ๋ถํฐ ๊ต์ฅํ ๊ณ ๋ฏผ์ด์๋๋ฐ ํ์ธต ๋์ด์ฃผ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๊ทธ๋ฐ๋ฐ ์ฌ์ ํ tcpdump ๊ฐ ์๋ ์ปจํ ์ด๋์๋ ์ค์นํด์ค์ผ ํ๋ค๋ ๊ฒ์ด ๋ถํธํ๊ธด ํฉ๋๋ค.
(Istio Proxy๋ ๊ธฐ๋ณธ์ ์ผ๋ก tcpdump๊ฐ ์์ผ๋ ์์ธ๋ก ๊ด์ฐฎ์์ง๋?!)
๊ทธ๋ผ ์ค๋์ ์ฌ๊ธฐ๊น์ง~
'DevOps > Istio' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Istio] ์ฟ! ์ฐ๋ฆฌ๋ง์ ๋น๋ฐ์ด์ผ - mTLS (๊ฒ์ฆํธ) (9) | 2023.08.17 |
---|---|
[Istio] ์ฟ! ์ฐ๋ฆฌ๋ง์ ๋น๋ฐ์ด์ผ - mTLS (ํ์ธํธ) (0) | 2023.07.02 |
[Istio] IngressGateway ์ TLS ๋ฅผ ์ ์ฉํด๋ณด์! (1) | 2023.05.18 |
[Istio] Istio Ingress ์ ALB ๋ฅผ ๋ถ์ฌ๋ณด์ ! (0) | 2023.02.12 |