๋กœ์ผ“๐Ÿพ
article thumbnail

 

 

์ด์Šคํ‹ฐ์˜ค๋Š” ๋””๋ฒ„๊น…์ด ์–ด๋ ค์šด ํˆด ์ค‘ ํ•˜๋‚˜๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” ๊ฐ„๋‹จํ•˜์ฃ . ์ด์Šคํ‹ฐ์˜ค ์ž์ฒด๊ฐ€ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

 

์„œ๋น„์Šค ๋ฉ”์‹œ ํˆด ๋‹ต๊ฒŒ ๋งŽ์€ ๋„คํŠธ์›Œํฌ ์ง€์‹์„ ์š”๊ตฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋””๋ฒ„๊น…์ด ์–ด๋ ค์šธ ์ˆ˜ ๋ฐ–์— ์—†์Šต๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ ๊ด€๋ จ๋œ ๋ถ€๋ถ„์ด ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋””์„œ๋ถ€ํ„ฐ ๋””๋ฒ„๊น…์„ ํ•ด์•ผ ํ•˜๋Š”์ง€ ๊ฐ๋„ ์‚ฌ์‹ค ์ž˜ ์•ˆ ์˜ต๋‹ˆ๋‹ค.

 

์ด๊ฒŒ ์ด์Šคํ‹ฐ์˜ค ๋ฌธ์ œ์ธ๊ฐ€? ํด๋ผ์šฐ๋“œ ๋ฌธ์ œ์ธ๊ฐ€? ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฌธ์ œ์ธ๊ฐ€? ํŒ๋‹จํ•˜๊ธฐ๊นŒ์ง€๋„ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ์ฃ .

 

๊ทธ๋Ÿฌ๋‹ค ๋ณด๋‹ˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•˜๋˜ ์ค‘ ์•ฝ๊ฐ„์ด๋ผ๋„ ์ด์Šคํ‹ฐ์˜ค์™€ ๊ด€๋ จํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒฝ์šฐ ๊ทธ๋ƒฅ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ด์Šคํ‹ฐ์˜ค๋ฅผ ๋นผ๋ฒ„๋ฆฝ๋‹ˆ๋‹ค.

 

์ •ํ™•ํžˆ๋Š” ์ด์Šคํ‹ฐ์˜ค ์‚ฌ์ด๋“œ์นด(ํ”„๋ก์‹œ)๋ฅผ ๋ ˆ์ด๋ธ”์„ ํ†ตํ•ด ์ธ์ ์…˜์—์„œ ์ œ์™ธ์‹œ์ผœ ๋ฒ„๋ฆฌ๋Š” ๊ฒƒ์ด์ฃ .

 

์ด์Šคํ‹ฐ์˜ค ์‚ฌ์ด๋“œ์นด๋ฅผ ์ฃผ์ž…ํ•˜์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•

 

์ด์Šคํ‹ฐ์˜ค ์‚ฌ์ด๋“œ์นด๋ฅผ ์ฃผ์ž…ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€๋ถ€๋ถ„์˜ ๋ฌธ์ œ๋Š” ํ•ด๊ฒฐ๋˜์ง€๋งŒ, ์ด๋Š” ๊ทผ๋ณธ์ ์ธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์•„๋‹™๋‹ˆ๋‹ค.

 

๊ทธ๋ž˜๋„ ์ด์Šคํ‹ฐ์˜ค ์‚ฌ์ด๋“œ์นด๋ฅผ ์ œ์™ธํ•˜๋Š” ๊ฑด ์ด๊ฒŒ ์ด์Šคํ‹ฐ์˜ค์˜ ๋ฌธ์ œ์ธ์ง€ ํŒ๋‹จํ•˜๊ธฐ์—” ์ข‹์€ ์ง€ํ‘œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์ฃ .

๋บ„ ๋• ๋นผ๋”๋ผ๋„ ์ด์œ  ์ •๋„๋Š” ๊ดœ์ฐฎ์ž–์•„?

๋บ„ ๋• ๋นผ๋”๋ผ๋„ ์ด์œ  ์ •๋„๋Š” ๊ดœ์ฐฎ์ž–์•„?

 

ํ•˜์ง€๋งŒ ์ด์Šคํ‹ฐ์˜ค ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋ผ๋ฉด ์ด์Šคํ‹ฐ์˜ค ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒ ์ฃ .

๋ฌด์ž‘์ • ์ด์Šคํ‹ฐ์˜ค๋ฅผ ๋””๋ฒ„๊น…ํ•˜๋Š” ๊ฒƒ๋ณด๋‹จ ์ •๋ง ์ด์Šคํ‹ฐ์˜ค๊ฐ€ ํ•„์š”ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ธ์ง€ ํŒŒ์•…ํ•˜๋Š” ๊ฒƒ๋„ ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์ด์Šคํ‹ฐ์˜ค๊ฐ€ ๊ตณ์ด ํ•„์š” ์—†๋‹ค๋ฉด, ๊ทธ๋ƒฅ ์ด์Šคํ‹ฐ์˜ค ์‚ฌ์ด๋“œ์นด๋ฅผ ๋นผ๋Š” ๊ฒƒ์ด ์ •์‹  ๊ฑด๊ฐ•์ƒ ์ข‹์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์•ž์œผ๋กœ๋Š” ๋‹จ์ˆœํžˆ ์ด์Šคํ‹ฐ์˜ค ์‚ฌ์ด๋“œ์นด๋ฅผ ๋นผ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ ์ ˆํ•œ ๋””๋ฒ„๊น…์„ ํ†ตํ•ด ์ด์Šคํ‹ฐ์˜ค์™€ ๊ด€๋ จํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋„๋ก "Istio ๋ฅผ ๋””๋ฒ„๊น… ํ•ด๋ณด์ž" ์‹œ๋ฆฌ์ฆˆ๋ฅผ ์‹œ์ž‘ํ•ด๋ณด๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

 

(์‹œ๋ฆฌ์ฆˆ๋ผ๊ณ ๋Š” ํ–ˆ์ง€๋งŒ ์šด์˜ํ•˜๋Š” ํ™˜๊ฒฝ์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฉด ์‹œ๋ฆฌ์ฆˆ๋Š” ๋ฐ”๋กœ ์—ฌ๊ธฐ์„œ ๋๋‚ ์ง€๋„??!!)

 

๊ทธ ์ค‘์—์„œ๋„ ์ด๋ฒˆ์—๋Š” "Connection Refused" ์™€ ๊ด€๋ จํ•œ ๋””๋ฒ„๊น… ๋ฐฉ๋ฒ•์„ ์†Œ๊ฐœํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

 

๋ ›์ธ ๋‘๋”์ฝ”๋“œ~

 

์ƒํ™ฉ


์ƒํ™ฉ์€ Action Runner Controller(์ดํ•˜ ARC) ๋ฅผ ๋ฐฐํฌํ•˜๋‹ค๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

 

ARC ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ ํŒŒ๋“œ ๋‹จ์œ„๋กœ Self Hosted Runner ๋ฅผ ๊ตฌ๋™ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ํˆด์ž…๋‹ˆ๋‹ค.

 

https://github.com/actions/actions-runner-controller

 

Controller, Listener, Runner ํฌ๊ฒŒ 3๊ฐ€์ง€ ์ปดํฌ๋„ŒํŠธ๋กœ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ Listener ์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์ฃ .

์—๋Ÿฌ ๋กœ๊ทธ

 

๋กœ๊ทธ ๋‚ด์šฉ์„ ๋Œ€๋žต ์š”์•ฝํ•ด ๋ณด์ž๋ฉด

  1. /access_tokens(1๋ฒˆ) ์—”๋“œํฌ์ธํŠธ๋ฅผ ํ†ตํ•ด Github App Auth ์˜ Access Token ์„ ์–ป๊ณ ์ž ํ•จ
  2. 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 ํŒŒ์ผ๋“ค์„ ํ•˜๋‚˜์”ฉ ๋”ฐ๋ผ๊ฐ€๋„ ์ƒ๊ด€์—†๋Š”๋ฐ ์šฐ๋ฆฌ๋Š” ์‹œ๊ฐ„์ด ์—†์œผ๋‹ˆ ๋ฐ”๋กœ ๋กœ๊ทธ๋ฅผ ๊ฒ€์ƒ‰ํ•ด ๋ด…๋‹ˆ๋‹ค.

go ํŒŒ์ผ๋“ค์„ ํ•˜๋‚˜์”ฉ ๋”ฐ๋ผ๊ฐ„๋‹ค๋Š” ๋ฐฉ์‹ - ๋ณด์—ฌ์ฃผ๋Š” .go ํŒŒ์ผ๋“ค์€ ํ•œ ์Šคํ…์”ฉ ์ฐพ์•„๊ฐ€์„œ ํ™•์ธ

 

๋‹คํ–‰ํžˆ ๊ฒ€์ƒ‰ํ•ด ๋ณด๋‹ˆ ์–ด๋””์„œ ํ˜ธ์ถœํ•œ ๋กœ๊ทธ์ธ์ง€ ๋ฐ”๋กœ ๋‚˜์™”์Šต๋‹ˆ๋‹ค.

client.go

 

1052 ์ค„์„ ๋ณด๋ฉด ์—”๋“œํฌ์ธํŠธ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ๋ณด์ž…๋‹ˆ๋‹ค.

 

๊ตฌํ˜„๋œ ํ•จ์ˆ˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์–ด์ฐŒ์–ด์ฐŒํ•ด์„œ Request ๋ฅผ Send() ํ•ด์ค๋‹ˆ๋‹ค.

http/client.go

 

๋˜ Send() ๋ฅผ ์‚ดํŽด๋ณด๊ฒŒ ๋˜๋ฉด, RoundTrip() ์ด๋ผ๋Š” ํ•จ์ˆ˜๊ฐ€ ์žˆ๋Š”๋ฐ

http/client.go

 

ํƒ€๊ณ  ํƒ€๊ณ  ๋“ค์–ด๊ฐ€๋ฉด ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์‹คํŒจํ•œ ์š”์ฒญ์— ๋Œ€ํ•ด ์žฌ์‹œ๋„๋ฅผ ํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

client.go

 

์ด ๋ง์€ /access_tokens ์— ์‹คํŒจํ•  ๊ฒฝ์šฐ retry ํšŸ์ˆ˜๋งŒํผ ๊ณ„์† ์‹œ๋„๋ฅผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด์ฃ .

 

๊ทธ๋Ÿฐ๋ฐ ๋กœ๊ทธ๋ฅผ ๋ณด๋ฉด /access_tokens ์— ๋Œ€ํ•œ ์š”์ฒญ ์‹คํŒจ๋Š” ํ•˜๋‚˜์ด๊ณ , ๋‹ค์Œ ๋กœ๊ทธ๋“ค์ด ์ฐํžŒ ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ด๊ฑธ๋กœ ์–ด์ฐŒ ๋๋“  ํ•œ ๋ฒˆ์˜ ์žฌ์‹œ๋„ ๊ฒฐ๊ณผ /access_tokens ์€ ์„ฑ๊ณตํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์„ฑ๊ณตํ–ˆ๋‹ค๋Š” ๋˜ ๋‹ค๋ฅธ ๊ทผ๊ฑฐ๋Š” ์•„๋ž˜ ์ฝ”๋“œ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

client.go

 

getting access token for GitHub App auth ๋ผ๋Š” ๋กœ๊ทธ๋Š” c.fetchAccessToken ํ•จ์ˆ˜ ์•ˆ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์ด๊ณ , getting runner registration token ์€ ์ด๋ฏธ์ง€์—์„œ ๋ณด์‹œ๋‹ค์‹œํ”ผ ๋ฐ”๋กœ ๋ฐ‘์— ์ชฝ์—์„œ ๋ฐœ์ƒํ•œ ๊ฑธ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ด๋Š” ๊ณง c.fetchAccessToken ์ด ์žฌ์‹œ๋„๋Š” ํ–ˆ์ง€๋งŒ ์„ฑ๊ณต์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜์—ˆ๋‹ค๋Š” ๊ฑธ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ฝ”๋“œ ์‚ดํŽด๋ณธ ๊ฒฐ๊ณผ ์šฐ๋ฆฌ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. /access_tokens ์—”๋“œํฌ์ธํŠธ์— ๋Œ€ํ•œ ์‹คํŒจ ๋กœ๊ทธ๊ฐ€ ์ฐํ˜”์ง€๋งŒ, ์ด๋Š” ํ•œ ๋ฒˆ์˜ ์žฌ์‹œ๋„ ์ดํ›„์— ์„ฑ๊ณต์ ์œผ๋กœ ํ˜ธ์ถœ ๋˜์—ˆ๋‹ค๋Š” ๊ฑธ ์•Œ ์ˆ˜ ์žˆ์Œ
  2. ์žฌ์‹œ๋„๋กœ ์ธํ•ด ์„ฑ๊ณตํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์Œ ์—”๋“œํฌ์ธํŠธ์ธ /registration-token ๋„ ์„ฑ๊ณต์ ์œผ๋กœ ํ˜ธ์ถœ๋จ
  3. ๊ฒฐ๊ตญ ARC ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋จ
  4. ๊ทธ๋Ÿฐ๋ฐ, ์™œ ๋ฐ”๋กœ ์„ฑ๊ณต ๋ชปํ•˜๊ณ  ํ•œ๋ฒˆ์˜ ์žฌ์‹œ๋„ ์ดํ›„์— ์„ฑ๊ณตํ–ˆ์„๊นŒ? ๋ผ๋Š” ์˜๋ฌธ์ ์ด ์ƒ๊น€

 

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;"

 

๊ทผ๋ฐ ๋ฌธ์ œ๊ฐ€ ์ „ํ˜€ ์•ˆ๋ณด์ž…๋‹ˆ๋‹ค.

http://naver.com ํ˜ธ์ถœ ๊ฒฐ๊ณผ

 

๋” ์‹ ๊ธฐํ•œ ๊ฒƒ์€ 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 ํฌํŠธ๋กœ ํ–ฅํ•˜๊ฒŒ ํ•ด ์ค๋‹ˆ๋‹ค.

 

https://istio.io/latest/docs/ops/deployment/application-requirements/#ports-used-by-istio

 

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 ์ปจํ…Œ์ด๋„ˆ๋กœ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

 

์š”์•ฝํ•ด ๋ณด๋ฉด

  1. Nginx ์ปจํ…Œ์ด๋„ˆ์™€ Istio Proxy ์ปจํ…Œ์ด๋„ˆ๋Š” ๋™์‹œ์— ์‹คํ–‰๋จ
  2. Istio Proxy ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ค€๋น„๋˜๋Š” ๋ฐ 1000ms ์ •๋„ ๊ฑธ๋ฆผ
  3. 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

https://istio.io/latest/docs/reference/config/istio.mesh.v1alpha1/#ProxyConfig-hold_application_until_proxy_starts

 

๊ทธ๋Ÿผ ์ด์ œ ARC ์—๋„ ํ•ด๋‹น ์–ด๋…ธํ…Œ์ด์…˜์„ ๋„ฃ์–ด์ฃผ์–ด ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•ด ์ฃผ๋ฉด ์žฌ์‹œ๋„ ์—†์ด ํ•œ ๋ฒˆ์— ์‹คํ–‰๋˜๋Š” ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์•„๋‹ˆ๋ฉด ARC ์ฒ˜๋Ÿผ ์ฝ”๋“œ ๋ ˆ๋ฒจ์—์„œ ์žฌ์‹œ๋„๋ฅผ ํ†ตํ•ด ๋ณต์›๋ ฅ์„ ๋†’์—ฌ ์ด๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ ˆ๋ฒจ์—์„œ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ ARC ๋Š” ์ด์Šคํ‹ฐ์˜ค๊ฐ€ ๊ตณ์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ๋…€์„์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด์Šคํ‹ฐ์˜ค๋ฅผ ์ฃผ์ž…ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ๋„ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

Runner ์˜ ์™ธ๋ถ€ ํ†ต์‹ ์„ ์ œํ•œํ•˜๊ธฐ ์œ„ํ•ด Service Entry ์™€ SideCar ๋ฅผ ์—„๊ฒฉํ•˜๊ฒŒ ๊ฐ€์ ธ๊ฐ€๋ฉด ํ•„์š”ํ•˜์ง€๋„?!

๋ณด์•ˆ์ด ์ค‘์š”ํ•œ ํ™˜๊ฒฝ์ด๋ผ๋ฉด Runner ์—์„œ ๊ตณ์ด ๋ถˆํ•„์š”ํ•œ google.com ๊ฐ™์€ ๊ณณ์— ํ†ต์‹ ์ด ๋˜๋„๋ก ํ•  ํ•„์š˜ ์—†์œผ๋‹ˆ๊นŒ์š”

 

์ •๋ฆฌ


ARC ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋ฐ ์žˆ์–ด์„œ ์ง์ ‘์ ์ธ ์˜ํ–ฅ์ด ์žˆ์—ˆ๋˜ ๊ฒƒ์€ ์•„๋‹ˆ์—ˆ์ง€๋งŒ, ๊ทธ๋ž˜๋„ ์™œ Connection Refused ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

 

์ด์Šคํ‹ฐ์˜ค ํ”„๋ก์‹œ์™€ ์—ฐ๊ด€์ด ์žˆ์—ˆ๋˜ ๊ฑธ ํ™•์‹ ํ•  ์ˆ˜ ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ๊นŒ์ง€ ์‚ดํŽด๋ดค๋Š”๋ฐ, ์ฝ”๋“œ์™€ ์ง์ ‘์ ์ธ ์ƒ๊ด€์ด ์—†๋”๋ผ๋„ ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…์„ ํ•˜๋Š” ๋ฐ ์žˆ์–ด ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์€ ๋„์›€์ด ๋งŽ์ด ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํ•œ์ธต ๊นŠ๊ฒŒ ๋” ์ดํ•ดํ•  ์ˆ˜ ์žˆ์ฃ .

 

ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…์„ ์ง„ํ–‰ํ•˜๋ฉด์„œ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ƒˆ๋‹ค๊ธฐ ๋ณด๋‹ค๋Š” ์ด์Šคํ‹ฐ์˜ค ํ”„๋ก์‹œ์— ๋Œ€ํ•œ ๊ฐœ๋…์ด ์–ด๋Š ์ •๋„ ์žˆ์–ด์„œ ํ•ด๊ฒฐํ–ˆ๋˜ ๋ฌธ์ œ์˜€๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ ์กฐ๊ธˆ ๋” ์‹œ๊ฐ„์ด ์žˆ์–ด์„œ ์ด์Šคํ‹ฐ์˜ค ํ”„๋ก์‹œ ์ž์ฒด์—์„œ ํŒจํ‚ท์„ ์บก์ฒ˜ํ–ˆ๋”๋ผ๋ฉด ์ž์—ฐ์Šค๋ ˆ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์•Œ ์ˆ˜๋„ ์žˆ์—ˆ์„ ๊ฒ๋‹ˆ๋‹ค.

 

ARC ๋ง๊ณ ๋„ ๊ฐ€๋” ๋‹ค๋ฅธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•  ๋•Œ Connection Refused ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ์ข…์ข… ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ๋ถ€๋”” ์ด ๊ธ€์ด ๊ทธ๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š”๋ฐ ๋„์›€์ด ๋˜์—ˆ์œผ๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค.

 

์ด๋กœ์จ ์ด์Šคํ‹ฐ์˜ค ํ”„๋ก์‹œ๋ฅผ ๋ฌด์ž‘์ • ๋นผ๋ฒ„๋ฆฌ๊ธฐ ์ „์— ํ•œ๋ฒˆ ๋” ๊ณ ๋ฏผํ•ด๋ณผ ์ˆ˜ ์žˆ๋Š” ์šฉ๊ธฐ๊ฐ€ +1 ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!

 

๋งŒ์•ฝ ๋˜ ๋‹ค๋ฅธ ์ด์Šคํ‹ฐ์˜ค ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…์ด ์žˆ์—ˆ๋‹ค๋ฉด 2ํŽธ์œผ๋กœ ๋Œ์•„์˜ค๊ฒ ์Šต๋‹ˆ๋‹ค!

 

๊ทธ๋Ÿผ ์˜ค๋Š˜์€ ์—ฌ๊ธฐ๊นŒ์ง€!

profile on loading

Loading...