์ด์คํฐ์ค๋ ๋๋ฒ๊น ์ด ์ด๋ ค์ด ํด ์ค ํ๋๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ ์ด์ ๋ ๊ฐ๋จํ์ฃ . ์ด์คํฐ์ค ์์ฒด๊ฐ ์ด๋ ต๊ธฐ ๋๋ฌธ์ ๋๋ค.
์๋น์ค ๋ฉ์ ํด ๋ต๊ฒ ๋ง์ ๋คํธ์ํฌ ์ง์์ ์๊ตฌํ๊ธฐ ๋๋ฌธ์ ๋๋ฒ๊น ์ด ์ด๋ ค์ธ ์ ๋ฐ์ ์์ต๋๋ค. ๋คํธ์ํฌ ๊ด๋ จ๋ ๋ถ๋ถ์ด ๋ง๊ธฐ ๋๋ฌธ์ ์ด๋์๋ถํฐ ๋๋ฒ๊น ์ ํด์ผ ํ๋์ง ๊ฐ๋ ์ฌ์ค ์ ์ ์ต๋๋ค.
์ด๊ฒ ์ด์คํฐ์ค ๋ฌธ์ ์ธ๊ฐ? ํด๋ผ์ฐ๋ ๋ฌธ์ ์ธ๊ฐ? ์ฟ ๋ฒ๋คํฐ์ค ๋ฌธ์ ์ธ๊ฐ? ํ๋จํ๊ธฐ๊น์ง๋ ์ค๋ ๊ฑธ๋ฆฌ์ฃ .
๊ทธ๋ฌ๋ค ๋ณด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌํ๋ ์ค ์ฝ๊ฐ์ด๋ผ๋ ์ด์คํฐ์ค์ ๊ด๋ จํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค๊ณ ์๊ฐํ๋ ๊ฒฝ์ฐ ๊ทธ๋ฅ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ด์คํฐ์ค๋ฅผ ๋นผ๋ฒ๋ฆฝ๋๋ค.
์ ํํ๋ ์ด์คํฐ์ค ์ฌ์ด๋์นด(ํ๋ก์)๋ฅผ ๋ ์ด๋ธ์ ํตํด ์ธ์ ์ ์์ ์ ์ธ์์ผ ๋ฒ๋ฆฌ๋ ๊ฒ์ด์ฃ .
์ด์คํฐ์ค ์ฌ์ด๋์นด๋ฅผ ์ฃผ์ ํ์ง ์์๊ธฐ ๋๋ฌธ์ ๋๋ถ๋ถ์ ๋ฌธ์ ๋ ํด๊ฒฐ๋์ง๋ง, ์ด๋ ๊ทผ๋ณธ์ ์ธ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์๋๋๋ค.
๊ทธ๋๋ ์ด์คํฐ์ค ์ฌ์ด๋์นด๋ฅผ ์ ์ธํ๋ ๊ฑด ์ด๊ฒ ์ด์คํฐ์ค์ ๋ฌธ์ ์ธ์ง ํ๋จํ๊ธฐ์ ์ข์ ์งํ๊ฐ ๋ ์ ์์ฃ .
๋บ ๋ ๋นผ๋๋ผ๋ ์ด์ ์ ๋๋ ๊ด์ฐฎ์์?
ํ์ง๋ง ์ด์คํฐ์ค ๊ธฐ๋ฅ์ด ํ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ผ๋ฉด ์ด์คํฐ์ค ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๊ฒ ์ฃ .
๋ฌด์์ ์ด์คํฐ์ค๋ฅผ ๋๋ฒ๊น ํ๋ ๊ฒ๋ณด๋จ ์ ๋ง ์ด์คํฐ์ค๊ฐ ํ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ธ์ง ํ์ ํ๋ ๊ฒ๋ ์ค์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ง์ฝ ์ด์คํฐ์ค๊ฐ ๊ตณ์ด ํ์ ์๋ค๋ฉด, ๊ทธ๋ฅ ์ด์คํฐ์ค ์ฌ์ด๋์นด๋ฅผ ๋นผ๋ ๊ฒ์ด ์ ์ ๊ฑด๊ฐ์ ์ข์ ์๋ ์์ต๋๋ค.
์์ผ๋ก๋ ๋จ์ํ ์ด์คํฐ์ค ์ฌ์ด๋์นด๋ฅผ ๋นผ๋ ๊ฒ์ด ์๋๋ผ ์ ์ ํ ๋๋ฒ๊น ์ ํตํด ์ด์คํฐ์ค์ ๊ด๋ จํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ๋์์ด ๋ ์ ์๋๋ก "Istio ๋ฅผ ๋๋ฒ๊น ํด๋ณด์" ์๋ฆฌ์ฆ๋ฅผ ์์ํด๋ณด๊ณ ์ ํฉ๋๋ค.
(์๋ฆฌ์ฆ๋ผ๊ณ ๋ ํ์ง๋ง ์ด์ํ๋ ํ๊ฒฝ์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์์ผ๋ฉด ์๋ฆฌ์ฆ๋ ๋ฐ๋ก ์ฌ๊ธฐ์ ๋๋ ์ง๋??!!)
๊ทธ ์ค์์๋ ์ด๋ฒ์๋ "Connection Refused" ์ ๊ด๋ จํ ๋๋ฒ๊น ๋ฐฉ๋ฒ์ ์๊ฐํ๊ณ ์ ํฉ๋๋ค.
๋ ์ธ ๋๋์ฝ๋~
์ํฉ
์ํฉ์ Action Runner Controller(์ดํ ARC) ๋ฅผ ๋ฐฐํฌํ๋ค๊ฐ ๋ฐ์ํ์ต๋๋ค.
ARC ๋ ์ฟ ๋ฒ๋คํฐ์ค์์ ํ๋ ๋จ์๋ก Self Hosted Runner ๋ฅผ ๊ตฌ๋ํ ์ ์๋๋ก ๋์์ฃผ๋ ํด์ ๋๋ค.
Controller, Listener, Runner ํฌ๊ฒ 3๊ฐ์ง ์ปดํฌ๋ํธ๋ก ๊ตฌ๋ถํ ์ ์๋๋ฐ Listener ์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ฃ .
๋ก๊ทธ ๋ด์ฉ์ ๋๋ต ์์ฝํด ๋ณด์๋ฉด
- /access_tokens(1๋ฒ) ์๋ํฌ์ธํธ๋ฅผ ํตํด Github App Auth ์ Access Token ์ ์ป๊ณ ์ ํจ
- DNS ์ฟผ๋ฆฌ๋ ์ฑ๊ณต์ ์ผ๋ก ์ํํ์ผ๋ Connection Refused ๊ฐ ๋ฐ์ํจ
ํ๋ ์ด์ํ ์ ์ /access_tokens(1๋ฒ)์ ๋ํ ์๋ํฌ์ธํธ๋ง Connection Refused ๊ฐ ๋ฐ์ํ๊ณ , ๋ฐ๋ก ๋ค์์ ์คํํ /registration-token (2๋ฒ)๊ณผ /runner-registration(3๋ฒ) ์๋ํฌ์ธํธ๋ ๊ด๋ จํ ์๋ฌ ๋ก๊ทธ๊ฐ ์ ์ฐํ๋ค๋ ์ ์ ๋๋ค.
์ด ๋ํ ๊ธ ํ๋ฐ๋ถ์์ ์ ์ด๋ฐ ์ผ์ด ์ผ์ด๋ฌ๋์ง ์ ์ ์์ต๋๋ค!
์์ธ
๊ทธ๋ผ ์ด์ ์ด๋ฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋์ง ์์ฐจ์ ์ผ๋ก ์์๋ณด์ฃ !
Manifests
์ฐ์ ๋ฐฐํฌ๋ ์ฟ ๋ฒ๋คํฐ์ค API ๋, ์ด์คํฐ์ค API ์ชฝ์ ์ ๋ถ ์ ์์ด์์ต๋๋ค.
ํ ์คํธ๋ค ๋ณด๋ Istio SideCar API ๋ ALLOW_ANY ๋ก ํด์ค์ผ๋ก์จ ์์๋ฐ์ด๋๋ฅผ ๋ฑํ ์ ํํ์ง ์์์ต๋๋ค.
Code
๋ค์ ํ๋ฒ ๋ก๊ทธ ๋ด์ฉ์ ๋ณด๋ฉด Retryble client error ์ ์๋ ๋ด์ฉ์ Client ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ฐํํด ์ฃผ๋ ์๋ฌ๋ฅผ ๊ทธ๋๋ก ๋ณด์ฌ์ฃผ๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ฆ, ์ฝ๋ ๋จ์ ์ด๋ ํ ๋ก์ง์ด ๋ฌธ์ ๊ฐ ์์ด์ ๋ฐ์ํ๋ค๋ผ๊ธฐ ๋ณด๋ค๋ Client ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด POST /access_token ์ ํธ์ถํ๋๋ฐ Connection Refused ๊ฐ ๋ฐ์ํ๊ณ , ์ด๋ฅผ ๊ทธ๋๋ก ๋ฆฌํดํด์ค ๊ฒ์ด์ฃ .
๊ทธ๋๋ ํ์ ํ ๊ฒ์ด ์ข์ผ๋, ๋ก๊ทธ์ ์๋ ์๋ฌ ๋ด์ฉ์ ํธ๋ ์ด์ฑ ํด๋ณด๊ฒ ์ต๋๋ค.
์ ๋ ๋ณดํต ์ฝ๋๋ฅผ ์ดํด๋ณผ ๋ ๋ก๊ทธ๋ฅผ ์ฝ๋์์ ๊ฒ์ํด ๋ด ๋๋ค. ๊ทธ๋์ ๋ฐ๋ก ARC ์ฝ๋๋ฅผ Pull ํด์ ๊ด๋ จํ ๋ก๊ทธ ๋ด์ฉ์ด ์๋์ง ๊ฒ์ํด ๋ณด์ฃ .
์๋ฌ ํธ๋ ์ด์ฑ์ ๋์์๋ go ํ์ผ๋ค์ ํ๋์ฉ ๋ฐ๋ผ๊ฐ๋ ์๊ด์๋๋ฐ ์ฐ๋ฆฌ๋ ์๊ฐ์ด ์์ผ๋ ๋ฐ๋ก ๋ก๊ทธ๋ฅผ ๊ฒ์ํด ๋ด ๋๋ค.
๋คํํ ๊ฒ์ํด ๋ณด๋ ์ด๋์ ํธ์ถํ ๋ก๊ทธ์ธ์ง ๋ฐ๋ก ๋์์ต๋๋ค.
1052 ์ค์ ๋ณด๋ฉด ์๋ํฌ์ธํธ๋ฅผ ํธ์ถํ๋ ํจ์๊ฐ ๋ณด์ ๋๋ค.
๊ตฌํ๋ ํจ์ ์ฝ๋๋ฅผ ๋ณด๋ฉด ์ด์ฐ์ด์ฐํด์ Request ๋ฅผ Send() ํด์ค๋๋ค.
๋ Send() ๋ฅผ ์ดํด๋ณด๊ฒ ๋๋ฉด, RoundTrip() ์ด๋ผ๋ ํจ์๊ฐ ์๋๋ฐ
ํ๊ณ ํ๊ณ ๋ค์ด๊ฐ๋ฉด ํด๋น ํจ์๋ฅผ ํตํด ์คํจํ ์์ฒญ์ ๋ํด ์ฌ์๋๋ฅผ ํ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
์ด ๋ง์ /access_tokens ์ ์คํจํ ๊ฒฝ์ฐ retry ํ์๋งํผ ๊ณ์ ์๋๋ฅผ ํ๋ค๋ ๊ฒ์ด์ฃ .
๊ทธ๋ฐ๋ฐ ๋ก๊ทธ๋ฅผ ๋ณด๋ฉด /access_tokens ์ ๋ํ ์์ฒญ ์คํจ๋ ํ๋์ด๊ณ , ๋ค์ ๋ก๊ทธ๋ค์ด ์ฐํ ๊ฑธ ๋ณผ ์ ์์ต๋๋ค.
์ด๊ฑธ๋ก ์ด์ฐ ๋๋ ํ ๋ฒ์ ์ฌ์๋ ๊ฒฐ๊ณผ /access_tokens ์ ์ฑ๊ณตํ๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
์ฑ๊ณตํ๋ค๋ ๋ ๋ค๋ฅธ ๊ทผ๊ฑฐ๋ ์๋ ์ฝ๋์์ ํ์ธํ ์ ์์ต๋๋ค.
getting access token for GitHub App auth ๋ผ๋ ๋ก๊ทธ๋ c.fetchAccessToken ํจ์ ์์์ ๋ฐ์ํ๋ ๊ฒ์ด๊ณ , getting runner registration token ์ ์ด๋ฏธ์ง์์ ๋ณด์๋ค์ํผ ๋ฐ๋ก ๋ฐ์ ์ชฝ์์ ๋ฐ์ํ ๊ฑธ ์ ์ ์์ต๋๋ค.
์ด๋ ๊ณง c.fetchAccessToken ์ด ์ฌ์๋๋ ํ์ง๋ง ์ฑ๊ณต์ ์ผ๋ก ์ํ๋์๋ค๋ ๊ฑธ ์ ์ ์์ต๋๋ค.
์ฝ๋ ์ดํด๋ณธ ๊ฒฐ๊ณผ ์ฐ๋ฆฌ๋ ์๋์ ๊ฐ์ด ์ ๋ฆฌํ ์ ์์ต๋๋ค.
- /access_tokens ์๋ํฌ์ธํธ์ ๋ํ ์คํจ ๋ก๊ทธ๊ฐ ์ฐํ์ง๋ง, ์ด๋ ํ ๋ฒ์ ์ฌ์๋ ์ดํ์ ์ฑ๊ณต์ ์ผ๋ก ํธ์ถ ๋์๋ค๋ ๊ฑธ ์ ์ ์์
- ์ฌ์๋๋ก ์ธํด ์ฑ๊ณตํ๊ธฐ ๋๋ฌธ์ ๋ค์ ์๋ํฌ์ธํธ์ธ /registration-token ๋ ์ฑ๊ณต์ ์ผ๋ก ํธ์ถ๋จ
- ๊ฒฐ๊ตญ ARC ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์์ ์ผ๋ก ์คํ๋จ
- ๊ทธ๋ฐ๋ฐ, ์ ๋ฐ๋ก ์ฑ๊ณต ๋ชปํ๊ณ ํ๋ฒ์ ์ฌ์๋ ์ดํ์ ์ฑ๊ณตํ์๊น? ๋ผ๋ ์๋ฌธ์ ์ด ์๊น
TCPDUMP
์ฝ๋ ๋ ๋ฒจ์์ ํ์ธํ ์ ์๋ ์ ๋ณด๋ ๋ ์ด์ ์์ผ๋ ์ด์ ๋ ์ด๋ ํ ํจํท๋ค์ด ARC ์ ํ๋ฆฌ์ผ์ด์ ์ ์ง๋๊ฐ๋์ง ํ์ธํด ๋ณด๊ฒ ์ต๋๋ค.
๊ทธ๋ฐ๋ฐ ARC ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก๋ tcpdump ๋ฅผ ์ฌ์ฉํ๊ธฐ ํ๊ณ๊ฐ ์์ผ๋, ๋์ผํ ๋ ธ๋์ ๋์ผํ ๋ค์์คํ์ด์ค์ ์ด์คํฐ์ค ์ฌ์ด๋์นด๋ฅผ ์ฃผ์ ํ Nginx ๋ฅผ ๋ฐฐํฌํด์ ํจํท์ ์บก์ฒํด ๋ณด๊ธฐ๋ก ํ์ต๋๋ค.
apiVersion: v1
kind: Pod
metadata:
name: sniff-01
namespace: sniff-01
labels:
app: sniff-01
spec:
containers:
- name: sniff-01
image: nginx:latest
securityContext:
privileged: true
ports:
- containerPort: 80
command:
- bash
- -c
- apt update && apt install -y tcpdump procps && rm -f /tmp/static-tcpdump && ln /bin/tcpdump /tmp/static-tcpdump && nginx -g "daemon off;"
๊ทผ๋ฐ ๋ฌธ์ ๊ฐ ์ ํ ์๋ณด์ ๋๋ค.
๋ ์ ๊ธฐํ ๊ฒ์ Nginx ์์์ /access_tokens ๋ฅผ ํธ์ถํด ๋ดค๋๋ฐ ์คํจ ์์ด ํ ๋ฒ์ ์ฑ๊ณตํ์ต๋๋ค.
curl -L \
-X POST \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer <TOKEN>" \
-H "X-GitHub-Api-Version: 2022-11-28" \
https://api.github.com/app/installations/xxxxxx/access_tokens
์ฐธ๊ณ ๋ก ์ ์๋ํฌ์ธํธ์ ์ฌ์ฉ๋๋ <TOKEN> ๊ฐ์ ์๋ ์ฝ๋๋ฅผ ์คํํด์ ์ป์ ์ ์์ต๋๋ค.
//- npm ์ค์นํ๊ธฐ
//- npm install jsonwebtoken
const jwt = require('jsonwebtoken');
const fs = require('fs');
const privateKey = fs.readFileSync('./private-key.pem'); //- GitHub App ์์ ๋ฐ๊ธ๋ฐ์ ์ ์์
const payload = {
iat: Math.floor(Date.now() / 1000), // ํ์ฌ ์๊ฐ (์ด)
exp: Math.floor(Date.now() / 1000) + 600, // 10๋ถ ํ ๋ง๋ฃ
iss: '1131645', // GitHub App์ App ID
};
const token = jwt.sign(payload, privateKey, { algorithm: 'RS256' });
console.log(token);
ํ .. ์ Nginx ์์ ํ๋ฒ์ ์ฑ๊ณตํ์ง..??
๊ทธ๋ฌ๋ ์ค ํจํท์์ ๋จ์๋ฅผ ์ป์ ์ ์์์ต๋๋ค.
๋นจ๊ฐ์ ๋ค๋ชจ๋ฅผ ์น ํจํท์ ๋ณด๋ฉด DPort ๊ฐ 15001์ ๋๋ค. 15001 ํฌํธ๋ ์ด์คํฐ์ค ํ๋ก์์ ์ธ๋ฐ์ด๋ ํฌํธ์ ๋๋ค.
์ด๊ฒ ๋ฌด์จ ๋ง์ด๋ ์ด์คํฐ์ค ํ๋ก์๋ iptables ๋ฅผ ์ฌ์ ์ํด์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋์ค๋ ํธ๋ํฝ์ ์ด์คํฐ์ค ํ๋ก์๊ฐ ์ฒ๋ฆฌํ ์ ์๋๋ก ๋ฆฌ๋ค์ด๋ ์ ํด์ฃผ๋ ์ด๋ ๋ฆฌ๋ค์ด๋ ์ ํด์ฃผ์ด์ ๋ฐ๋ ํธ๋ํฝ์ ์ด์คํฐ์ค ํ๋ก์์ 15001 ํฌํธ๋ก ํฅํ๊ฒ ํด ์ค๋๋ค.
Envoy outbound ๋ผ๋ ๋ป์ ์ ํ๋ฆฌ์ผ์ด์ ๊ธฐ์ค ์ธ๋ถ๋ก ๋๊ฐ๋ ํธ๋ํฝ์ ๋ฐ๋ ํฌํธ๋ค ๋ผ๊ณ ์ดํดํด ์ฃผ์๋ฉด ๋ฉ๋๋ค.
์ ์ ์ฌ์๋ ํ๋ฒ ์ดํ์ ์๋ํฌ์ธํธ๊ฐ ์ฑ๊ณตํ๋์ง ์์์ต๋๋ค!
ํด๊ฒฐ
Istio CNI ๊ธฐ์ค์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌํ ๋ Istio Validation ์ด๋ผ๋ Init Container ๊ฐ iptables ์ ํจ์ฑ์ ํ์ธํ๊ณ ์ดํ์ ๋ฉ์ธ ์ปจํ ์ด๋๋ค์ธ Nginx ์ Istio Proxy ๊ฐ ์คํ๋ฉ๋๋ค.
Init Container ๋ ์คํ๋๋ ์์๊ฐ ๋ณด์ฅ๋์ง๋ง ๋ฉ์ธ ์ปจํ ์ด๋๋ค์ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌ๋๊ธฐ ๋๋ฌธ์ ์์๋ฅผ ๋ณด์ฅํ ์ ์์ต๋๋ค.
๊ทธ์ ๋ฐ๋ผ Istio Proxy ์ Nginx ๋ ๋์์ ๋จ๊ณ Nginx ์ ์ฅ์์๋ Istio Proxy ๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์คํ๋์๋์ง ๊ณ ๋ คํ์ง ์์ฃ .
๊ทธ๋ฐ๋ฐ ๋ฌธ์ ๋ ์์์ ๋ง์๋๋ฆฐ ๊ฒ์ฒ๋ผ Nginx ๊ฐ api.github.com ๊ฐ์ ์ธ๋ถ ์๋น์ค๋ก ๋๊ฐ๊ธฐ ์ํด์ ๋ฐ๋์ Istio Proxy ๋ฅผ ์ง๋๊ฐ์ผ ํ๋ค๊ณ ํ์ต๋๋ค.
Istio Proxy ๋ ์ ์์ ์ผ๋ก ์คํ๋๋๋ฐ ์๋ฌด๋ฆฌ ๋ฆ์ด๋ 1000ms ๊ฐ ๊ฑธ๋ฆฌ๋๋ฐ, ๋ง์ฝ 1000ms ์ด์ ์ Nginx ๊ฐ ์ธ๋ถ ์๋น์ค๋ฅผ ํธ์ถํ๊ฒ ๋๋ฉด ์์ง ์ค๋น ์ค์ธ Istio Proxy ๋ก ์์ฒญ์ด ๊ฐ๊ฒ ๋ฉ๋๋ค. ๊ทธ์ ๋ฐ๋ผ Istio Proxy ๋ ์ค๋น ์ค์ธ ์ํ์์ ํธ์ถ์ ๋ฐ๊ฒ ๋์ด Connection Refused ๋ฅผ ํด๋ฒ๋ฆฌ๋ ๊ฒ์ด์ฃ .
์ด๊ฒ ์ง์ง์ธ์ง ํ์ธํด ๋ณด๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ด ํ๋๋ฅผ ๋ฐฐํฌํด ์ค๋๋ค.
apiVersion: v1
kind: Pod
metadata:
name: sniff-01
namespace: sniff-01
labels:
app: sniff-01
spec:
containers:
- name: sniff-01
image: nginx:latest
securityContext:
privileged: true
ports:
- containerPort: 80
command:
- bash
- -c
- |
tcpdump -n -i eth0 -w /tmp/tcpdump.pcap &
curl -L https://google.com;
nginx -g "daemon off;";
์ด๋ฌ๋ฉด Istio Proxy ๊ฐ ์ค๋น๋๋ ์๊ฐ์ธ 1000ms ์ด์ ์ Nginx ๊ฐ https://google.com ๋ก ์์ฒญ์ ๋ณด๋ด๊ฒ ๋๋๋ฐ ๋ก๊ทธ๋ฅผ ๋ณด๋ฉด Connection Refused ๊ฐ ๋ฐ์ํ๋ ๊ฑธ ํ์ธํ ์ ์์ต๋๋ค.
/tmp/tcpdump.pcap ์ ์๋ ๋ช ๋ น์ด๋ฅผ ํตํด ๋ก์ปฌ๋ก ๊ฐ์ ธ์จ ๋ค,
$ kubectl cp sniff-01:/tmp/tcpdump.pcap ./tcpdump.pcap -n sniff-01
์์ด์ด์คํฌ๋ก ์ผ๊ณ ํจํท์ ํ์ธํฉ๋๋ค.
Connection Refused ์ ๊ด๋ จ ์๋ RST ํ๋๊ทธ๊ฐ ์๋ ๊ฑธ ํ์ธํ ์ ์์ต๋๋ค.
์ด๊ฑธ๋ก ํ์คํด์ก์ต๋๋ค!
์ด๊ฒ ๋ ํ์คํ ์๋ ค๋ฉด Nginx ์ปจํ ์ด๋๊ฐ ์๋ Istio Proxy ์ปจํ ์ด๋์์ ํจํท์ ์บก์ฒํ๋ ๊ฒ์ด ๋ ํ์คํ๋ฐ, ํธ์์ Nginx ์ปจํ ์ด๋๋ก ์งํํ์ต๋๋ค.
์์ฝํด ๋ณด๋ฉด
- Nginx ์ปจํ ์ด๋์ Istio Proxy ์ปจํ ์ด๋๋ ๋์์ ์คํ๋จ
- Istio Proxy ๊ฐ ์ ์์ ์ผ๋ก ์ค๋น๋๋ ๋ฐ 1000ms ์ ๋ ๊ฑธ๋ฆผ
- 1000ms ์ด์ ์ Nginx ์ปจํ ์ด๋๊ฐ ์ธ๋ถ ์๋น์ค๋ฅผ ํธ์ถํ๋ฉด Istio Proxy ๊ฐ ์ค๋น ๋์ง ์์ ์ํ์ด๊ธฐ ๋๋ฌธ์ Connection Refused ๊ฐ ๋จ
๊ทธ๋ผ ์ด์ ์ต์ข ์ ์ผ๋ก 1๋ฒ ์๋ํฌ์ธํธ ํธ์ถ์ ๋ํด ์ฌ์๋ ์์ด ํ ๋ฒ์ ์ฑ๊ณตํ๊ฒ๋ ํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น์?
ํต์ฌ์ Istio Proxy ์ ์คํ์ ๋ณด์ฅํด ์ค ๋ค์ Nginx ๋ฅผ ์คํ์์ผ ์ฃผ๋ ๊ฒ์ ๋๋ค.
์ด๋ ์ด์คํฐ์ค์์ ์ ๊ณตํด ์ฃผ๋ ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
apiVersion: v1
kind: Pod
metadata:
name: sniff-01
namespace: sniff-01
labels:
app: sniff-01
annotations:
proxy.istio.io/config: |
holdApplicationUntilProxyStarts: true
๊ทธ๋ผ ์ด์ ARC ์๋ ํด๋น ์ด๋ ธํ ์ด์ ์ ๋ฃ์ด์ฃผ์ด ์์๋ฅผ ๋ณด์ฅํด ์ฃผ๋ฉด ์ฌ์๋ ์์ด ํ ๋ฒ์ ์คํ๋๋ ๊ฑธ ํ์ธํ ์ ์์ต๋๋ค.
์๋๋ฉด ARC ์ฒ๋ผ ์ฝ๋ ๋ ๋ฒจ์์ ์ฌ์๋๋ฅผ ํตํด ๋ณต์๋ ฅ์ ๋์ฌ ์ด๋ฅผ ์ ํ๋ฆฌ์ผ์ด์ ๋ ๋ฒจ์์ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ๋ ์์ต๋๋ค.
ํ์ง๋ง ARC ๋ ์ด์คํฐ์ค๊ฐ ๊ตณ์ด ํ์ํ์ง ์์ ๋ ์์ด๊ธฐ ๋๋ฌธ์ ์ด์คํฐ์ค๋ฅผ ์ฃผ์ ํ์ง ์๋ ๊ฒ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
Runner ์ ์ธ๋ถ ํต์ ์ ์ ํํ๊ธฐ ์ํด Service Entry ์ SideCar ๋ฅผ ์๊ฒฉํ๊ฒ ๊ฐ์ ธ๊ฐ๋ฉด ํ์ํ์ง๋?!
๋ณด์์ด ์ค์ํ ํ๊ฒฝ์ด๋ผ๋ฉด Runner ์์ ๊ตณ์ด ๋ถํ์ํ google.com ๊ฐ์ ๊ณณ์ ํต์ ์ด ๋๋๋ก ํ ํ์ ์์ผ๋๊น์
์ ๋ฆฌ
ARC ๊ฐ ์คํ๋๋ ๋ฐ ์์ด์ ์ง์ ์ ์ธ ์ํฅ์ด ์์๋ ๊ฒ์ ์๋์์ง๋ง, ๊ทธ๋๋ ์ Connection Refused ๊ฐ ๋ฐ์ํ๋์ง ์์๋ผ ์ ์์์ต๋๋ค.
์ด์คํฐ์ค ํ๋ก์์ ์ฐ๊ด์ด ์์๋ ๊ฑธ ํ์ ํ ์ ์์๊ธฐ ๋๋ฌธ์ ์ฝ๋๊น์ง ์ดํด๋ดค๋๋ฐ, ์ฝ๋์ ์ง์ ์ ์ธ ์๊ด์ด ์๋๋ผ๋ ํธ๋ฌ๋ธ ์ํ ์ ํ๋ ๋ฐ ์์ด ์ฝ๋๋ฅผ ํ์ธํ๋ ๊ฒ์ ๋์์ด ๋ง์ด ๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฉ์ปค๋์ฆ์ ํ์ธต ๊น๊ฒ ๋ ์ดํดํ ์ ์์ฃ .
ํธ๋ฌ๋ธ ์ํ ์ ์งํํ๋ฉด์ ์์ฐ์ค๋ฝ๊ฒ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์์๋๋ค๊ธฐ ๋ณด๋ค๋ ์ด์คํฐ์ค ํ๋ก์์ ๋ํ ๊ฐ๋ ์ด ์ด๋ ์ ๋ ์์ด์ ํด๊ฒฐํ๋ ๋ฌธ์ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
ํ์ง๋ง ์กฐ๊ธ ๋ ์๊ฐ์ด ์์ด์ ์ด์คํฐ์ค ํ๋ก์ ์์ฒด์์ ํจํท์ ์บก์ฒํ๋๋ผ๋ฉด ์์ฐ์ค๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ ์๋ ์์์ ๊ฒ๋๋ค.
ARC ๋ง๊ณ ๋ ๊ฐ๋ ๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌํ ๋ Connection Refused ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ ์ข ์ข ๋ฐ๊ฒฌํ ์ ์๋๋ฐ ๋ถ๋ ์ด ๊ธ์ด ๊ทธ๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋๋ฐ ๋์์ด ๋์์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค.
์ด๋ก์จ ์ด์คํฐ์ค ํ๋ก์๋ฅผ ๋ฌด์์ ๋นผ๋ฒ๋ฆฌ๊ธฐ ์ ์ ํ๋ฒ ๋ ๊ณ ๋ฏผํด๋ณผ ์ ์๋ ์ฉ๊ธฐ๊ฐ +1 ๋์์ต๋๋ค!
๋ง์ฝ ๋ ๋ค๋ฅธ ์ด์คํฐ์ค ํธ๋ฌ๋ธ ์ํ ์ด ์์๋ค๋ฉด 2ํธ์ผ๋ก ๋์์ค๊ฒ ์ต๋๋ค!
๊ทธ๋ผ ์ค๋์ ์ฌ๊ธฐ๊น์ง!