Kubernetes์์ ๋ง์ดํฌ๋ก์๋น์ค๋ฅผ ๊ฐ๋ฐํ๋ ๊ฒ์ ๋ํ ์์ฒญ์ด ์ ์ ๋ ๋ง์์ง๊ณ ์์ต๋๋ค. ํนํ ํด์๋ ์ธ์ด์ ๊ฐ๋ฐ์๋ ์์ ์ด ์ ํธํ๋ IDE์์ ์ฝ๋๋ฅผ ์ ์ํ๊ฒ ์์ ํ๊ณ ๋น๋/๋ฐฐํฌ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๊ฐ๋จํ F5๋ฅผ ๋๋ฌ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ๊ธฐ๋ฅผ ์ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ชจ๋๋ฆฌ์ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ฒฝ์ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์น ์๋ฒ(Docker, VirtualBox...)๋ฅผ ๋ก์ปฌ์ ์ค์นํ ๋ค์ ์ฆ์ ๊ฐ๋ฐ์ ์ฆ๊ธฐ๋ ๊ฒ๋ง์ผ๋ก๋ ์ถฉ๋ถํ์ต๋๋ค. ๋ชจ๋๋ฆฌ์ค๋ฅผ ๋ง์ดํฌ๋ก์๋น์ค๋ก ์ ๋จํ๊ณ Kubernetes๊ฐ ๋ฑ์ฅํ๋ฉด์ ์๋ก์ ๋ํ ์ข
์์ฑ์ด ๋ํ๋๋ฉด์ ๋ชจ๋ ๊ฒ์ด
์๋ก ๋ค๋ฅธ ์๊ธฐ์ ์ฐ๋ฆฌ๋ ๋ฌธ์ ์ ๋ํด ์๋ก ๋ค๋ฅธ ํด๊ฒฐ์ฑ ์ ์๋ํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ถ์ ๋ ํด๊ฒฐ ๋ฐฉ๋ฒ ๋๋ ๊ฐ๋จํ "๋ชฉ๋ฐ"๋ถํฐ ์์ํ๊ฒ ์ต๋๋ค.
1. ๋ชฉ๋ฐ
๋๋ถ๋ถ์ IDE์๋ FTP/SFTP๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฒ์์ ์ง์ ์ฝ๋๋ฅผ ํธ์งํ ์ ์๋ ๊ธฐ๋ฅ์ด ์์ต๋๋ค. ์ด ๊ฒฝ๋ก๋ ๋งค์ฐ ๋ถ๋ช ํ๋ฏ๋ก ์ฐ๋ฆฌ๋ ์ฆ์ ์ด ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ๊ทธ ๋ณธ์ง์ ๋ค์๊ณผ ๊ฐ์ด ์์ฝ๋ฉ๋๋ค.
- ๊ฐ๋ฐ ํ๊ฒฝ(๊ฐ๋ฐ/๊ฒํ ) ํฌ๋์์๋ SSH ์ก์ธ์ค๋ฅผ ํตํด ์ถ๊ฐ ์ปจํ ์ด๋๊ฐ ์์๋๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ปค๋ฐ/๋ฐฐํฌํ ๊ฐ๋ฐ์์ ๊ณต๊ฐ SSH ํค๋ฅผ ์ ๋ฌํฉ๋๋ค.
- ์ด๊ธฐํ ๋จ๊ณ(์ปจํ
์ด๋ ๋ด)
prepare-app
) ์ฝ๋๋ฅผ ๋ค์์ผ๋ก ์ ์กํฉ๋๋ค.emptyDir
์ ํ๋ฆฌ์ผ์ด์ ์ปจํ ์ด๋์ SSH ์๋ฒ์ ์ฝ๋์ ์ก์ธ์คํ ์ ์์ต๋๋ค.
์ด๋ฌํ ์ฒด๊ณ์ ๊ธฐ์ ์ ๊ตฌํ์ โโ๋ ์ ์ดํดํ๊ธฐ ์ํด Kubernetes์์ ๊ด๋ จ๋ YAML ๊ตฌ์ฑ์ ์ผ๋ถ๋ฅผ ์ ๊ณตํ๊ฒ ์ต๋๋ค.
๊ตฌ์ฑ
1.1. ๊ฐ.yaml
ssh_pub_key:
vasya.pupkin: <ssh public key in base64>
์ฌ๊ธฐ์ vasya.pupkin
๋ณ์์ ๊ฐ์
๋๋ค ${GITLAB_USER_LOGIN}
.
1.2. ๋ฐฐํฌ.yaml
...
{{ if eq .Values.global.debug "yes" }}
volumes:
- name: ssh-pub-key
secret:
defaultMode: 0600
secretName: {{ .Chart.Name }}-ssh-pub-key
- name: app-data
emptyDir: {}
initContainers:
- name: prepare-app
{{ tuple "backend" . | include "werf_container_image" | indent 8 }}
volumeMounts:
- name: app-data
mountPath: /app-data
command: ["bash", "-c", "cp -ar /app/* /app-data/" ]
{{ end }}
containers:
{{ if eq .Values.global.debug "yes" }}
- name: ssh
image: corbinu/ssh-server
volumeMounts:
- name: ssh-pub-key
readOnly: true
mountPath: /root/.ssh/authorized_keys
subPath: authorized_keys
- name: app-data
mountPath: /app
ports:
- name: ssh
containerPort: 22
protocol: TCP
{{ end }}
- name: backend
volumeMounts:
{{ if eq .Values.global.debug "yes" }}
- name: app-data
mountPath: /app
{{ end }}
command: ["/usr/sbin/php-fpm7.2", "--fpm-config", "/etc/php/7.2/php-fpm.conf", "-F"]
...
1.3. ๋น๋ฐ.yaml
{{ if eq .Values.global.debug "yes" }}
apiVersion: v1
kind: Secret
metadata:
name: {{ .Chart.Name }}-ssh-pub-key
type: Opaque
data:
authorized_keys: "{{ first (pluck .Values.global.username .Values.ssh_pub_key) }}"
{{ end }}
์ต์ข ํฐ์น
๊ทธ ํ ๋จ์ ๊ฒ์ ์ ์กํ๋ ๊ฒ์
๋๋ค
dev:
stage: deploy
script:
- type multiwerf && source <(multiwerf use 1.0 beta)
- type werf && source <(werf ci-env gitlab --tagging-strategy tag-or-branch --verbose)
- werf deploy
--namespace ${CI_PROJECT_NAME}-stage
--set "global.env=stage"
--set "global.git_rev=${CI_COMMIT_SHA}"
--set "global.debug=yes"
--set "global.username=${GITLAB_USER_LOGIN}"
tags:
- build
Voila: ๋ฐฐํฌ๋ฅผ ์์ํ ๊ฐ๋ฐ์๋ ์๋น์ค ์ด๋ฆ์ผ๋ก ์ฐ๊ฒฐํ ์ ์์ต๋๋ค(ํด๋ฌ์คํฐ์ ๋ํ ์ก์ธ์ค ๊ถํ์ ์์ ํ๊ฒ ๋ถ์ฌํ๋ ๋ฐฉ๋ฒ,
์ด๋ ์๋ฒฝํ๊ฒ ์๋ํ๋ ์๋ฃจ์ ์ด์ง๋ง ๊ตฌํ ๊ด์ ์์ ๋ณผ ๋ ๋ค์๊ณผ ๊ฐ์ ๋ช ๋ฐฑํ ๋จ์ ์ด ์์ต๋๋ค.
- ๋์ค์ ์ฝ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋๋ Helm ์ฐจํธ๋ฅผ ๊ฐ์ ํด์ผ ํ ํ์์ฑ;
- ์๋น์ค๋ฅผ ๋ฐฐํฌํ ์ฌ๋๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ๊ทธ๋ฐ ๋ค์ ์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ก์ปฌ ๋๋ ํฐ๋ฆฌ์ ๋๊ธฐํํ๊ณ Git์ ์ปค๋ฐํด์ผ ํฉ๋๋ค.
2. ํ ๋ ํ๋ ์ฆ์ค
๊ณํ
์์ปจ๋ ๋ชจ๋ ๊ฒ์ด ๊ทธ๋ ๊ฒ ๋ฌด์ญ์ง ์์ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค. ์ฐ๋ฆฌ๋ ๊ฐ๋ฐ์ ์ธก์์ ์คํ์ด ํ์ํ ๋ชจ๋ ์์
์ Helm ์ฐจํธ ํ
์คํธ ํ์ผ์ ๋ฐฐ์นํ์ต๋๋ค. NOTES.txt
. ๋ฐ๋ผ์ Kubernetes์ ์๋น์ค๋ฅผ ๋ฐฐํฌํ ํ ๊ฐ๋ฐ์๋ GitLab ์์
๋ก๊ทธ์์ ๋ก์ปฌ ๊ฐ๋ฐ ํ๊ฒฝ์ ์์ํ๊ธฐ ์ํ ์ง์นจ์ ๋ณผ ์ ์์ต๋๋ค.
!!! ะ ะฐะทัะฐะฑะพัะบะฐ ัะตัะฒะธัะฐ ะปะพะบะฐะปัะฝะพ, ะฒ ัะพััะฐะฒะต Kubernetes !!!
* ะะฐัััะพะนะบะฐ ะพะบััะถะตะฝะธั
* * ะะพะปะถะตะฝ ะฑััั ะดะพัััะฟ ะดะพ ะบะปะฐััะตัะฐ ัะตัะตะท VPN
* * ะะฐ ะปะพะบะฐะปัะฝะพะผ ะะ ัััะฐะฝะพะฒะปะตะฝ kubectl ( https://kubernetes.io/docs/tasks/tools/install-kubectl/ )
* * ะะพะปััะธัั config-ัะฐะนะป ะดะปั kubectl (ัะบะพะฟะธัะพะฒะฐัั ะฒ ~/.kube/config)
* * ะะฐ ะปะพะบะฐะปัะฝะพะผ ะะ ัััะฐะฝะพะฒะปะตะฝ telepresence ( https://www.telepresence.io/reference/install )
* * ะะพะปะถะตะฝ ะฑััั ัััะฐะฝะพะฒะปะตะฝ Docker
* * ะะตะพะฑั
ะพะดะธะผ ะดะพัััะฟ ััะพะฒะฝั reporter ะธะปะธ ะฒััะต ะบ ัะตะฟะพะทะธัะพัะธั https://gitlab.site.com/group/app
* * ะะตะพะฑั
ะพะดะธะผะพ ะทะฐะปะพะณะธะฝะธััั ะฒ registry ั ะปะพะณะธะฝะพะผ/ะฟะฐัะพะปะตะผ ะพั GitLab (ะดะตะปะฐะตััั ะพะดะธะฝ ัะฐะท):
#########################################################################
docker login registry.site.com
#########################################################################
* ะะฐะฟััะบ ะพะบััะถะตะฝะธั
#########################################################################
telepresence --namespace {{ .Values.global.env }} --swap-deployment {{ .Chart.Name }}:backend --mount=/tmp/app --docker-run -v `pwd`:/app -v /tmp/app/var/run/secrets:/var/run/secrets -ti registry.site.com/group/app/backend:v8
#########################################################################
๋ง์ง๋ง ๋จ๊ณ๋ฅผ ์ ์ธํ๊ณ ์ด ์ง์นจ์ ์ค๋ช ๋ ๋จ๊ณ์ ๋ํด ์์ธํ ์ค๋ช ํ์ง ์๊ฒ ์ต๋๋ค. Telepresence๊ฐ ์ถ์๋๋ ๋์ ์ด๋ค ์ผ์ด ๋ฐ์ํ๋์?
ํ ๋ ํ๋ ์ฆ์ค ์์
์์ ์(์ ์ง์นจ์ ์ง์ ๋ ๋ง์ง๋ง ๋ช ๋ น ์ฌ์ฉ) ๋ค์์ ์ค์ ํฉ๋๋ค.
- ๋ง์ดํฌ๋ก์๋น์ค๊ฐ ์คํ๋๋ ๋ค์์คํ์ด์ค
- ์นจํฌํ๋ ค๋ ๋ฐฐํฌ ๋ฐ ์ปจํ ์ด๋์ ์ด๋ฆ์ ๋๋ค.
๋๋จธ์ง ์ธ์๋ ์ ํ ์ฌํญ์
๋๋ค. ์ฐ๋ฆฌ ์๋น์ค๊ฐ Kubernetes API์ ์ํธ ์์ฉํ๋ ๊ฒฝ์ฐ --mount=true
(๋๋ --mount=/dst_path
), ๊ทธ๋ฌ๋ฉด Kubernetes ์ปจํ
์ด๋์ ๋ฃจํธ(/)๊ฐ ๋ฐ์คํฌํ์ ๋ง์ดํธ๋ฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ (OS ๋ฐ ์ ํ๋ฆฌ์ผ์ด์
์์ ๋ฐฉ๋ฒ์ ๋ฐ๋ผ) ํด๋ฌ์คํฐ์ "ํค"๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋จผ์ Docker ์ปจํ
์ด๋์์ ์ ํ๋ฆฌ์ผ์ด์
์ ์คํํ๊ธฐ ์ํ ๊ฐ์ฅ ๋ณดํธ์ ์ธ ์ต์
์ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์ด๋ฅผ ์ํด ์ฐ๋ฆฌ๋ ํค๋ฅผ ์ฌ์ฉํ ๊ฒ์
๋๋ค --docker-run
์ฝ๋๊ฐ ํฌํจ๋ ๋๋ ํฐ๋ฆฌ๋ฅผ ์ปจํ
์ด๋์ ๋ง์ดํธํฉ๋๋ค. -v `pwd`:/app
์ด๋ ํ๋ก์ ํธ ๋๋ ํฐ๋ฆฌ์์ ์คํ๋๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์
์ฝ๋๋ ๋๋ ํฐ๋ฆฌ์ ๋ง์ดํธ๋ฉ๋๋ค. /app
์ปจํ
์ด๋์.
๋ค์ : -v /tmp/app/var/run/secrets:/var/run/secrets
โ ์ธ์ฆ์/ํ ํฐ์ด ์๋ ๋๋ ํฐ๋ฆฌ๋ฅผ ์ปจํ
์ด๋์ ๋ง์ดํธํฉ๋๋ค.
์ด ์ต์
๋ค์๋ ๋ง์ง๋ง์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์
์ด ์คํ๋ ์ด๋ฏธ์ง๊ฐ ์ต๋๋ค. NB: ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ ๋ ๋ค์์ ์ง์ ํด์ผ ํฉ๋๋ค. CMD
๋๋ ENTRYPOINT
!
๋ค์์ ์ ํํ ๋ฌด์จ ์ผ์ด ์ผ์ด๋ ๊น์?
- Kubernetes์์๋ ์ง์ ๋ ๋ฐฐํฌ์ ๋ํด ๋ณต์ ๋ณธ ์๊ฐ 0์ผ๋ก ๋ณ๊ฒฝ๋ฉ๋๋ค. ๋์ ๋์ฒด ์ปจํ
์ด๋๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ฐฐํฌ๊ฐ ์์๋ฉ๋๋ค.
backend
. - 2๊ฐ์ ์ปจํ ์ด๋๊ฐ ๋ฐ์คํฌํฑ์์ ์คํ๋ฉ๋๋ค. ์ฒซ ๋ฒ์งธ๋ Telepresence(Kubernetes์์ ์์ฒญ์ ํ๋ก์ ์ฒ๋ฆฌํจ)๋ฅผ ์ฌ์ฉํ๊ณ , ๋ ๋ฒ์งธ๋ ๊ฐ๋ฐ ์ค์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉํฉ๋๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉํ์ฌ ์ปจํ ์ด๋์ ์คํํ๋ฉด ๋ฐฐํฌ ์ค์ Helm์ด ์ ์กํ ๋ชจ๋ ENV ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ๋ชจ๋ ์๋น์ค๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋จ์ ๊ฒ์ ์ฆ๊ฒจ ์ฌ์ฉํ๋ IDE์์ ์ฝ๋๋ฅผ ํธ์งํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ์ฆ๊ธฐ๋ ๊ฒ๋ฟ์ ๋๋ค.
- ์์ ์ด ๋๋๋ฉด Telepresence๊ฐ ์คํ ์ค์ธ ํฐ๋ฏธ๋์ ๋ซ์ผ๋ฉด ๋ฉ๋๋ค(Ctrl+C๋ฅผ ์ฌ์ฉํ์ฌ ์ธ์ ์ข ๋ฃ). Docker ์ปจํ ์ด๋๋ ๋ฐ์คํฌํฑ์์ ์ค์ง๋๊ณ Kubernetes์์๋ ๋ชจ๋ ๊ฒ์ด ์ด๊ธฐ ์ํ๋ก ๋์๊ฐ๋๋ค. ๋จ์ ๊ฒ์ ์ปค๋ฐํ๊ณ , MR์ ๋ฐํํ๊ณ ์ด๋ฅผ ๊ฒํ /๋ณํฉ/โฆ์ผ๋ก ์ ์กํ๋ ๊ฒ์ ๋๋ค(์ํฌํ๋ก์ ๋ฐ๋ผ ๋ค๋ฆ).
Docker ์ปจํ ์ด๋์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๊ณ ์ถ์ง ์์ ๊ฒฝ์ฐ(์๋ฅผ ๋ค์ด PHP๊ฐ ์๋ Go์์ ๊ฐ๋ฐํ๊ณ ์ฌ์ ํ ๋ก์ปฌ๋ก ๋น๋ํ๋ ๊ฒฝ์ฐ) Telepresence๋ฅผ ์์ํ๋ ๊ฒ์ด ํจ์ฌ ๋ ๊ฐ๋จํ ๊ฒ์ ๋๋ค.
telepresence --namespace {{ .Values.global.env }} --swap-deployment {{ .Chart.Name }}:backend --mount=true
์ ํ๋ฆฌ์ผ์ด์
์ด Kubernetes API์ ์ก์ธ์คํ๋ ๊ฒฝ์ฐ ํค ๋๋ ํฐ๋ฆฌ(https://www.telepresence.io/howto/volumes)๋ฅผ ๋ง์ดํธํด์ผ ํฉ๋๋ค. Linux ์ฉ ์ ํธ๋ฆฌํฐ๊ฐ ์์ต๋๋ค
proot -b $TELEPRESENCE_ROOT/var/run/secrets/:/var/run/secrets bash
์ต์
์์ด Telepresence๋ฅผ ์์ํ ํ --docker-run
๋ชจ๋ ํ๊ฒฝ ๋ณ์๋ ํ์ฌ ํฐ๋ฏธ๋์์ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก ํด๋น ํฐ๋ฏธ๋์์ ์ ํ๋ฆฌ์ผ์ด์
์ ์์ํด์ผ ํฉ๋๋ค.
NB: ์๋ฅผ ๋ค์ด PHP๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๊ฐ๋ฐ์ ์ํด ๋ค์ํ op_cache, apc ๋ฐ ๊ธฐํ ๊ฐ์๊ธฐ๋ฅผ ๋นํ์ฑํํด์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ฝ๋๋ฅผ ํธ์งํด๋ ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
๊ฒฐ๊ณผ
Kubernetes๋ฅผ ์ฌ์ฉํ ๋ก์ปฌ ๊ฐ๋ฐ์ ์ด ํ๋ซํผ์ ํ์ฐ์ ๋น๋กํ์ฌ ์๋ฃจ์
์ด ์ฑ์ฅํ๋ ๋ฌธ์ ์
๋๋ค. ๊ฐ๋ฐ์(ํด๋ผ์ด์ธํธ)๋ก๋ถํฐ ๊ด๋ จ ์์ฒญ์ ๋ฐ์ ํ ์ฐ๋ฆฌ๋ ๊ฐ๋ฅํ ์ฒซ ๋ฒ์งธ ์๋จ์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์์ํ์ง๋ง ์ฅ๊ธฐ์ ์ผ๋ก ์
์ฆ๋์ง ์์์ต๋๋ค. ๋คํ์ค๋ฝ๊ฒ๋ ์ด๊ฒ์ ์ง๊ธ๋ฟ๋ง ์๋๋ผ ์ฐ๋ฆฌ์๊ฒ๋ ๋ถ๋ช
ํด ์ก๊ธฐ ๋๋ฌธ์ ๋ ์ ํฉํ ์๋จ์ด ์ด๋ฏธ ์ธ์์ ๋ฑ์ฅํ์ผ๋ฉฐ ๊ทธ ์ค Telepresence๊ฐ ๊ฐ์ฅ ์ ๋ช
ํฉ๋๋ค (๊ทธ๋ฐ๋ฐ
PS
๊ธฐํ K8s ํ ๋ฐ ์๋ น ์๋ฆฌ์ฆ:
- ยซ
Kubernetes ํ ๋ฐ ์๋ น: NGINX Ingress์ ์ฌ์ฉ์ ์ง์ ์ค๋ฅ ํ์ด์ง "; - ยซ
ํด๋ฌ์คํฐ์์ ์คํ ์ค์ธ ๋ฆฌ์์ค๋ฅผ Helm 2 ๊ด๋ฆฌ๋ก ์ ์ก "; - ยซ
์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ธ๋ ํ ๋น ๋ฐ ๋ก๋ ์ ๋ณด "; - ยซ
๊ฐ๋ฐ ์ฌ์ดํธ์ ๋ํ ์ก์ธ์ค "; - ยซ
๋๊ท๋ชจ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ถํธ์คํธ๋ฉ ์๋ ํฅ์ ".
์ถ์ฒ : habr.com