Kubernetes ํŒ ๋ฐ ์š”๋ น: ๋กœ์ปฌ ๊ฐœ๋ฐœ ๋ฐ Telepresence ์ •๋ณด

Kubernetes ํŒ ๋ฐ ์š”๋ น: ๋กœ์ปฌ ๊ฐœ๋ฐœ ๋ฐ Telepresence ์ •๋ณด

Kubernetes์—์„œ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์š”์ฒญ์ด ์ ์  ๋” ๋งŽ์•„์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ํ•ด์„๋œ ์–ธ์–ด์˜ ๊ฐœ๋ฐœ์ž๋Š” ์ž์‹ ์ด ์„ ํ˜ธํ•˜๋Š” IDE์—์„œ ์ฝ”๋“œ๋ฅผ ์‹ ์†ํ•˜๊ฒŒ ์ˆ˜์ •ํ•˜๊ณ  ๋นŒ๋“œ/๋ฐฐํฌ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๊ฐ„๋‹จํžˆ F5๋ฅผ ๋ˆŒ๋Ÿฌ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ชจ๋†€๋ฆฌ์‹ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์›น ์„œ๋ฒ„(Docker, VirtualBox...)๋ฅผ ๋กœ์ปฌ์— ์„ค์น˜ํ•œ ๋‹ค์Œ ์ฆ‰์‹œ ๊ฐœ๋ฐœ์„ ์ฆ๊ธฐ๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ์ถฉ๋ถ„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋†€๋ฆฌ์Šค๋ฅผ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋กœ ์ ˆ๋‹จํ•˜๊ณ  Kubernetes๊ฐ€ ๋“ฑ์žฅํ•˜๋ฉด์„œ ์„œ๋กœ์— ๋Œ€ํ•œ ์ข…์†์„ฑ์ด ๋‚˜ํƒ€๋‚˜๋ฉด์„œ ๋ชจ๋“  ๊ฒƒ์ด ์ข€ ๋” ์–ด๋ ค์›Œ์กŒ์–ด. ์ด๋Ÿฌํ•œ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๊ฐ€ ๋งŽ์„์ˆ˜๋ก ๋ฌธ์ œ๋„ ๋” ๋งŽ์•„์ง‘๋‹ˆ๋‹ค. ๋‹ค์‹œ ๊ฐœ๋ฐœ์„ ์ฆ๊ธฐ๋ ค๋ฉด Docker ์ปจํ…Œ์ด๋„ˆ๋ฅผ XNUMX~XNUMX๊ฐœ ์ด์ƒ, ๋•Œ๋กœ๋Š” XNUMX๊ฐœ ์ด์ƒ ํ‚ค์›Œ์•ผ ํ•ฉ๋‹ˆ๋‹ค... ์ผ๋ฐ˜์ ์œผ๋กœ ์ด ๋ชจ๋“  ์ž‘์—…์€ ์ตœ์‹  ์ƒํƒœ๋กœ ์œ ์ง€ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฝค ๋งŽ์€ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. .

์„œ๋กœ ๋‹ค๋ฅธ ์‹œ๊ธฐ์— ์šฐ๋ฆฌ๋Š” ๋ฌธ์ œ์— ๋Œ€ํ•ด ์„œ๋กœ ๋‹ค๋ฅธ ํ•ด๊ฒฐ์ฑ…์„ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ถ•์ ๋œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ๋˜๋Š” ๊ฐ„๋‹จํžˆ "๋ชฉ๋ฐœ"๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

1. ๋ชฉ๋ฐœ

๋Œ€๋ถ€๋ถ„์˜ IDE์—๋Š” FTP/SFTP๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ฒ„์—์„œ ์ง์ ‘ ์ฝ”๋“œ๋ฅผ ํŽธ์ง‘ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ๋กœ๋Š” ๋งค์šฐ ๋ถ„๋ช…ํ•˜๋ฏ€๋กœ ์šฐ๋ฆฌ๋Š” ์ฆ‰์‹œ ์ด ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๋ณธ์งˆ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์š”์•ฝ๋ฉ๋‹ˆ๋‹ค.

  1. ๊ฐœ๋ฐœ ํ™˜๊ฒฝ(๊ฐœ๋ฐœ/๊ฒ€ํ† ) ํฌ๋“œ์—์„œ๋Š” SSH ์•ก์„ธ์Šค๋ฅผ ํ†ตํ•ด ์ถ”๊ฐ€ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘๋˜๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ปค๋ฐ‹/๋ฐฐํฌํ•  ๊ฐœ๋ฐœ์ž์˜ ๊ณต๊ฐœ SSH ํ‚ค๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  2. ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„(์ปจํ…Œ์ด๋„ˆ ๋‚ด) prepare-app) ์ฝ”๋“œ๋ฅผ ๋‹ค์Œ์œผ๋กœ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. emptyDir์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…Œ์ด๋„ˆ์™€ SSH ์„œ๋ฒ„์˜ ์ฝ”๋“œ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Kubernetes ํŒ ๋ฐ ์š”๋ น: ๋กœ์ปฌ ๊ฐœ๋ฐœ ๋ฐ Telepresence ์ •๋ณด

์ด๋Ÿฌํ•œ ์ฒด๊ณ„์˜ ๊ธฐ์ˆ ์  ๊ตฌํ˜„์„ โ€‹โ€‹๋” ์ž˜ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด 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 }}

์ตœ์ข… ํ„ฐ์น˜

๊ทธ ํ›„ ๋‚จ์€ ๊ฒƒ์€ ์ „์†กํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค ํ•„์ˆ˜ gitlab-ci.yml ๋ณ€์ˆ˜:

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: ๋ฐฐํฌ๋ฅผ ์‹œ์ž‘ํ•œ ๊ฐœ๋ฐœ์ž๋Š” ์„œ๋น„์Šค ์ด๋ฆ„์œผ๋กœ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(ํด๋Ÿฌ์Šคํ„ฐ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ์•ˆ์ „ํ•˜๊ฒŒ ๋ถ€์—ฌํ•˜๋Š” ๋ฐฉ๋ฒ•, ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ๋งํ–ˆ๋‹ค) SFTP๋ฅผ ํ†ตํ•ด ๋ฐ์Šคํฌํ†ฑ์—์„œ ์ฝ”๋“œ๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ์— ์ „๋‹ฌ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ์ฝ”๋“œ๋ฅผ ํŽธ์ง‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Š” ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ•˜๋Š” ์†”๋ฃจ์…˜์ด์ง€๋งŒ ๊ตฌํ˜„ ๊ด€์ ์—์„œ ๋ณผ ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ช…๋ฐฑํ•œ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋‚˜์ค‘์— ์ฝ๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“œ๋Š” Helm ์ฐจํŠธ๋ฅผ ๊ฐœ์„ ํ•ด์•ผ ํ•  ํ•„์š”์„ฑ;
  • ์„œ๋น„์Šค๋ฅผ ๋ฐฐํฌํ•œ ์‚ฌ๋žŒ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ์ปฌ ๋””๋ ‰ํ„ฐ๋ฆฌ์™€ ๋™๊ธฐํ™”ํ•˜๊ณ  Git์— ์ปค๋ฐ‹ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2. ํ…”๋ ˆํ”„๋ ˆ์ฆŒ์Šค

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

์š”์ปจ๋Œ€ ๋ชจ๋“  ๊ฒƒ์ด ๊ทธ๋ ‡๊ฒŒ ๋ฌด์„ญ์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ฐœ๋ฐœ์ž ์ธก์—์„œ ์‹คํ–‰์ด ํ•„์š”ํ•œ ๋ชจ๋“  ์ž‘์—…์„ 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๊ฐ€ ๊ฐ€์žฅ ์œ ๋ช…ํ•ฉ๋‹ˆ๋‹ค (๊ทธ๋Ÿฐ๋ฐ ๋ฐœํŒ Google์—์„œ). ์šฐ๋ฆฌ์˜ ์‚ฌ์šฉ ๊ฒฝํ—˜์€ ์•„์ง ๊ทธ๋ ‡๊ฒŒ ํ›Œ๋ฅญํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ์ด๋ฏธ "๊ฐ€๊ฒŒ์˜ ๋™๋ฃŒ"์—๊ฒŒ ์ถ”์ฒœํ•  ์ด์œ ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•ด ๋ณด์„ธ์š”!

PS

๊ธฐํƒ€ K8s ํŒ ๋ฐ ์š”๋ น ์‹œ๋ฆฌ์ฆˆ:

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€