[Kubernetes] ์ธ๋ฐ์ด๋ ํธ๋ํฝ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ : ์ธ๊ทธ๋ ์ค(Ingress)
๐ ํด๋น ํฌ์คํ
์ ์์ํ์ธ์! ๋์ปค/์ฟ ๋ฒ๋คํฐ์ค ์์ ์ ์ฝ๊ณ ๊ฐ์ธ์ ์ธ ๋ชฉ์ ํ์ ์์ฑ๋๋ ๊ธ์
๋๋ค. ํฌ์คํ
์ ์ฌ์ฉ๋๋ ๋ชจ๋ ์๋ฃ๋ ์ ๊ฐ ์ง์ ์ฌ๊ตฌ์ฑํ์์์ ์๋ฆฝ๋๋ค.
์ด๋ฒ ํฌ์คํ ์์๋ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ์ ์ธ๋ถ์์ ๋ด๋ถ๋ก ์์ฒญ(์ธ๋ฐ์ด๋ ํธ๋ํฝ)์ด ๋ค์ด์์ ๋, ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ์ง๋ฅผ ๊ฒฐ์ ํ๋ ์ธ๊ทธ๋ ์ค(Ingress) ๋ผ๋ ๋ฆฌ์์ค ์ค๋ธ์ ํธ์ ๋ํด์ ๋ฐฐ์๋ณด๋๋ก ํ์.
1. ์๋น์ค vs ์ธ๊ทธ๋ ์ค
๋จผ์ ์ธ๊ทธ๋ ์ค๋ผ๋ ์ฉ์ด์ ์ ์์ ๋ํด์ ์ง๊ณ ๋์ด๊ฐ๋ณด์. ์ธ๊ทธ๋ ์ค๋, ์ธ๋ถ์์ ๋ด๋ถ๋ก ํฅํ๋ ๊ฒ์ ์ผ์ปซ๋๋ค. ๊ทธ๋์ ์ธ๊ทธ๋ ์ค ํธ๋ํฝ์ด๋ผ ํจ์ ์ธ๋ถ์์ ๋ด๋ถ๋ก ํฅํ๋ ํธ๋ํฝ์ ๋งํ๊ณ , ์ธ๊ทธ๋ ์ค ๋คํธ์ํฌ๋ผ๊ณ ํ๋ค๋ฉด ์ธ๋ถ์์ ๋ด๋ถ๋ก ํฅํ๋ ํธ๋ํฝ(์ธ๊ทธ๋ ์ค ํธ๋ํฝ)์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๋คํธ์ํฌ๋ฅผ ์๋ฏธํ๋ค.
์ธ๊ทธ๋ ์ค๋ผ๋ ๋ฆฌ์์ค ์ค๋ธ์ ํธ๋ฅผ ์ดํดํ๊ธฐ ์ํด์ ๋น๊ต๊ตฐ์ด ๋ ๋งํ ๋ค๋ฅธ ๋ฆฌ์์ค ์ค๋ธ์ ํธ๋ ์๋น์ค์ด๋ค. ์๋น์ค๋ ์์ ํฌ์คํ ์์ ๊ฐ๋ ์ ๋ค๋ฃจ์์ผ๋ ์ฌ๊ธฐ์๋ ๊ฐ๋จํ ์ ์๋ง ํ๊ณ ์ง๊ณ ๋์ด๊ฐ๊ฒ ๋ค. ์๋น์ค๋ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ์ ๋ฐฐํฌํ ํ๋๋ค์ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ์ ๋ฐ ์ฆ, ์ธ๋ถ์์ ์ ๊ทผํ ์ ์๋๋ก ํ๋๋ค์ ์ธ๋ถ๋ก ๋ ธ์ถํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์ค๋ธ์ ํธ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด๋ฌํ ์๋น์ค๋ผ๋ ์ค๋ธ์ ํธ์ ๊ฐ๋ ์ ๋น๋์ด ๋ณผ ๋, ์ธ๊ทธ๋ ์ค ์ค๋ธ์ ํธ๋ ํด๋ฌ์คํฐ ์ธ๋ถ์์ ๋ด๋ถ๋ก ์ ๋ฌํ ์์ฒญ์ ์ด๋ป๊ฒ ๋๋ ์ด๋ ํ ๋ฐฉ์์ผ๋ก ํ๋๋ก ์ ๋ฌํ ์ง์ ๋ํ ์ฒ๋ฆฌ๋ฅผ ์ํํ๋ ์ค๋ธ์ ํธ์ด๋ค. ์ฝ๊ฒ ๊ทธ๋ฆผ์ผ๋ก ๊ฐ๋จํ๊ฒ ๋์ํํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
์ ๊ทธ๋ฆผ์ฒ๋ผ ์๋น์ค๋ ํ๋๋ฅผ ์ธ๋ถ๋ก ๋ ธ์ถ์ํค๋ ์ญํ ์ ํ๊ณ , ์ธ๋ถ๋ก ๋ ธ์ถ์ํด์ ๋ฐ๋ผ ์ธ๋ถ์์ ๋ด๋ถ๋ก ๋ค์ด์ค๋ ์์ฒญ์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํด์ ํ๋๋ก ์ ๋ฌํ ์ง๋ ์ธ๊ทธ๋ ์ค๊ฐ ๋ด๋นํ๊ฒ ๋๋ค. ์ฐธ๊ณ ๋ก ์ ๊ทธ๋ฆผ ์์์๋ ๋ด๋ถ๋ก ๋ค์ด์ค๋ ์์ฒญ์ด ๋ง์น [์๋น์ค → ์ธ๊ทธ๋ ์ค] ์์๋ก ํต๊ณผํ๋ค๊ณ ์คํดํ ์ ์๋๋ฐ, ๊ทธ๊ฒ์ ์๋๋ค. ๋จ์ํ ์๋น์ค๋ ์ธ๋ถ๋ก ๋ ธ์ถ์ํค๋ ์ญํ ์ด๊ณ , ์ธ๊ทธ๋ ์ค๋ ์ธ๋ถ๋ก๋ถํฐ ์จ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ์ญํ ์์ ๊ตฌ๋ถํ๊ธฐ ์ํด ์ดํด๋ฅผ ์ํด ์์ฒ๋ผ ํ์ํ๋ค.
์ฌ๊ธฐ์ ์ธ๊ทธ๋ ์ค๊ฐ ํ๋ ์ญํ ๋ก์, ์ธ๋ถ์์ ๋ด๋ถ๋ก ๋ค์ด์ค๋ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์๋ ๋ค์ํ์ง๋ง ๋ํ์ ์ผ๋ก ๋์ดํด๋ณด์๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
- ์ธ๋ถ ์์ฒญ์ ๋ผ์ฐํ : ์๋ฅผ ๋ค์ด, /predict, /zedd ์ฒ๋ผ ํน์ ๊ฒฝ๋ก๋ก ๋ค์ด์จ ์์ฒญ์ ์ด๋ ํ ์๋น์ค๋ก ์ ๋ฌํ ์ง ์ ์ํ๋ ๋ผ์ฐํ ๊ท์น์ ์ ์
- ๊ฐ์ ํธ์คํธ ๊ธฐ๋ฐ์ ์์ฒญ ์ฒ๋ฆฌ : ๊ฐ์ IP ์ฃผ์์ ๋ํด์ ์๋ก ๋ค๋ฅธ ๋๋ฉ์ธ ์ด๋ฆ์ผ๋ก ์์ฒญ์ด ๋์ฐฉํ์ ๋, ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ๊ฒ์ธ์ง ์ ์
- SSL/TLS ๋ณด์ ์ฐ๊ฒฐ ์ฒ๋ฆฌ : ์ฌ๋ฌ ๊ฐ์ ์๋น์ค๋ก ์์ฒญ์ ๋ผ์ฐํ ํ ๋, ๋ณด์ ์ฐ๊ฒฐ์ ์ํ ์ธ์ฆ์๋ฅผ ์ฝ๊ฒ ์ ์ฉ
๋ฌผ๋ก ์์์ ๋ช ์ํ 3๊ฐ์ง ๊ธฐ๋ฅ์ด ์ธ๊ทธ๋ ์ค ๊ธฐ๋ฅ์ ์ ๋ถ๋ ์๋๋ค. ๋ํ ์ ๊ธฐ๋ฅ์ ์ธ๊ทธ๋ ์ค๊ฐ ํ๋ ์์ฒด์ ์ธ ๊ธฐ๋ฅ์ด๊ณ , ํด๋น ๊ธฐ๋ฅ์ ๋ ์๋ก ๋ค๋ฅด๊ฒ ์ฌ์ฉํ๊ธฐ๋ ํ๋๋ฐ ์ด๋ ์ธ๊ทธ๋ ์ค์ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ์๋ฒ๋ฅผ ์ด๋ค ๊ฒ์ผ๋ก ์ ํํ๋๋์ ๋ฐ๋ผ ๋ ๋ฌ๋ผ์ง๊ธฐ๋ ํ๋ค. ์ฌ๊ธฐ์ "์ธ๊ทธ๋ ์ค์ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ์๋ฒ"๋ฅผ ์ดํดํ๊ธฐ ์ํด์๋ ์ธ๊ทธ๋ ์ค ์ปจํธ๋กค๋ฌ์ ๋ก๋ ๋ฐธ๋ฐ์์ ๋ํด ์์์ผ ํ๋๋ฐ ์ด์ ๋ํด์๋ ๋ฐ์์ ์์๋ณผ ์์ ์ด๋ ์ผ๋จ์ ๋์ด๊ฐ์.
2. ์ธ๊ทธ๋ ์ค๋ ์ ํ์ํ๊ฐ?
1๋ฒ ๋ชฉ์ฐจ์ ๋ด์ฉ ๋ง๋ฏธ์์ ์๊ฐํ ์ธ๊ทธ๋ ์ค์ ๋ํ์ ์ธ 3๊ฐ์ง ๊ธฐ๋ฅ๋ง ๋ณด์์ ๋๋ ๊ตณ์ด ์ธ๊ทธ๋ ์ค๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์๋น์ค ์ค๋ธ์ ํธ๋ก๋ง ์ฌ์ฉํด์๋ ํด๋น ๊ธฐ๋ฅ๋ค์ ๊ตฌํํ ์ ์์ง ์์๊ฐ? ์ ๋ํด์๋ ์๋ฌธ์ ํ์ ์ ์๋ค. ๋ฌผ๋ก ๋ถ๊ฐ๋ฅํ ๊ฒ์ ์๋๋ค. ์ฆ, ์๋น์ค ์ค๋ธ์ ํธ ๊ทธ ์ค์์๋ NodePort ๋ LoadBalancer ์ ํ์ ์๋น์ค ์ค๋ธ์ ํธ๋ฅผ ์ ์ํจ์ผ๋ก์จ ์ธ๊ทธ๋ ์ค ํธ๋ํฝ์ ๋ถํ ๋ถ์ฐ(๋ก๋ ๋ฐธ๋ฐ์)ํ๊ฑฐ๋ ํ๋ ๋ฑ ํธ๋ํฝ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๊ธด ํ๋ค. ํ์ง๋ง ์ธ๊ทธ๋ ์ค๋ฅผ ํจ๊ป ์ฌ์ฉํ๊ฒ ๋๋ฉด ์๋น์ค๋ง ์ด์ฉํ๋ ๊ฒ๋ณด๋ค๋ ๋ ํฐ ์ฅ์ ์ ๋๋ฆด ์ ์๋ค. ์ด ์ฅ์ ์ ์ฒด๊ฐํ๊ธฐ ์ํด์ ์๋น์ค๋ง์ ์ฌ์ฉํ ๋์ ์๋น์ค์ ์ธ๊ทธ๋ ์ค๋ฅผ ํจ๊ป ์ฌ์ฉํ ๋์ ์ฐจ์ด์ ์ ๋น๊ตํด๋ณด๋๋ก ํ์. ๋จผ์ ์๋ ๊ทธ๋ฆผ์ ๋ณด์.
A, B, C ๋ผ๋ ์๋ก ๋ค๋ฅธ ๊ธฐ๋ฅ์ ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์๋ค๊ณ ๊ฐ์ ํด๋ณด์. ์ค์ง์ ์ธ ์น์๋ฒ ์ญํ ์ ํ๋ ํ๋๋ Deployment๋ก ๋ฐฐํฌํ๊ณ , Deployment๋ ๊ฐ ์๋น์ค์ ๋ฐ๋ผ A, B, C๋ก ๊ฐ๊ฐ ๋ฐฐํฌํ๋ค๊ณ ํด๋ณด์. ๊ทธ๋ฆฌ๊ณ ์ด Deployment๋ค์ ์ธ๋ถ(Client)์์ ์ ๊ทผํ๋ ๊ฒ์ ๊ฐ๋ฅํ๊ฒ ํ๊ธฐ ์ํด ๊ฐ Deployment์ ๋ํด์ ์๋น์ค๋ ํจ๊ป ๋ฐฐํฌํ๋ค๊ณ ํด๋ณด์.
๊ทธ๋ฐ๋ฐ ์๋ก ๋ค๋ฅธ ๊ธฐ๋ฅ์ ํ๋ A, B, C ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ์ ๋ผ์ฐํ ๊ท์น์ด๋ SSL/TLS ์ค์ ๊ฐ ๋ฑ์ด ๋ชจ๋ ๋์ผํ ์๋ ์์ง๋ง ๋ณดํต์ ๋ค๋ฅผ ํ๋ฅ ์ด ๋๋ค. ๊ทธ๋ ๊ฒ ๋๋ฉด k8s๋ฅผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ์ ์ฅ์์๋ ๊ฐ ์ค์ ๊ฐ์ ์๋น์ค ๋๋ Deployment์ ๋งค๋ํ์คํธ ํ์ผ๋ง๋ค ๋ณ๋๋ก ์ค์ ์ ํด์ฃผ์ด์ผ ํ ์ ๋ฐ์ ์๋ค.
๊ทธ๋ฌ๋ฉด ๊ฒฐ๊ตญ ๊ฐ๋ฐ์ ์ ์ฅ์์๋ ์ ํ๋ฆฌ์ผ์ด์ 3๊ฐ๋ง ํ๋๋ผ๋ ๊ด๋ฆฌํด์ผ ํ ๋งค๋ํ์คํธ ํ์ผ์ด 3๊ฐ๋ ๋๋ค. ์ฆ, ๊ณ์์ ์ผ๋ก ์ถ๊ฐ๋๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ์์ ๋น๋กํด์ ๊ด๋ฆฌํด์ผ ํ ๋งค๋ํ์คํธ ํ์ผ ๊ฐ์๊ฐ ์ฆ๊ฐํ๋ ๊ฒ์ด๋ค.
ํ์ง๋ง ์ธ๊ทธ๋ ์ค ์ค๋ธ์ ํธ๋ฅผ ์ฌ์ฉํ๋ฉด URL ์๋ํฌ์ธํธ๋ฅผ ๋จ ํ๋๋ง ์์ฑํจ์ผ๋ก์จ ์ด๋ ๊ฒ ๊ด๋ฆฌํฌ์ธํธ๊ฐ ๋์ด๋๋ ๋ฒ๊ฑฐ๋ก์์ ์ฝ๊ฒ ํด๊ฒฐํ ์ ์๊ฒ ๋๋ค. ์ธ๊ทธ๋ ์ค๊ฐ ์ถ๊ฐ๋ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ๋ค.
์์ ๊ฐ์ด ์ธ๊ทธ๋ ์ค๊ฐ ์๋น์ค ์๋จ์ ์ถ๊ฐ๊ฐ ๋๋ฉด ์ธ๋ถ(ํด๋ผ์ด์ธํธ) ์ ์ฅ์์๋ 3๊ฐ์ ์๋น์ค์ ๋ํด์ ๊ฐ๊ฐ URL ์๋ํฌ์ธํธ๊ฐ ์กด์ฌํ๋ ๊ฒ์ด ์๋๋ผ ๋จ์ํ ์ธ๊ทธ๋ ์ค์ ์ ๊ทผํ๊ธฐ ์ํ ํ๋์ URL ์๋ํฌ์ธํธ๋ง ์กด์ฌํ๊ฒ ๋๋ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ์ธ๋ถ์ ์๋ ํด๋ผ์ด์ธํธ๋ 1๊ฐ์ ์ธ๊ทธ๋ ์ค URL๋ก ์ ๊ทผ ํ๊ฒ ๋๋ฉด ์ธ๊ทธ๋ ์ค์ ์ ์๋ ๊ท์น์ ๋ฐ๋ผ ์์ฒญ์ ๊ตฌ์ฒด์ ์ผ๋ก ์ด๋ค Deployment์ ์ ๋ฌ๋ ์ง ๊ฒฐ์ ๋๋ ๊ฒ์ด๋ค.
์ด๋ ๊ฒ ๋๋ฉด ์ธ๊ทธ๋ ์ค๊ฐ ์ถ๊ฐ๋จ์ผ๋ก์จ ์๊น ์๋น์ค๋ง ์๋ ๊ตฌ์กฐ์์ ๋ฐ๊ฒฌ๋์๋ ํ๊ณ์ ์ธ "๊ด๋ฆฌํด์ผ ํ ๋งค๋ํ์คํธ ๊ฐ์๊ฐ ๋์ด๋๋ค" ๋ผ๋ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋๋ค. ์ฆ, ์ธ๊ทธ๋ ์ค๋ผ๋ ๋งค๋ํ์คํธ 1๊ฐ๋ง์ผ๋ก ๊ฐ ์๋น์ค ๋๋ ๋ํ๋ก์ด๋จผํธ์ ์ ์ฉ๋ ์ค์ ๊ฐ์ ๋ง์น ์ค์์์ ๊ด๋ฆฌํ๊ฒ ๋๋ ์ ์ด๋ค. ์ด๊ฒ์ด ๋ฐ๋ก ์ธ๊ทธ๋ ์ค์ ํต์ฌ์ ์ธ ๊ธฐ๋ฅ์ด๋ค.
์๋น์ค์ ์ธ๊ทธ๋ ์ค๋ฅผ ๊ฐ์ด ์ฌ์ฉํด์ผ ํ๋ ๋ ๋ค๋ฅธ ์ด์ ๋ ๋ผ์ฐํ ๊ท์น ๋ช ์์ด๋ค. ์ด์ ๋ํด์ ์ ์ ์ดํด๋ณด์. ๋จผ์ ์ธ๊ทธ๋ ์ค์ ์๋น์ค ๊ฐ์ ์ฐจ์ด์ ์ ๋คํธ์ํฌ OSI 7 ๊ณ์ธต ๊ด์ ์์ ์ดํด๋ณผ ํ์๊ฐ ์๋ค. ๋จผ์ ์ธ๊ทธ๋ ์ค๋ OSI Layer ์ค L7 ๊ณ์ธต์ธ Application ๊ณ์ธต์ด๋ฉฐ ํด๋น ๊ณ์ธต์ ๊ตฌํ์ฒด๋ HTTP๋ก ์๋ณ์๊ฐ IP ์ฃผ์, PORT ๋ฒํธ, URL PATH ๊น์ง์ด๋ค. ๋ฐ๋ฉด์ ์๋น์ค๋ L4 ๊ณ์ธต์ธ Transport ๊ณ์ธต์ด๋ฉฐ ํด๋น ๊ณ์ธต์ ๊ตฌํ์ฒด๋ TCP/UDP๋ก ์๋ณ์๊ฐ IP ์ฃผ์์ PORT ๋ฒํธ์ด๋ค.
์ค์ํ ์ฐจ์ด์ ์ ์๋ณ์๊ฐ URL PATH ๊น์ง ์ฌ๋ถ์ด๋์ธ๋ฐ, ์ธ๊ทธ๋ ์ค๋ ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ฐ์์ ์์๋ณด๊ฒ ์ง๋ง ๋ผ์ฐํ ๊ท์น๊น์ง ์ ์ํ ์ ์๊ฒ ๋๋ ๊ฒ์ด๋ค. ๋ฐ๋ฉด์, ์๋น์ค๋ URL PATH๊ฐ ์๋ณ์์ ํฌํจ๋์ง ์๊ธฐ ๋๋ฌธ์ ๋ผ์ฐํ ๊ท์น๊น์ง๋ ์ ์ํ ์๊ฐ ์๋ค.
3. ์ธ๊ทธ๋ ์ค์ ๊ตฌ์กฐ
์ง์ ๋ชฉ์ฐจ๊น์ง๋ ์ธ๊ทธ๋ ์ค๊ฐ ์ด๋ค ๊ฐ๋ ์ด๊ณ , ์ธ๊ทธ๋ ์ค๊ฐ ์ ํ์ํ์ง์ ๋ํด์ ์ดํด๋ณด์๋ค. ์ด๋ฒ ๋ชฉ์ฐจ์์๋ ์ข ๋ ์ธ๋ถ์ ์ผ๋ก k8s ํด๋ฌ์คํฐ์ ์ธ๊ทธ๋ ์ค๋ฅผ ์ ์ฉํ๊ฒ ๋๋ฉด ์ด๋ค ๊ตฌ์กฐ๋ก ๋์ํ๋์ง์ ๋ํด์ ์ดํด๋ณด๋๋ก ํ์.
์ง๊ธ๊น์ง ์ด์ผ๊ธฐํ๋ '์ธ๊ทธ๋ ์ค'๋ ์๋ฐํ ๋งํ๋ฉด ๊ท์น์ ์ ์ํ ๋ด์ฉ์ด ๋ค์ด์๋ ํ์ผ ํํ์ ๋ถ๊ณผํ๋ค. ์ด๊ฒ ๋ฌด์จ ์๋ฆฌ์ธ๊ฐ? ์ง์ ๋ชฉ์ฐจ์์ ์ธ๊ทธ๋ ์ค๋ฅผ ๋์ํํ ๊ฒ์ ๋ณด๋ฉด ์ธ๊ทธ๋ ์ค ์์ฒด๊ฐ ์ผ์ข ์ ์๋ฒ ์ญํ ์ ํ๋ฉด์ ๋ก๋ ๋ฐธ๋ฐ์ ์ญํ ๋ ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์๋ค. ํ์ง๋ง ์ธ๊ทธ๋ ์ค์ ์ค์ฒด(?)๋ ๋จ์ํ YAML ํ์ผ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ํ์ผ์ ๋ด์ฉ์๋ ์ง์ ์์ ์ธ๊ทธ๋ ์ค์ ๊ธฐ๋ฅ์ด๋ผ๊ณ ์๊ฐํ๋ ๋ผ์ฐํ ๊ท์น, SSL/TLS ์ค์ ๊ฐ ๋ฑ๊ณผ ๊ฐ์ ๊ฒ๋ค์ ๋ช ์ํ๋ ๋ด์ฉ์ด ๋ค์ด์๋ค. ๊ณต์ ๋ฌธ์์์ ์๊ฐ๋๋ ์ธ๊ทธ๋ ์ค ์์ ํ์ผ์ ์๋์ ๊ฐ๋ค.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: minimal-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx-example
rules:
- http:
paths:
- path: /testpath
pathType: Prefix
backend:
service:
name: test
port:
number: 80
์ ํ์ผ์ ๋ด์ฉ์์ ํญ๋ชฉ๋ค์ด ๊ตฌ์ฒด์ ์ผ๋ก ์ด๋ค ๊ฒ์ ์๋ฏธํ๋์ง ์์๋ณด๊ธฐ ์ ์ ์ธ๊ทธ๋ ์ค์ ๊ตฌ์กฐ๋ฅผ ์ข ๋ ๊น์ํ ํํค์ณ๋ณด๋๋ก ํ์.
์ธ๊ทธ๋ ์ค ๋ง๊ณ ๋ ์์์ผ ํ ๊ฐ๋ ์ด ์ธ๊ทธ๋ ์ค ์ปจํธ๋กค๋ฌ์ ๋ก๋ ๋ฐธ๋ฐ์์ด๋ค. ์ธ๊ทธ๋ ์ค ์ปจํธ๋กค๋ฌ๋ ์ธ๊ทธ๋ ์ค๋ผ๋ ๊ฒ์ ๋ช ์๋ ๊ท์น์ ์คํ์ํค๋๋ก ํ๋ ์ฃผ์ฒด์ด๋ค. ์ด๋ฆ์ '์ปจํธ๋กค๋ฌ' ๋ผ๋ ๋จ์ด๊ฐ ๋ค์ด๊ฐ ์๋ ๊ฒ์์ ๋์น์ฑ ์ ์๋ฏ์ด ๋ฌด์์ธ๊ฐ๋ฅผ ์ ์ดํ๋ค๋ ์๋ฏธ์ธ๋ฐ, ๋ฐ๋ก ์ธ๊ทธ๋ ์ค์ ๋ช ์๋ ๊ท์น์ ์ ์ดํ๋ค๋ ๊ฒ์ด๋ค. ๊ทธ๋ ๋ค๋ฉด ๋ก๋ ๋ฐธ๋ฐ์๋ ๋ฌด์์ผ๊น? ์ง์ ๋ชฉ์ฐจ์์ ์ธ๊ทธ๋ ์ค๊ฐ ๋ก๋ ๋ฐธ๋ฐ์ ๊ธฐ๋ฅ์ ํ๋ค๊ณ ํ์ง๋ง ์๋ฐํ ๋งํ๋ฉด ๋ก๋ ๋ฐธ๋ฐ์ ์ญํ ์ ํ๋ ์๋ฒ๊ฐ ๋ณ๋๋ก ์๋๋ฐ, ์ด ์๋ฒ๊ฐ ์ธ๊ทธ๋ ์ค ์ปจํธ๋กค๋ฌ๊ฐ ๋ช ๋ นํ ๊ท์น์ ์คํ์ํค๋ ์ค์ง์ ์ธ ์ฃผ์ฒด๊ฐ ๋๋ค. ์ด ๋ก๋ ๋ฐธ๋ฐ์๋ผ๋ ์๋ฒ๋ ์ธ๊ทธ๋ ์ค ์ปจํธ๋กค๋ฌ์ ์ข ๋ฅ๊ฐ ๋ฌด์์ธ์ง์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ฐ, ๋ง์ฝ NGINX ์ธ๊ทธ๋ ์ค ์ปจํธ๋กค๋ฌ๋ผ๋ฉด ๋ก๋ ๋ฐธ๋ฐ์ ์๋ฒ๋ NGINX ์น์๋ฒ๊ฐ ๋๋ค. ์ด์ธ์ ๋ํ์ ์ธ ์ธ๊ทธ๋ ์ค ์ปจํธ๋กค๋ฌ ์ข ๋ฅ๋ก๋ NGINX, Istio, Kong, GCE ๋ฑ์ด ์๋ค. ์ฐธ๊ณ ๋ก GCE๋ ๊ตฌ๊ธ ํด๋ผ์ฐ๋ ํ๊ฒฝ์์ ๋งค๋์ง๋ k8s๋ฅผ ์ ๊ณตํ๋ GKE ํ๊ฒฝ์์ ์ฌ์ฉํ๋ ์ธ๊ทธ๋ ์ค ์ปจํธ๋กค๋ฌ์ด๋ค.
๊ฒฐ๊ตญ ์ ๋ด์ฉ์ ์ ๋ฆฌํด์ ์ธ๊ทธ๋ ์ค, ์ธ๊ทธ๋ ์ค ์ปจํธ๋กค๋ฌ, ๋ก๋ ๋ฐธ๋ฐ์ ๊ฐ์ ๊ด๊ณ๋ฅผ ์์ฝํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
- NGINX ์ธ๊ทธ๋ ์ค ์ปจํธ๋กค๋ฌ๋ ์ธ๊ทธ๋ ์ค์ ๋ช ์๋ ๊ท์น์ ๋ณธ๋ค
- ๊ทธ ๊ท์น์ ๋ณธ NGINX ์ธ๊ทธ๋ ์ค ์ปจํธ๋กค๋ฌ๋ ๋ก๋ ๋ฐธ๋ฐ์(์ค์ง์ ์ธ ์๋ฒ์ด๋ฉฐ ์ด ๊ฒฝ์ฐ NGINX ์๋ฒ๋ก ๊ตฌ์ฑ๋จ)์๊ฒ ๋ช ๋ น์ ๋ด๋ฆฐ๋ค
- ๊ทธ ๋ช ๋ น(์ธ๊ทธ๋ ์ค์ ๋ช ์๋ ๊ท์น) ๋๋ก ๋ก๋ ๋ฐธ๋ฐ์ ์๋ฒ๊ฐ ๋์ํ๋ค
๊ทธ๋์ ์ด ๊ด๊ณ๋ฅผ ๋ฐ์ํด์ k8s ํด๋ฌ์คํฐ์ ๊ทธ๋ฆผ์ ๋ค์ ๋์ํํด๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
์ธ๊ทธ๋ ์ค ์ปจํธ๋กค๋ฌ๋ ์ฃผ๋ก ๋ง์คํฐ ๋ ธ๋์ ์กด์ฌํ๋ฉฐ ์ธ๊ทธ๋ ์ค ์ปจํธ๋กค๋ฌ ์์ฒด๋ ์ฌ์ค์์ ์ปจํผ๊ทธ๋งต์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์ธ๊ทธ๋ ์ค์ ๋ก๋ ๋ฐธ๋ฐ์๋ ์ฃผ๋ก ์์ปค ๋ ธ๋์ ์กด์ฌํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ธ๊ทธ๋ ์ค ์ปจํธ๋กค๋ฌ์ ๋ก๋ ๋ฐธ๋ฐ์ ๊ฐ์ ๊ด๊ณ์ ๋ํด์๋ ์ดํด๋ณผ ํ์๊ฐ ์๋ค. ์ธ๊ทธ๋ ์ค ์ปจํธ๋กค๋ฌ๋ฅผ ๋ฐ๋์ 1๊ฐ๋ง ์ฌ์ฉํด์ผ ํ ๊น? ์๋๋ค ์ฌ๋ฌ ๊ฐ๋ฅผ ์ฌ์ฉํ ์๋ ์๋ค. ๋ง์ฝ 5๊ฐ์ ์๋ก ๋ค๋ฅธ ๊ธฐ๋ฅ์ ํ๋ ์๋น์ค๊ฐ ์กด์ฌํ๊ณ , ์ธ๊ทธ๋ ์ค ์ปจํธ๋กค๋ฌ๋ฅผ 3๊ฐ์ ์๋น์ค๋ NGINX ์ธ๊ทธ๋ ์ค ์ปจํธ๋กค๋ฌ๋ฅผ, ๋๋จธ์ง 2๊ฐ์ ์๋น์ค๋ Kong ์ธ๊ทธ๋ ์ค ์ปจํธ๋กค๋ฌ๋ฅผ ์ฌ์ฉํ๋ค๊ณ ํด๋ณด์. ์ด๋ด ๊ฒฝ์ฐ, ์ธ๊ทธ๋ ์ค ์ปจํธ๋กค๋ฌ์ ๋ก๋ ๋ฐธ๋ฐ์๋ ๊ฐ๊ฐ ๋ช ๊ฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฑธ๊น? ์ธ๊ทธ๋ ์ค ์ปจํธ๋กค๋ฌ๋ 2๊ฐ, ๋ก๋ ๋ฐธ๋ฐ์๋ 5๊ฐ์ด๋ค. ๋ก๋ ๋ฐธ๋ฐ์ ๊ฐ์๊ฐ 2๊ฐ๊ฐ ์๋๋ผ 5๊ฐ์ธ ์ด์ ๋ ๋ก๋ ๋ฐธ๋ฐ์ 1๊ฐ ๋น ํ๋์ ์๋น์ค์ ๋ถ์ด์๋ ์ฌ๋ฌ ๊ฐ์ ๋ํ๋ก์ด๋จผํธ๋ค์ ๋ถํ ๋ถ์ฐ์ ํ๊ธฐ ๋๋ฌธ์ ์๋น์ค ๊ฐ์ ๋ณ๋ก ์กด์ฌํด์ผ๋ง ํ๋ค.
์ ๋ฆฌํ์๋ฉด, ์ธ๊ทธ๋ ์ค๋ฅผ ์ ์ฉํ๋ ์์๋ ๋ค์๊ณผ ๊ฐ๋ค.
- ์ธ๊ทธ๋ ์ค ์ปจํธ๋กค๋ฌ๋ฅผ ํ๋ ์ ์ ํด ์์ฑํ๋ค
- ์ธ๊ทธ๋ ์ค ์ปจํธ๋กค๋ฌ๋ฅผ ์ธ๋ถ๋ก ๋ ธ์ถํ๋ ์๋น์ค๋ฅผ ์์ฑํ๋ค
- ๊ท์น์ ์ ์ํ๋ ์ธ๊ทธ๋ ์ค๋ฅผ ์์ฑํ๋ค
- ์ธ๊ทธ๋ ์ค๋ฅผ ์์ฑํ๋ ์๊ฐ, ์ธ๊ทธ๋ ์ค ์ปจํธ๋กค๋ฌ๋ ์ด๋ฅผ ์ธ์งํ๊ณ , ์ธ๊ทธ๋ ์ค๋ฅผ ๋ก๋ํด ๋ก๋ ๋ฐธ๋ฐ์๋ก ์ ๋ฌํ๋ค
- ๋ก๋ ๋ฐธ๋ฐ์๋ ์ธ๋ฐ์ด๋ ํธ๋ํฝ์ ์ฒ๋ฆฌํ๋ค
์ฐธ๊ณ ๋ก ์ธ๊ทธ๋ ์ค๋ฅผ ์์ฑํ๋ ์๊ฐ์ ์ธ๊ทธ๋ ์ค ์ปจํธ๋กค๋ฌ๊ฐ ์์์ฐจ๋ฆด ์ ์๋ ์ด์ ๋ Watch API๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ด Watch API๋ ์ธ๊ทธ๋ ์ค ๋ง๊ณ ๋ ์ฟ ๋ฒ๋คํฐ์ค API์์ ํน์ ์ค๋ธ์ ํธ์ ์ํ๊ฐ ๋ณํํ๋ ๊ฒ์ ํฌ์ฐฉํ ์ ์๋๋ฐ, ์๋ฅผ ๋ค์ด ๋ฆฌ์์ค ์ค๋ธ์ ํธ๊ฐ ์์ฑ, ์ญ์ , ์์ ๋ฑ์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ์ด๋ฅผ ์๋ ค์ฃผ๋ ๊ธฐ๋ฅ์ ํ๋ค. kubectl CLI ์์๋ ์ฌ์ฉํ ์ ์๋๋ฐ, ๋ํ์ ์ธ ์์๋ก ํ๋๋ฅผ Watch API๋ก ์ดํด๋ณด๋ ค๋ฉด ์๋์ ๊ฐ์ด ์ฌ์ฉํด๋ณผ ์ ์๋ค.
kubectl get pods -w
4. ์ธ๊ทธ๋ ์ค ๊ท์น ์ดํดํ๊ธฐ : ๊ธฐ์ด
๊ทธ๋ฌ๋ฉด ์ด์ ์ธ๊ทธ๋ ์ค ์์ ํ์ผ์ ๋ณด๋ฉด์ ๊ท์น์ ์ดํดํด๋ณด๋๋ก ํ์. ์๋์ ๊ฐ์ ์์ ์ธ๊ทธ๋ ์ค๊ฐ ์๋ค๊ณ ํด๋ณด์.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: zedd-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: zedd.example.com
http:
paths:
- path: /echo-hello
pathType: Prefix
backend:
service:
name: hello-service
port:
number: 80
- spec.host : ํด๋น ๋๋ฉ์ธ ์ด๋ฆ์ผ๋ก ์ ๊ทผํ๋ ์์ฒญ์ ๋ํด์ ์ฒ๋ฆฌ ๊ท์น์ ์ ์ฉํ๋ค. ์ด host ๋ ์ฌ๋ฌ ๊ฐ ์ ์ํด ์ฌ์ฉํ ์ ์์
- spec.http.paths.path : ํด๋น ๊ฒฝ๋ก์ ๋ค์ด์จ ์์ฒญ์ ์ด๋ ์๋น์ค๋ก ์ ๋ฌํ ๊ฒ์ธ์ง ์ ์ํ๋ค. ์ฌ๋ฌ ๊ฐ์ path๋ฅผ ์ ์ํ ์ ์์
- spec.http.paths.backend.service.port : ํด๋น path๋ก ๋ค์ด์จ ์์ฒญ์ด ์ ๋ฌ๋ ์๋น์ค์ ํฌํธ ๋ฒํธ๋ฅผ ์ ์ํ๋ค. ์ ์์์์๋ hello-service ๋ผ๋ ์๋น์ค ๋ช ์ ๊ฐ๋ ํ๋์ 80 ํฌํธ๋ฒํธ๋ก ์์ฒญ์ ์ ๋ฌํ๋ค
๊ทธ๋ฐ๋ฐ ๋ฐฉ๊ธ spec.http.paths.backend.service.port ํญ๋ชฉ์ ์ค๋ช ํ๋ฉด์ ์ ์๋ ์๋น์ค ์ฆ, hello-service ๋ผ๋ ์ด๋ฆ์ผ๋ก ์์ฒญ์ด ์ ๋ฌํ๋ค๊ณ ํ๋ค. ์ ํํ ๋งํ๋ฉด ์ธ๊ทธ๋ ์ค๋ ํด๋น ์๋น์ค๋ก ์์ฒญ์ ์ ๋ฌํ๋ ๊ฒ์ด ์๋ ํด๋น ์๋น์ค์ ๋ถ์ด์๋ ๋ํ๋ก์ด๋จผํธ ์ฆ, ์ค์ง์ ์ธ ์ฒ๋ฆฌ๋ฅผ ๋ด๋นํ๋ ์๋ํฌ์ธํธ๋ก ์ง์ ์ ๋ฌ๋๊ฒ ๋๋ค. ์ด๋ฌํ ๋์์ ์ฟ ๋ฒ๋คํฐ์ค์์๋ ๋ฐ์ดํจ์ค(bypass)๋ผ๊ณ ๋ถ๋ฅธ๋ค. ์ฐธ๊ณ ํด๋ณด๋๋ก ํ์.
5. ์ธ๊ทธ๋ ์ค ๊ท์น ์ดํดํ๊ธฐ : annotations(์ฃผ์)
์ด๋ฒ์๋ ์ธ๊ทธ๋ ์ค ๊ท์น ์ค ์ข ๋ ์ฌํ๋ ๋ด์ฉ์ธ annotations ํญ๋ชฉ์ ์์๋ณด๋๋ก ํ์. ์๊น ์์์ ์ดํด๋ณธ ์ธ๊ทธ๋ ์ค ์์ ์ ๋น์ทํ๋ ํ ์ค๋ง ์ถ๊ฐ๋์๋ค. annotations ํญ๋ชฉ๋ง ๋ณด์.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: zedd-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: zedd.example.com
http:
paths:
- path: /echo-hello
pathType: Prefix
backend:
service:
name: hello-service
port:
number: 80
- kubernetes.io/ingress.class : ์ธ๊ทธ๋ ์ค ๊ท์น์ ์ด๋ค ์ธ๊ทธ๋ ์ค ์ปจํธ๋กค๋ฌ์ ์ ์ฉํ ๊ฒ์ธ์ง ๋ช ์ํ๋ ๊ฒ์ด๋ค. ํ๊ฒฝ์ ๋ฐ๋ผ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ๊ฐ ํด๋น ์ฃผ์์ด ์์ผ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉํ๋ ์ธ๊ทธ๋ ์ค ์ปจํธ๋กค๋ฌ๊ฐ ๋ค๋ฅด๋ค. ์๋ฅผ ๋ค์ด, GKE ํ๊ฒฝ์์์ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ๋ฅผ ๊ตฌ์ฑํ๊ณ NGINX ์ธ๊ทธ๋ ์ค ์ปจํธ๋กค๋ฌ๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํ๋ค๋ฉด ๋ฐ๋์ ํด๋น ์ฃผ์์ "nginx" ๋ผ๊ณ ์ ์ด์ฃผ์ด์ผ ํ๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก GKE ํ๊ฒฝ์ด๊ธฐ ๋๋ฌธ์ GCE ์ธ๊ทธ๋ ์ค ์ปจํธ๋กค๋ฌ๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ค.
๋ค์์ NGINX ์ธ๊ทธ๋ ์ค ์ปจํธ๋กค๋ฌ์ ํ์ ๋ ๊ฒ์ด์ง๋ง, nginx.ingress.kubernetes.io/rewrite-target ์ด๋ผ๋ ์ฃผ์์ ๋ํด ๋ฐฐ์๋ณด์. ํด๋น ์ฃผ์์ ์ธ๊ทธ๋ ์ค์ ์ ์๋ ๊ฒฝ๋ก๋ก ๋ค์ด์ค๋ ์์ฒญ์ rewrite-target์ ์ ์ํ ๊ฒฝ๋ก(์ด ์์์์๋ ๋ฃจํธ(/) ๊ฒฝ๋ก)๋ก ์ ๋ฌํ๋ผ๋ ์๋ฏธ์ด๋ค. ์ ์์๋ก ๋ค์๋ฉด, ํด๋น ์ธ๊ทธ๋ ์ค์ /echo-hello ๋ก ์์ํ๋ ๋ชจ๋ ๊ฒฝ๋ก๋ก ๋ค์ด์จ ์์ฒญ์ hello-service ์ด๋ฆ์ธ ์๋น์ค๋ช ์ ๋ฃจํธ(/) ๊ฒฝ๋ก๋ก ๋ชจ๋ ์ ๋ฌํ๋ผ๋ ๋ป์ด๋ค. ์๋ฅผ ๋ค์ด์, /echo-hello ๊ฒฝ๋ก๋ /echo-hello/zedd ๋ /echo-hello/zedd/123 ์ด๋ ๋ชจ๋ hello-service ๋ผ๋ ์๋น์ค์ ๋ฃจํธ(/) ๊ฒฝ๋ก๋ก ์ ๋ฌํ๋ค.
์ด๋ฌํ rewrite-target์ NGINX์ ์บก์ณ ๊ทธ๋ฃน๊ณผ ํจ๊ป ์ฌ์ฉํ๋ฉด ์์ฒญ ๊ฒฝ๋ก๋ฅผ ๋ณ์๋ก ์ฌ์ฉํด ๋์ ์ผ๋ก ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค. ์์ธํ ์์๋ ์ฑ ์๋ ์๊ธด ํ์ง๋ง, ๋ฌธ์์๋ ์กด์ฌํ๋ ์ดํด๋ณด๋๋ก ํ์. ์ ๊ทํํ์๊ณผ ๋งค์ฐ ์ ์ฌํ๋ค.