ะัะธะฒะตั! ๊ธฐ๋ฅ ๋ถ๊ธฐ (๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋ฐฐํฌ, ์ฑ ๊ฒํ ๋ผ๊ณ ๋ ํจ) - ์ด๋ ๋ง์คํฐ ๋ธ๋์น๋ฟ๋ง ์๋๋ผ ๊ณ ์ ํ URL์ ๋ํ ๊ฐ ๋์ด์ค๊ธฐ ์์ฒญ๋ ๋ฐฐํฌ๋๋ ๊ฒฝ์ฐ์ ๋๋ค. ์ฝ๋๊ฐ ํ๋ก๋์ ํ๊ฒฝ์์ ์๋ํ๋์ง ํ์ธํ ์ ์์ผ๋ฉฐ, ํด๋น ๊ธฐ๋ฅ์ ๋ค๋ฅธ ํ๋ก๊ทธ๋๋จธ๋ ์ ํ ์ ๋ฌธ๊ฐ์๊ฒ ๋ณด์ฌ์ค ์ ์์ต๋๋ค. ๋์ด์ค๊ธฐ ์์ฒญ ์์ ์ ํ๋ ๋์ ์ด์ ์ฝ๋์ ๋ํ ๊ฐ๊ฐ์ ์๋ก์ด ์ปค๋ฐ ํ์ฌ ๋ฐฐํฌ๊ฐ ์ญ์ ๋๊ณ ์ ์ฝ๋์ ๋ํ ์ ๋ฐฐํฌ๊ฐ ๋กค์์๋ฉ๋๋ค. ํ ์์ฒญ์ ๋ง์คํฐ ๋ธ๋์น์ ๋ณํฉํ ๋ ์ง๋ฌธ์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ๋ ์ด์ ๊ธฐ๋ฅ ๋ถ๊ธฐ๊ฐ ํ์ํ์ง ์์ง๋ง Kubernetes ๋ฆฌ์์ค๋ ์ฌ์ ํ ํด๋ฌ์คํฐ์ ์์ต๋๋ค.
๊ธฐ๋ฅ ๋ถ๊ธฐ์ ๋ํ ์ถ๊ฐ ์ ๋ณด
Kubernetes์์ ๊ธฐ๋ฅ ๋ถ๊ธฐ๋ฅผ ๋ง๋๋ ํ ๊ฐ์ง ์ ๊ทผ ๋ฐฉ์์ ๋ค์์คํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. ๊ฐ๋จํ ๋งํด์ ํ๋ก๋์ ๊ตฌ์ฑ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
kind: Namespace
apiVersion: v1
metadata:
name: habr-back-end
...
kind: Deployment
apiVersion: apps/v1
metadata:
namespace: habr-back-end
spec:
replicas: 3
...
๊ธฐ๋ฅ ๋ธ๋์น์ ๊ฒฝ์ฐ ์๋ณ์(์: ํ ์์ฒญ ๋ฒํธ)์ ์ผ์ข ์ ์ ๋์ฌ/์ ๋ฏธ์ฌ(์: -pr-):
kind: Namespace
apiVersion: v1
metadata:
name: habr-back-end-pr-17
...
kind: Deployment
apiVersion: apps/v1
metadata:
namespace: habr-back-end-pr-17
spec:
replicas: 1
...
์ผ๋ฐ์ ์ผ๋ก ๋๋ ์ผ๋ค. ์ฟ ๋ฒ๋คํฐ์ค ์คํผ๋ ์ดํฐ (ํด๋ฌ์คํฐ ๋ฆฌ์์ค์ ์ก์ธ์คํ ์ ์๋ ์ ํ๋ฆฌ์ผ์ด์
)
$ kubectl get pods --all-namespaces | grep -e "-pr-"
NAMESPACE ... AGE
habr-back-end-pr-264 ... 4d8h
habr-back-end-pr-265 ... 5d7h
ํด๋ฌ์คํฐ์ ๊ธฐ๋ฅ ๋ถ๊ธฐ๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ฝ์ ์ ์์ต๋๋ค.
์๊ทน
์ง์์ ์ธ ํตํฉ์ด ํฌํจ๋ ์ผ๋ฐ์ ์ธ ํ ์์ฒญ ์๋ช
์ฃผ๊ธฐ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค(continuous integration
):
- ์ฐ๋ฆฌ๋ ๋ธ๋์น์ ์๋ก์ด ์ปค๋ฐ์ ํธ์ํฉ๋๋ค.
- ๋น๋์์๋ ๋ฆฐํฐ ๋ฐ/๋๋ ํ ์คํธ๊ฐ ์คํ๋ฉ๋๋ค.
- Kubernetes ํ ์์ฒญ ๊ตฌ์ฑ์ ์ฆ์ ์์ฑ๋ฉ๋๋ค(์๋ฅผ ๋ค์ด ํด๋น ๋ฒํธ๋ ์์ฑ๋ ํ ํ๋ฆฟ์ ์ฝ์ ๋ฉ๋๋ค).
- kubectl apply๋ฅผ ์ฌ์ฉํ๋ฉด ํด๋ฌ์คํฐ์ ๊ตฌ์ฑ์ด ์ถ๊ฐ๋ฉ๋๋ค(๋ฐฐํฌ).
- ํ ์์ฒญ์ด ๋ง์คํฐ ๋ธ๋์น์ ๋ณํฉ๋ฉ๋๋ค.
๋์ด์ค๊ธฐ ์์ฒญ ์์ ์ ํ๋ ๋์ ์ด์ ์ฝ๋์ ๋ํ ๊ฐ๊ฐ์ ์๋ก์ด ์ปค๋ฐ ํ์ฌ ๋ฐฐํฌ๊ฐ ์ญ์ ๋๊ณ ์ ์ฝ๋์ ๋ํ ์ ๋ฐฐํฌ๊ฐ ๋กค์์๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ํ ์์ฒญ์ด ๋ง์คํฐ ๋ธ๋์น์ ๋ณํฉ๋๋ฉด ๋ง์คํฐ ๋ธ๋์น๋ง ๋น๋๋ฉ๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ์ฐ๋ฆฌ๋ ์ด๋ฏธ ํ ์์ฒญ์ ์์ด๋ฒ๋ ธ์ผ๋ฉฐ ํด๋น Kubernetes ๋ฆฌ์์ค๋ ์ฌ์ ํ ํด๋ฌ์คํฐ์ ์๋ค๋ ๊ฒ์ด ๋ฐํ์ก์ต๋๋ค.
์ฌ์ฉ ๋ฐฉ๋ฒ
์๋ ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ํ๋ก์ ํธ๋ฅผ ์ค์นํฉ๋๋ค.
$ kubectl apply -f https://raw.githubusercontent.com/dmytrostriletskyi/stale-feature-branch-operator/master/configs/production.yml
๋ค์ ๋ด์ฉ์ผ๋ก ํ์ผ์ ์์ฑํ๊ณ ๋ค์์ ํตํด ์ค์นํ์ญ์์ค. kubectl apply -f
:
apiVersion: feature-branch.dmytrostriletskyi.com/v1
kind: StaleFeatureBranch
metadata:
name: stale-feature-branch
spec:
namespaceSubstring: -pr-
afterDaysWithoutDeploy: 3
๋งค๊ฐ ๋ณ์ ๋ค์์คํ์ด์คํ์ ๋ฌธ์์ด ๋ค๋ฅธ ๋ค์์คํ์ด์ค์ ํ ์์ฒญ์ ๋ํ ๋ค์์คํ์ด์ค๋ฅผ ํํฐ๋งํ๋ ๋ฐ ํ์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด ํด๋ฌ์คํฐ์ ๋ค์๊ณผ ๊ฐ์ ๋ค์์คํ์ด์ค๊ฐ ์๋ ๊ฒฝ์ฐ: habr-back-end
, habr-front-end
, habr-back-end-pr-17
, habr-back-end-pr-33
์ด๋ฉด ์ญ์ ํ๋ณด๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. habr-back-end-pr-17
, habr-back-end-pr-33
.
๋งค๊ฐ ๋ณ์ afterDaysWithoutDeploy ์ด์ ๋ค์์คํ์ด์ค๋ฅผ ์ญ์ ํ๋ ๋ฐ ํ์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด ๋ค์์คํ์ด์ค๊ฐ ์์ฑ๋ ๊ฒฝ์ฐ 3 ะดะฝั 1 ัะฐั
๋ค๋ก, ๋งค๊ฐ๋ณ์๋ ๋ค์์ ๋ํ๋
๋๋ค. 3 ะดะฝั
, ์ด ๋ค์์คํ์ด์ค๋ ์ญ์ ๋ฉ๋๋ค. ๋ค์์คํ์ด์ค๊ฐ ์์ฑ๋๋ฉด ๋ฐ๋ ๋ฐฉํฅ์ผ๋ก๋ ์๋ํฉ๋๋ค. 2 ะดะฝั 23 ัะฐัะฐ
๋ค๋ก, ๋งค๊ฐ๋ณ์๋ ๋ค์์ ๋ํ๋
๋๋ค. 3 ะดะฝั
, ์ด ๋ค์์คํ์ด์ค๋ ์ญ์ ๋์ง ์์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ํ๋ ๋ ์์ต๋๋ค. ๋ชจ๋ ๋ค์์คํ์ด์ค๋ฅผ ์ค์บํ๊ณ ๋ฐฐํฌํ์ง ์์ ๊ธฐ๊ฐ์ ํ์ธํ๋ ๋น๋๋ฅผ ๋ด๋นํฉ๋๋ค. ๋งค๋ถ ํ์ธ. ๊ธฐ๋ณธ์ ์ผ๋ก๋ ๋์ผํฉ๋๋ค. 30 ะผะธะฝััะฐะผ
.
์ด๊ฑฐ ์ด๋ป๊ฒ ์๋ ์์ผ์
์ค์ ๋ก๋ ๋ค์์ด ํ์ํฉ๋๋ค.
๋์ปค ๊ณ ๋ฆฝ๋ ํ๊ฒฝ์์ ์์ ํ๊ธฐ ์ํด๋ฏธ๋์ฟ ๋ฒ Kubernetes ํด๋ฌ์คํฐ๋ฅผ ๋ก์ปฌ๋ก ์์ฑํฉ๋๋ค.์ฟ ๋ฒ ํ โ ํด๋ฌ์คํฐ ๊ด๋ฆฌ๋ฅผ ์ํ ๋ช ๋ น์ค ์ธํฐํ์ด์ค์ ๋๋ค.
Kubernetes ํด๋ฌ์คํฐ๋ฅผ ๋ก์ปฌ์์ ์์ฑํฉ๋๋ค.
$ minikube start --vm-driver=docker
minikube v1.11.0 on Darwin 10.15.5
Using the docker driver based on existing profile.
Starting control plane node minikube in cluster minikube.
์ง์ kubectl
๊ธฐ๋ณธ์ ์ผ๋ก ๋ก์ปฌ ํด๋ฌ์คํฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
$ kubectl config use-context minikube
Switched to context "minikube".
ํ๋ก๋์ ํ๊ฒฝ์ ๋ํ ๊ตฌ์ฑ์ ๋ค์ด๋ก๋ํฉ๋๋ค.
$ curl https://raw.githubusercontent.com/dmytrostriletskyi/stale-feature-branch-operator/master/configs/production.yml > stale-feature-branch-production-configs.yml
ํ๋ก๋์
๊ตฌ์ฑ์ ์ด์ ๋ค์์คํ์ด์ค๋ฅผ ํ์ธํ๋๋ก ๊ตฌ์ฑ๋์ด ์์ง๋ง ์๋ก ์์ฑ๋ ํด๋ฌ์คํฐ์๋ ํด๋น ๋ค์์คํ์ด์ค๊ฐ ์์ผ๋ฏ๋ก ํ๊ฒฝ ๋ณ์๋ฅผ ๊ต์ฒดํฉ๋๋ค. IS_DEBUG
์ true
. ์ด ๊ฐ์ ์ฌ์ฉํ๋ฉด ๋งค๊ฐ๋ณ์ afterDaysWithoutDeploy
๋ฐฐํฌํ์ง ์์ ๋ ๋์์ ๊ณ ๋ ค๋์ง ์์ผ๋ฉฐ ๋ค์์คํ์ด์ค๋ ํ์ธ๋์ง ์์ผ๋ฉฐ ํ์ ๋ฌธ์์ด(-pr-
).
์ผ์ ธ ์๋ ๊ฒฝ์ฐ Linux
:
$ sed -i 's|false|true|g' stale-feature-branch-production-configs.yml
์ผ์ ธ ์๋ ๊ฒฝ์ฐ macOS
:
$ sed -i "" 's|false|true|g' stale-feature-branch-production-configs.yml
ํ๋ก์ ํธ ์ค์น:
$ kubectl apply -f stale-feature-branch-production-configs.yml
ํด๋ฌ์คํฐ์ ๋ฆฌ์์ค๊ฐ ๋ํ๋๋์ง ํ์ธ StaleFeatureBranch
:
$ kubectl api-resources | grep stalefeaturebranches
NAME ... APIGROUP ... KIND
stalefeaturebranches ... feature-branch.dmytrostriletskyi.com ... StaleFeatureBranch
ํด๋ฌ์คํฐ์ ์ฐ์ฐ์๊ฐ ๋ํ๋๋์ง ํ์ธํฉ๋๋ค.
$ kubectl get pods --namespace stale-feature-branch-operator
NAME ... STATUS ... AGE
stale-feature-branch-operator-6bfbfd4df8-m7sch ... Running ... 38s
๋ก๊ทธ๋ฅผ ๋ณด๋ฉด ๋ฆฌ์์ค๋ฅผ ์ฒ๋ฆฌํ ์ค๋น๊ฐ ๋ ๊ฒ์
๋๋ค. StaleFeatureBranch
:
$ kubectl logs stale-feature-branch-operator-6bfbfd4df8-m7sch -n stale-feature-branch-operator
... "msg":"Operator Version: 0.0.1"}
...
... "msg":"Starting EventSource", ... , "source":"kind source: /, Kind="}
... "msg":"Starting Controller", ...}
... "msg":"Starting workers", ..., "worker count":1}
๊ธฐ์ฑํ์ ์ค์นํฉ๋๋ค fixtures
(ํด๋ฌ์คํฐ ๋ฆฌ์์ค ๋ชจ๋ธ๋ง์ ์ํด ๋ฏธ๋ฆฌ ๋ง๋ค์ด์ง ๊ตฌ์ฑ) StaleFeatureBranch
:
$ kubectl apply -f https://raw.githubusercontent.com/dmytrostriletskyi/stale-feature-branch-operator/master/fixtures/stale-feature-branch.yml
๊ตฌ์ฑ์ ํ์ ๋ฌธ์์ด์ด ์๋ ๋ค์์คํ์ด์ค๋ฅผ ๊ฒ์ํ๋๋ก ๋ํ๋
๋๋ค. -pr-
ํ๋ฒ์ 1 ะผะธะฝััั
.:
apiVersion: feature-branch.dmytrostriletskyi.com/v1
kind: StaleFeatureBranch
metadata:
name: stale-feature-branch
spec:
namespaceSubstring: -pr-
afterDaysWithoutDeploy: 1
checkEveryMinutes: 1
์ด์์๊ฐ ์๋ตํ์ผ๋ฉฐ ๋ค์์คํ์ด์ค๋ฅผ ํ์ธํ ์ค๋น๊ฐ ๋์์ต๋๋ค.
$ kubectl logs stale-feature-branch-operator-6bfbfd4df8-m7sch -n stale-feature-branch-operator
... "msg":"Stale feature branch is being processing.","namespaceSubstring":"-pr-","afterDaysWithoutDeploy":1,"checkEveryMinutes":1,"isDebug":"true"}
์ธํธ fixtures
, ๋ ๊ฐ์ ๋ค์์คํ์ด์ค๋ฅผ ํฌํจํฉ๋๋ค(project-pr-1
, project-pr-2
) ๊ทธ๋ฆฌ๊ณ ๊ทธ๋ค deployments
, services
, ingress
, ๋ฑ๋ฑ:
$ kubectl apply -f https://raw.githubusercontent.com/dmytrostriletskyi/stale-feature-branch-operator/master/fixtures/first-feature-branch.yml -f https://raw.githubusercontent.com/dmytrostriletskyi/stale-feature-branch-operator/master/fixtures/second-feature-branch.yml
...
namespace/project-pr-1 created
deployment.apps/project-pr-1 created
service/project-pr-1 created
horizontalpodautoscaler.autoscaling/project-pr-1 created
secret/project-pr-1 created
configmap/project-pr-1 created
ingress.extensions/project-pr-1 created
namespace/project-pr-2 created
deployment.apps/project-pr-2 created
service/project-pr-2 created
horizontalpodautoscaler.autoscaling/project-pr-2 created
secret/project-pr-2 created
configmap/project-pr-2 created
ingress.extensions/project-pr-2 created
์์ ๋ชจ๋ ๋ฆฌ์์ค๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์์ฑ๋์๋์ง ํ์ธํฉ๋๋ค.
$ kubectl get namespace,pods,deployment,service,horizontalpodautoscaler,configmap,ingress -n project-pr-1 && kubectl get namespace,pods,deployment,service,horizontalpodautoscaler,configmap,ingress -n project-pr-2
...
NAME ... READY ... STATUS ... AGE
pod/project-pr-1-848d5fdff6-rpmzw ... 1/1 ... Running ... 67s
NAME ... READY ... AVAILABLE ... AGE
deployment.apps/project-pr-1 ... 1/1 ... 1 ... 67s
...
์ฐ๋ฆฌ๊ฐ ํฌํจํ๊ธฐ ๋๋ฌธ์ debug
, ๋ค์์คํ์ด์ค project-pr-1
ะธ project-pr-2
๋ฐ๋ผ์ ๋ค๋ฅธ ๋ชจ๋ ๋ฆฌ์์ค๋ ๋งค๊ฐ๋ณ์๋ฅผ ๊ณ ๋ คํ์ง ์๊ณ ์ฆ์ ์ญ์ ๋์ด์ผ ํฉ๋๋ค. afterDaysWithoutDeploy
. ์ด๋ ์ด์์ ๋ก๊ทธ์์ ํ์ธํ ์ ์์ต๋๋ค.
$ kubectl logs stale-feature-branch-operator-6bfbfd4df8-m7sch -n stale-feature-branch-operator
... "msg":"Namespace should be deleted due to debug mode is enabled.","namespaceName":"project-pr-1"}
... "msg":"Namespace is being processing.","namespaceName":"project-pr-1","namespaceCreationTimestamp":"2020-06-16 18:43:58 +0300 EEST"}
... "msg":"Namespace has been deleted.","namespaceName":"project-pr-1"}
... "msg":"Namespace should be deleted due to debug mode is enabled.","namespaceName":"project-pr-2"}
... "msg":"Namespace is being processing.","namespaceName":"project-pr-2","namespaceCreationTimestamp":"2020-06-16 18:43:58 +0300 EEST"}
... "msg":"Namespace has been deleted.","namespaceName":"project-pr-2"}
์์์ ๊ฐ์ฉ์ฑ์ ํ์ธํ๋ฉด ์ํ๊ฐ ๋ฉ๋๋ค. Terminating
(์ญ์ ํ๋ก์ธ์ค) ๋๋ ์ด๋ฏธ ์ญ์ ๋์์ต๋๋ค(๋ช
๋ น ์ถ๋ ฅ์ด ๋น์ด ์์).
$ kubectl get namespace,pods,deployment,service,horizontalpodautoscaler,configmap,ingress -n project-pr-1 && kubectl get namespace,pods,deployment,service,horizontalpodautoscaler,configmap,ingress -n project-pr-2
...
์์ฑ ๊ณผ์ ์ ๋ฐ๋ณตํ ์ ์์ต๋๋ค. fixtures
์ฌ๋ฌ ๋ฒ ๋ฐ๋ณตํ๊ณ XNUMX๋ถ ์ด๋ด์ ์ ๊ฑฐ๋์๋์ง ํ์ธํ์ญ์์ค.
๋์
ํด๋ฌ์คํฐ์์ ์ผํ๋ ์ด์์ ๋์ ๋ฌด์์ ํ ์ ์๋์? ์ฌ๋ฌ ๊ฐ์ง ์ ๊ทผ ๋ฐฉ์์ด ์์ผ๋ฉฐ ๋ชจ๋ ๋ถ์์ ํ๋ฉฐ(๋จ์ ์ ์ฃผ๊ด์ ์) ๋ชจ๋ ์ฌ๋์ด ํน์ ํ๋ก์ ํธ์ ๊ฐ์ฅ ์ ํฉํ ๊ฒ์ด ๋ฌด์์ธ์ง ์ค์ค๋ก ๊ฒฐ์ ํฉ๋๋ค.
-
๋ง์คํฐ ๋ธ๋์น์ ์ง์์ ์ธ ํตํฉ ๋น๋ ์ค์ ๊ธฐ๋ฅ ๋ธ๋์น๋ฅผ ์ญ์ ํฉ๋๋ค.
- ์ด๋ ๊ฒ ํ๋ ค๋ฉด ๋น๋ ์ค์ธ ์ปค๋ฐ๊ณผ ๊ด๋ จ๋ ํ ์์ฒญ์ด ๋ฌด์์ธ์ง ์์์ผ ํฉ๋๋ค. ๊ธฐ๋ฅ ๋ธ๋์น ๋ค์์คํ์ด์ค์๋ ํ ์์ฒญ ์๋ณ์(ํด๋น ๋ฒํธ ๋๋ ๋ธ๋์น ์ด๋ฆ)๊ฐ ํฌํจ๋์ด ์์ผ๋ฏ๋ก ์๋ณ์๋ ํญ์ ์ปค๋ฐ์ ์ง์ ๋์ด์ผ ํฉ๋๋ค.
- ๋ง์คํฐ ๋ธ๋์น ๋น๋๊ฐ ์คํจํฉ๋๋ค. ์๋ฅผ ๋ค์ด ํ๋ก์ ํธ ๋ค์ด๋ก๋, ํ ์คํธ ์คํ, ํ๋ก์ ํธ ๋น๋, ๋ฆด๋ฆฌ์ค ๋ง๋ค๊ธฐ, ์๋ฆผ ๋ณด๋ด๊ธฐ, ๋ง์ง๋ง ๋์ด์ค๊ธฐ ์์ฒญ์ ๊ธฐ๋ฅ ๋ถ๊ธฐ ์ง์ฐ๊ธฐ ๋ฑ์ ๋จ๊ณ๊ฐ ์์ต๋๋ค. ์๋ฆผ์ ๋ณด๋ผ ๋ ๋น๋๊ฐ ์คํจํ๋ฉด ํด๋ฌ์คํฐ์ ๋ชจ๋ ๋ฆฌ์์ค๋ฅผ ์๋์ผ๋ก ์ญ์ ํด์ผ ํฉ๋๋ค.
- ์ ์ ํ ์ปจํ ์คํธ๊ฐ ์์ผ๋ฉด ๋ง์คํฐ ๋น๋์์ ๊ธฐ๋ฅ ๋ถ๊ธฐ๋ฅผ ์ญ์ ํ๋ ๊ฒ์ด ๋ช ํํ์ง ์์ต๋๋ค.
-
์นํ ์ฌ์ฉ(
์ ).- ์ด๊ฒ์ ๊ทํ์ ์ ๊ทผ ๋ฐฉ์์ด ์๋ ์๋ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด,
์ ํจ์ค , ํ ๊ฐ์ง ์ ํ์ ํ์ดํ๋ผ์ธ๋ง์ด ํด๋น ๊ตฌ์ฑ์ ์์ค ์ฝ๋์ ์ ์ฅํ๋ ๊ธฐ๋ฅ์ ์ง์ํฉ๋๋ค. ์นํํฌ๋ฅผ ์ฌ์ฉํ ๋ ์ด๋ฅผ ์ฒ๋ฆฌํ๋ ค๋ฉด ์์ฒด ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค. ์ด ์คํฌ๋ฆฝํธ๋ ์ ์ง ๊ด๋ฆฌ๊ฐ ์ด๋ ค์ด Jenkins ์ธํฐํ์ด์ค์ ๋ฐฐ์น๋์ด์ผ ํฉ๋๋ค.
- ์ด๊ฒ์ ๊ทํ์ ์ ๊ทผ ๋ฐฉ์์ด ์๋ ์๋ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด,
-
์ฐ๊ธฐ
ํฌ๋ก ์ก Kubernetes ํด๋ฌ์คํฐ๋ฅผ ์ถ๊ฐํฉ๋๋ค.- ๊ธ์ฐ๊ธฐ์ ์ง์์ ์๊ฐ์ ๋ณด๋ ๋๋ค.
- ์ด์์๋ ์ด๋ฏธ ์ ์ฌํ ์คํ์ผ๋ก ์์ ํ๊ณ ๋ฌธ์ํ๋์ด ์ง์๋ฉ๋๋ค.
๊ธฐ์ฌ์ ๊ด์ฌ์ ๊ฐ์ ธ ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค.
์ถ์ฒ : habr.com