๋ฉ๋ชจ ๋ฒ์ญ: Weaveworks์ ์ด ๊ฐ์์์๋ ๊ฐ์ฅ ๋๋ฆฌ ์ฌ์ฉ๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์ถ์ ์ ๋ต์ ์๊ฐํ๊ณ Kubernetes Flagger ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฅ ์ง๋ณด๋ ์ ๋ต์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค. ๊ฐ๋จํ ์ธ์ด๋ก ์์ฑ๋์์ผ๋ฉฐ ์ด๋ณด ์์ง๋์ด๋ผ๋ ๋ฌธ์ ๋ฅผ ์ดํดํ ์ ์๋ ์๊ฐ์ ๋ค์ด์ด๊ทธ๋จ์ด ํฌํจ๋์ด ์์ต๋๋ค.
๋ค์ด์ด๊ทธ๋จ์ ๋ค์์์ ๊ฐ์ ธ์จ ๊ฒ์
๋๋ค.
์ค๋๋ ํด๋ผ์ฐ๋ ๋ค์ดํฐ๋ธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ ๋ ๊ฐ์ฅ ํฐ ๊ณผ์ ์ค ํ๋๋ ๋ฐฐํฌ ์๋๋ฅผ ๋์ด๋ ๊ฒ์ ๋๋ค. ๋ง์ดํฌ๋ก์๋น์ค ์ ๊ทผ ๋ฐฉ์์์ ๊ฐ๋ฐ์๋ ์ด๋ฏธ ์์ ํ ๋ชจ๋์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉํ๊ณ ์ค๊ณํ๋ฏ๋ก ์ฌ๋ฌ ํ์ด ๋์์ ์ฝ๋๋ฅผ ์์ฑํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
๋ ์งง๊ณ ๋ ์์ฃผ ๋ฐฐํฌํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ด์ ์ด ์์ต๋๋ค.
- ์ถ์ ์๊ฐ์ด ๋จ์ถ๋ฉ๋๋ค.
- ์๋ก์ด ๊ธฐ๋ฅ์ ์ฌ์ฉ์์๊ฒ ๋ ๋น ๋ฅด๊ฒ ๋๋ฌํฉ๋๋ค.
- ์ฌ์ฉ์ ํผ๋๋ฐฑ์ ๊ฐ๋ฐํ์ ๋ ๋นจ๋ฆฌ ์ ๋ฌ๋ฉ๋๋ค. ์ด๋ ํ์ด ๋ ์ ์ํ๊ฒ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ณ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์์ ์๋ฏธํฉ๋๋ค.
- ๊ฐ๋ฐ์์ ์ฌ๊ธฐ๊ฐ ๋์์ง๋๋ค. ๊ฐ๋ฐ ์ ๋ ๋ง์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ์์ ์ด ๋ ์ฌ๋ฏธ์์ด์ง๋๋ค.
๊ทธ๋ฌ๋ ๋ฆด๋ฆฌ์ค ๋น๋๊ฐ ๋์์ง์๋ก ์ ํ๋ฆฌ์ผ์ด์
์ ์์ ์ฑ์ด๋ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ถ์ ์ ์ธ ์ํฅ์ ๋ฏธ์น ๊ฐ๋ฅ์ฑ๋ ๋์์ง๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ด์ ๋ฐ DevOps ํ์ ์ ํ๊ณผ ์ฌ์ฉ์์ ๋ํ ์ํ์ ์ต์ํํ๋ ๋ฐฉ์์ผ๋ก ํ๋ก์ธ์ค๋ฅผ ๊ตฌ์ถํ๊ณ ๋ฐฐํฌ ์ ๋ต์ ๊ด๋ฆฌํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. (CI/CD ํ์ดํ๋ผ์ธ ์๋ํ์ ๋ํด ์์ธํ ์์๋ณผ ์ ์์ต๋๋ค.
์ด ๊ฒ์๋ฌผ์์๋ ๋กค๋ง ๋ฐฐํฌ์ ์นด๋๋ฆฌ์ ๋กค์์ ๋ฐ ๊ทธ ๋ณํ๊ณผ ๊ฐ์ ๊ณ ๊ธ ๋ฐฉ๋ฒ์ ํฌํจํ์ฌ Kubernetes์ ๋ค์ํ ๋ฐฐํฌ ์ ๋ต์ ๋ํด ๋ ผ์ํฉ๋๋ค.
๋ฐฐํฌ ์ ๋ต
๋ชฉํ์ ๋ฐ๋ผ ์ฌ์ฉํ ์ ์๋ ๋ฐฐํฌ ์ ๋ต์๋ ์ฌ๋ฌ ๊ฐ์ง ์ ํ์ด ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ถ๊ฐ ํ ์คํธ๋ฅผ ์ํด ํน์ ํ๊ฒฝ์ด๋ ์ฌ์ฉ์/ํด๋ผ์ด์ธํธ ํ์ ์งํฉ์ ๋ณ๊ฒฝํด์ผ ํ๊ฑฐ๋ ๊ธฐ๋ฅ์ ๋ง๋ค๊ธฐ ์ ์ ์ ํ๋ ์ฌ์ฉ์ ํ ์คํธ๋ฅผ ์ํํด์ผ ํ ์๋ ์์ต๋๋ค. ๊ณต๊ฐ์ ์ผ๋ก ์ด์ฉ ๊ฐ๋ฅํ.
๋กค๋ง(์ ์ง์ , "๋กค๋ง" ๋ฐฐํฌ)
์ด๋ Kubernetes์ ํ์ค ๋ฐฐํฌ ์ ๋ต์ ๋๋ค. ํด๋ฌ์คํฐ ๊ฐ๋ ์ค์ง ์๊ฐ ์์ด ์ ์ง์ ์ผ๋ก ํ๋์ฉ ์ด์ ๋ฒ์ ์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์๋ ํฌ๋๋ฅผ ์ ๋ฒ์ ์ ํฌ๋๋ก ๊ต์ฒดํฉ๋๋ค.
Kubernetes๋ ์ ํฌ๋๊ฐ ์๋ํ ์ค๋น๊ฐ ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฝ๋๋ค(๋ค์์ ์ฌ์ฉํ์ฌ ํ์ธ).
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: awesomeapp
spec:
replicas: 3
template:
metadata:
labels:
app: awesomeapp
spec:
containers:
- name: awesomeapp
image: imagerepo-user/awesomeapp:new
ports:
- containerPort: 8080
๋กค์ค๋ฒ ์ ๋ฐ์ดํธ ๋งค๊ฐ๋ณ์๋ ๋งค๋ํ์คํธ ํ์ผ์์ ์ง์ ํ ์ ์์ต๋๋ค.
spec:
replicas: 3
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
template:
...
์ฌ์ฐฝ์กฐ
์ด ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฐํฌ ์ ํ์์๋ ์ด์ ํฌ๋๊ฐ ํ๊บผ๋ฒ์ ์ข ๋ฃ๋๊ณ ์ ํฌ๋๋ก ๊ต์ฒด๋ฉ๋๋ค.
ํด๋น ๋งค๋ํ์คํธ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
spec:
replicas: 3
strategy:
type: Recreate
template:
...
๋ธ๋ฃจ/๊ทธ๋ฆฐ(๋ธ๋ฃจ-๊ทธ๋ฆฐ ๋ฐฐํฌ)
๋ธ๋ฃจ-๊ทธ๋ฆฐ ๋ฐฐํฌ ์ ๋ต(๋๋๋ก ๋ ๋/๋ธ๋์ด๋ผ๊ณ ๋ ํจ)์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด์ (๊ทธ๋ฆฐ) ๋ฒ์ ๊ณผ ์(๋ธ๋ฃจ) ๋ฒ์ ์ ๋์์ ๋ฐฐํฌํ๋ ๊ฒ์ด ํฌํจ๋ฉ๋๋ค. ๋ ๋ฒ์ ์ ๋ชจ๋ ๊ฒ์ํ ํ ์ผ๋ฐ ์ฌ์ฉ์๋ ๋ น์ ๋ฒ์ ์ ์ก์ธ์คํ ์ ์๊ณ ํ๋์ ๋ฒ์ ์ QA ํ์ด ๋ณ๋์ ์๋น์ค ๋๋ ์ง์ ํฌํธ ์ ๋ฌ์ ํตํด ํ ์คํธ๋ฅผ ์๋ํํ ์ ์์ต๋๋ค.
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: awesomeapp-02
spec:
template:
metadata:
labels:
app: awesomeapp
version: "02"
ํ๋์(์) ๋ฒ์ ์ด ํ ์คํธ๋๊ณ ๋ฆด๋ฆฌ์ค๊ฐ ์น์ธ๋๋ฉด ์๋น์ค๊ฐ ํด๋น ๋ฒ์ ์ผ๋ก ์ ํ๋๊ณ ๋ น์(์ด์ ) ๋ฒ์ ์ด ์ ํ์ง๋๋ค.
apiVersion: v1
kind: Service
metadata:
name: awesomeapp
spec:
selector:
app: awesomeapp
version: "02"
...
์นด๋๋ฆฌ์(์นด๋๋ฆฌ์ ๋ฐฐํฌ)
์นด๋๋ฆฌ์ ๋กค์์์ ์ฒญ๋ก์ ๋กค์์๊ณผ ์ ์ฌํ์ง๋ง ์ ์ด ๋ฐ ์ฌ์ฉ์ด ๋ ์ข์ต๋๋ค.
์ด ์ ๋ต์ ์ผ๋ฐ์ ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฑ์๋์์ ๋ช ๊ฐ์ง ์๋ก์ด ๊ธฐ๋ฅ์ ์ํํด ๋ณด์์ผ ํ ๋ ์ฌ์ฉ๋ฉ๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ํต์ฌ์ ๊ฑฐ์ ๋์ผํ ๋ ๊ฐ์ ์๋ฒ๋ฅผ ๋ง๋๋ ๊ฒ์ ๋๋ค. ํ๋๋ ๊ฑฐ์ ๋ชจ๋ ์ฌ์ฉ์์๊ฒ ์๋น์ค๋ฅผ ์ ๊ณตํ๊ณ ๋ค๋ฅธ ํ๋๋ ์๋ก์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ์์์ ์ฌ์ฉ์ ํ์ ๊ทธ๋ฃน์๋ง ์๋น์ค๋ฅผ ์ ๊ณตํ ํ ์์ ๊ฒฐ๊ณผ๋ฅผ ๋น๊ตํฉ๋๋ค. ๋ชจ๋ ๊ฒ์ด ์ค๋ฅ ์์ด ์งํ๋๋ฉด ์ ๋ฒ์ ์ด ์ ์ฐจ์ ์ผ๋ก ์ ์ฒด ์ธํ๋ผ์ ์ถ์๋ฉ๋๋ค.
์ด ์ ๋ต์ Kubernetes๋ฅผ ์ฌ์ฉํ์ฌ ๋ ์ ์ ์ผ๋ก ๊ตฌํํ์ฌ ๊ธฐ์กด ํฌ๋๋ฅผ ์ ํฌ๋๋ก ๊ต์ฒดํ ์ ์์ง๋ง Istio์ ๊ฐ์ ์๋น์ค ๋ฉ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ํจ์ฌ ๋ ํธ๋ฆฌํ๊ณ ๊ฐ๋จํฉ๋๋ค.
์๋ฅผ ๋ค์ด Git์๋ 0.1.0 ํ๊ทธ๊ฐ ์๋ ์ผ๋ฐ ๋งค๋ํ์คํธ์ 0.2.0 ํ๊ทธ๊ฐ ์๋ ์นด๋๋ฆฌ์ ๋งค๋ํ์คํธ๋ผ๋ ๋ ๊ฐ์ง ๋งค๋ํ์คํธ๊ฐ ์์ ์ ์์ต๋๋ค. Istio ๊ฐ์ ๊ฒ์ดํธ์จ์ด ๋งค๋ํ์คํธ์์ ๊ฐ์ค์น๋ฅผ ๋ณ๊ฒฝํ๋ฉด ๋ค์ ๋ ๋ฐฐํฌ ๊ฐ์ ํธ๋ํฝ ๋ฐฐํฌ๋ฅผ ์ ์ดํ ์ ์์ต๋๋ค.
Istio๋ฅผ ์ฌ์ฉํ์ฌ Canary ๋ฐฐํฌ๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๋จ๊ณ๋ณ ๊ฐ์ด๋๋ ๋ค์์ ์ฐธ์กฐํ์ธ์.
Weaveworks Flagger๋ฅผ ์ฌ์ฉํ ์นด๋๋ฆฌ์ ๋ฐฐํฌ
Flagger๋ ์ด๋ค๊ณผ์ ์์ ์ ์๋ํํฉ๋๋ค. Istio ๋๋ AWS App Mesh๋ฅผ ์ฌ์ฉํ์ฌ ํธ๋ํฝ์ ๋ผ์ฐํ ๋ฐ ์ ํํ๊ณ Prometheus ์งํ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ๋ถ์ํฉ๋๋ค. ๋ํ ์นํํฌ๋ฅผ ํตํด ์นด๋๋ฆฌ์ ๋ฐฐํฌ ๋ถ์์ ๋ณด์ํ์ฌ ์น์ธ ํ ์คํธ, ๋ก๋ ํ ์คํธ ๋ฐ ๊ธฐํ ์ ํ์ ๊ฒ์ฌ๋ฅผ ์ํํ ์ ์์ต๋๋ค.
Kubernetes ๋ฐฐํฌ ๋ฐ ํ์ํ ๊ฒฝ์ฐ ์ํ์ Pod ํ์ฅ(HPA)์ ๊ธฐ๋ฐ์ผ๋ก Flagger๋ ๊ฐ์ฒด ์ธํธ(Kubernetes ๋ฐฐํฌ, ClusterIP ์๋น์ค ๋ฐ Istio ๋๋ App Mesh ๊ฐ์ ์๋น์ค)๋ฅผ ์์ฑํ์ฌ Canary ๋ฐฐํฌ๋ฅผ ๋ถ์ํ๊ณ ๊ตฌํํฉ๋๋ค.
์ ์ด ๋ฃจํ ๊ตฌํ (์ ์ด ๋ฃจํ),Flager๋ ์ฑ๊ณต์ ์ธ HTTP ์์ฒญ ๋น์จ, ํ๊ท ์์ฒญ ๊ธฐ๊ฐ, Pod ์ํ์ ๊ฐ์ ํต์ฌ ์ฑ๋ฅ ์งํ๋ฅผ ๋์์ ์ธก์ ํ๋ฉด์ ์ ์ฐจ์ ์ผ๋ก ํธ๋ํฝ์ ์นด๋๋ฆฌ์ ์๋ฒ๋ก ์ ํํฉ๋๋ค. KPI(ํต์ฌ์ฑ๊ณผ์งํ) ๋ถ์์ ๊ธฐ๋ฐ์ผ๋ก ์นด๋๋ฆฌ์๋ ์ฑ์ฅํ๊ฑฐ๋ ๋ถ๊ดดํ๋ฉฐ, ๋ถ์ ๊ฒฐ๊ณผ๋ Slack์ ๊ฒ์๋ฉ๋๋ค. ์ด ํ๋ก์ธ์ค์ ๋ํ ์ค๋ช
๊ณผ ์์ฐ์ ์๋ฃ์์ ์ฐพ์ ์ ์์ต๋๋ค.
๋คํฌ(์จ๊ฒจ์ง) ๋๋ A/B ๋ฐฐํฌ
์คํ ์ค ๋ฐฐํฌ๋ ์นด๋๋ฆฌ์ ์ ๋ต์ ๋ ๋ค๋ฅธ ๋ณํ์ ๋๋ค(๊ทธ๋ฐ๋ฐ Flagger๋ ์ฌ์ฉํ ์ ์์ต๋๋ค). ์คํ ์ค ๋ฐฐํฌ์ ์นด๋๋ฆฌ์ ๋ฐฐํฌ์ ์ฐจ์ด์ ์ ์คํ ์ค ๋ฐฐํฌ๋ ์นด๋๋ฆฌ์ ๋ฐฐํฌ์ ๊ฐ์ ๋ฐฑ์๋๊ฐ ์๋ ํ๋ฐํธ์๋๋ฅผ ์ฒ๋ฆฌํ๋ค๋ ๊ฒ์ ๋๋ค.
์ด๋ฌํ ๋ฐฐํฌ์ ๋ ๋ค๋ฅธ ์ด๋ฆ์ A/B ํ ์คํธ์ ๋๋ค. ์๋ก์ด ๊ธฐ๋ฅ์ ๋ชจ๋ ์ฌ์ฉ์์๊ฒ ์ ๊ณตํ๋ ๋์ ์ ํ๋ ์ผ๋ถ ์ฌ์ฉ์์๊ฒ๋ง ์ ๊ณตํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ด๋ฌํ ์ฌ์ฉ์๋ ์์ ์ด ์ ๊ตฌ์ ์ธ ํ ์คํฐ๋ผ๋ ์ฌ์ค์ ์ธ์ํ์ง ๋ชปํฉ๋๋ค(๋ฐ๋ผ์ "์คํ ์ค ๋ฐฐํฌ"๋ผ๋ ์ฉ์ด๊ฐ ์ฌ์ฉ๋จ).
๊ธฐ๋ฅ ์ค์์น ์ฌ์ฉ (๊ธฐ๋ฅ ํ ๊ธ) ๋ฐ ๊ธฐํ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ์ฉ์๊ฐ ์ ๊ธฐ๋ฅ๊ณผ ์ํธ ์์ฉํ๋ ๋ฐฉ์, ์ฌ์ฉ์์ ์ฐธ์ฌ ์ฌ๋ถ, ์ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๊ฐ ํผ๋์ค๋ฝ๋ค๊ณ ์๊ฐํ๋์ง ์ฌ๋ถ ๋ฐ ๊ธฐํ ์ ํ์ ์ธก์ ํญ๋ชฉ์ ๋ชจ๋ํฐ๋งํ ์ ์์ต๋๋ค.
์ ๊ณ ์ ๋ฐ A/B ๋ฐฐํฌ
๊ฐ์ค์น ๊ธฐ๋ฐ ๋ผ์ฐํ ์ธ์๋ Flagger๋ HTTP ๋งค๊ฐ๋ณ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์นด๋๋ฆฌ์ ์๋ฒ๋ก ํธ๋ํฝ์ ๋ผ์ฐํ ํ ์๋ ์์ต๋๋ค. A/B ํ ์คํธ์์๋ HTTP ํค๋๋ ์ฟ ํค๋ฅผ ์ฌ์ฉํ์ฌ ํน์ ์ฌ์ฉ์ ์ธ๊ทธ๋จผํธ๋ฅผ ํ๊ฒํ ํ ์ ์์ต๋๋ค. ์ด๋ ์๋ฒ์ ๋ํ ์ธ์ ๋ฐ์ธ๋ฉ์ด ํ์ํ ํ๋ฐํธ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ ํนํ ํจ๊ณผ์ ์ ๋๋ค. (์ธ์ ์ดํผ๋ํฐ). ์์ธํ ๋ด์ฉ์ Flagger ๋ฌธ์์์ ํ์ธํ ์ ์์ต๋๋ค.
์ ์๋ ๊ฐ์ฌํฉ๋๋ค.
๋ฒ์ญ๊ฐ์ ์ถ์
๋ธ๋ก๊ทธ์์๋ ์ฝ์ด๋ณด์ธ์.
- ยซ
Kubernetes์ฉ Ingress ์ปจํธ๋กค๋ฌ ๊ฐ์ ๋ฐ ๋น๊ต "; - ยซ
werf - Kubernetes์ CI/CD์ฉ ๋๊ตฌ(๊ฐ์ ๋ฐ ๋น๋์ค ๋ณด๊ณ ์) "; - ยซ
werf ๋ฐ GitLab CI๋ฅผ ์ฌ์ฉํ์ฌ ๋์ผํ ์ ํ์ ๋ง์ดํฌ๋ก์๋น์ค ๊ตฌ์ถ ๋ฐ ๋ฐฐํฌ "; - ยซ
GitOps๋ ๋ฌด์์ ๋๊น? ".
์ถ์ฒ : habr.com