์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ Kubernetes๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ๋•Œ ๋กœ์ปฌ ํŒŒ์ผ

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ Kubernetes๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ๋•Œ ๋กœ์ปฌ ํŒŒ์ผ

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

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

ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์šด์˜ํ•  ๋•Œ ๋ถˆ์พŒํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ๋Š” ํŒŒ์ผ ์ €์žฅ์— ๋Œ€ํ•œ ์ธ๊ธฐ ์žˆ๋Š” ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ณ  ๋ณด๋‹ค ์ •ํ™•ํ•œ ๊ฒฝ๋กœ๋ฅผ ์ง€์ ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ •์  ์ €์žฅ

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

  • webroot/assets/2072c2df/css/โ€ฆ
  • webroot/assets/2072c2df/images/โ€ฆ
  • webroot/assets/2072c2df/js/โ€ฆ

ํด๋Ÿฌ์Šคํ„ฐ ์ธก๋ฉด์—์„œ ์ด๋Š” ๋ฌด์—‡์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ์˜ˆ

์ •์  ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐฐํฌํ•˜๊ณ  ๊ฐ„๋‹จํ•œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด PHP ์•ž์— nginx๊ฐ€ ์˜ค๋Š” ๋งค์šฐ ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ• - ์ „๊ฐœ ๋‘ ๊ฐœ์˜ ์ปจํ…Œ์ด๋„ˆ๋กœ:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: site
spec:
  selector:
    matchLabels:
      component: backend
  template:
    metadata:
      labels:
        component: backend
    spec:
      volumes:
        - name: nginx-config
          configMap:
            name: nginx-configmap
      containers:
      - name: php
        image: own-image-with-php-backend:v1.0
        command: ["/usr/local/sbin/php-fpm","-F"]
        workingDir: /var/www
      - name: nginx
        image: nginx:1.16.0
        command: ["/usr/sbin/nginx", "-g", "daemon off;"]
        volumeMounts:
        - name: nginx-config
          mountPath: /etc/nginx/conf.d/default.conf
          subPath: nginx.conf

๋‹จ์ˆœํ™”๋œ ํ˜•ํƒœ๋กœ nginx ๊ตฌ์„ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์š”์•ฝ๋ฉ๋‹ˆ๋‹ค.

apiVersion: v1
kind: ConfigMap
metadata:
  name: "nginx-configmap"
data:
  nginx.conf: |
    server {
        listen 80;
        server_name _;
        charset utf-8;
        root  /var/www;

        access_log /dev/stdout;
        error_log /dev/stderr;

        location / {
            index index.php;
            try_files $uri $uri/ /index.php?$args;
        }

        location ~ .php$ {
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            include fastcgi_params;
        }
    }

์‚ฌ์ดํŠธ์— ์ฒ˜์Œ ์•ก์„ธ์Šคํ•˜๋ฉด ์ž์‚ฐ์ด PHP ์ปจํ…Œ์ด๋„ˆ์— ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ•˜๋‚˜์˜ ํฌ๋“œ ๋‚ด์— ๋‘ ๊ฐœ์˜ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ nginx๋Š” (๊ตฌ์„ฑ์— ๋”ฐ๋ผ) ์ œ๊ณต๋˜์–ด์•ผ ํ•˜๋Š” ์ด๋Ÿฌํ•œ ์ •์  ํŒŒ์ผ์— ๋Œ€ํ•ด ์•„๋ฌด๊ฒƒ๋„ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ํด๋ผ์ด์–ธํŠธ๋Š” CSS ๋ฐ JS ํŒŒ์ผ์— ๋Œ€ํ•œ ๋ชจ๋“  ์š”์ฒญ์— โ€‹โ€‹๋Œ€ํ•ด 404 ์˜ค๋ฅ˜๋ฅผ ๋ณด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ํ•ด๊ฒฐ์ฑ…์€ ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•œ ๊ณตํ†ต ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์˜ต์…˜ - ์ผ๋ฐ˜ emptyDir:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: site
spec:
  selector:
    matchLabels:
      component: backend
  template:
    metadata:
      labels:
        component: backend
    spec:
      volumes:
        - name: assets
          emptyDir: {}
        - name: nginx-config
          configMap:
            name: nginx-configmap
      containers:
      - name: php
        image: own-image-with-php-backend:v1.0
        command: ["/usr/local/sbin/php-fpm","-F"]
        workingDir: /var/www
        volumeMounts:
        - name: assets
          mountPath: /var/www/assets
      - name: nginx
        image: nginx:1.16.0
        command: ["/usr/sbin/nginx", "-g", "daemon off;"]
        volumeMounts:
        - name: assets
          mountPath: /var/www/assets
        - name: nginx-config
          mountPath: /etc/nginx/conf.d/default.conf
          subPath: nginx.conf

์ด์ œ ์ปจํ…Œ์ด๋„ˆ์— ์ƒ์„ฑ๋œ ์ •์  ํŒŒ์ผ์ด nginx์—์„œ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด ์›์‹œ์ ์ธ ์†”๋ฃจ์…˜์ด๋ผ๋Š” ์ ์„ ์ƒ๊ธฐ์‹œ์ผœ ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์ด์ƒ์ ์ธ ์†”๋ฃจ์…˜๊ณผ๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ๋ฉ€๊ณ  ์•„๋ž˜์—์„œ ์„ค๋ช…ํ•˜๋Š” ๊ณ ์œ ํ•œ ๋‰˜์•™์Šค์™€ ๋‹จ์ ์ด ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๋”์šฑ ๋ฐœ์ „๋œ ์Šคํ† ๋ฆฌ์ง€

์ด์ œ ์‚ฌ์šฉ์ž๊ฐ€ ์‚ฌ์ดํŠธ๋ฅผ ๋ฐฉ๋ฌธํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์Šคํƒ€์ผ์ด ํฌํ•จ๋œ ํŽ˜์ด์ง€๋ฅผ ๋กœ๋“œํ•˜๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ์ด ํŽ˜์ด์ง€๋ฅผ ์ฝ๋Š” ๋™์•ˆ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋‹ค์‹œ ๋ฐฐํฌํ•˜๋Š” ์ƒํ™ฉ์„ ์ƒ์ƒํ•ด ๋ณด์„ธ์š”. ์ž์‚ฐ ์นดํƒˆ๋กœ๊ทธ๊ฐ€ ๋น„์–ด ์žˆ์œผ๋ฉฐ ์ƒˆ ์นดํƒˆ๋กœ๊ทธ ์ƒ์„ฑ์„ ์‹œ์ž‘ํ•˜๋ ค๋ฉด PHP์— ๋Œ€ํ•œ ์š”์ฒญ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ดํ›„์—๋„ ์ด์ „ ์ •์ ์— ๋Œ€ํ•œ ๋งํฌ๋Š” ๊ด€๋ จ์ด ์—†์œผ๋ฏ€๋กœ ์ •์  ํ‘œ์‹œ ์‹œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ๋กœ๋“œ๋œ ํ”„๋กœ์ ํŠธ๊ฐ€ ๋‹ค์†Œ ๋งŽ์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์œผ๋ฉฐ ์ด๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‚ฌ๋ณธ ํ•˜๋‚˜๋งŒ์œผ๋กœ๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

  • ๊ทœ๋ชจ๋ฅผ ํ‚ค์›Œ๋ณด์ž ์ „๊ฐœ ๋ณต์ œ๋ณธ์€ ์ตœ๋Œ€ XNUMX๊ฐœ์ž…๋‹ˆ๋‹ค.
  • ์‚ฌ์ดํŠธ์— ์ฒ˜์Œ ์•ก์„ธ์Šคํ–ˆ์„ ๋•Œ ํ•˜๋‚˜์˜ ๋ณต์ œ๋ณธ์— ์ž์‚ฐ์ด ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์–ด๋Š ์‹œ์ ์—์„œ ์ˆ˜์‹ ์€ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ ๋ชฉ์ ์œผ๋กœ ๋‘ ๋ฒˆ์งธ ๋ณต์ œ๋ณธ์— ์š”์ฒญ์„ ๋ณด๋‚ด๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์ง€๋งŒ ์ด๋Ÿฌํ•œ ์ž์‚ฐ์€ ์•„์ง ๊ฑฐ๊ธฐ์— ์—†์Šต๋‹ˆ๋‹ค. ์•„๋‹ˆ๋ฉด ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋” ์ด์ƒ ์กด์žฌํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. RollingUpdate ํ˜„์žฌ ์šฐ๋ฆฌ๋Š” ๋ฐฐํฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ๊ฒฐ๊ณผ๋Š” ๋‹ค์‹œ ์‹ค์ˆ˜์ž…๋‹ˆ๋‹ค.

์˜ค๋ž˜๋œ ์ž์‚ฐ์„ ์žƒ์ง€ ์•Š์œผ๋ ค๋ฉด ๋‹ค์Œ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. emptyDir ์— hostPath, ํด๋Ÿฌ์Šคํ„ฐ ๋…ธ๋“œ์— ๋ฌผ๋ฆฌ์ ์œผ๋กœ ์ •์ ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์‹ค์ œ๋กœ๋Š” ํŠน์ • ํด๋Ÿฌ์Šคํ„ฐ ๋…ธ๋“œ์— ๋ฐ”์ธ๋”ฉ ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒฝ์šฐ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ํ•„์š”ํ•œ ํŒŒ์ผ์ด ํฌํ•จ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋˜๋Š” ๋…ธ๋“œ ๊ฐ„์— ์ผ์ข…์˜ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋””๋ ‰ํ„ฐ๋ฆฌ ๋™๊ธฐํ™”๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ์ฑ…์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

  1. ํ•˜๋“œ์›จ์–ด์™€ ๋ฆฌ์†Œ์Šค๊ฐ€ ํ—ˆ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ธํ”„ํ”„ ์ •์  ์š”๊ตฌ์— ๋งž๊ฒŒ ๋™๋“ฑํ•˜๊ฒŒ ์•ก์„ธ์Šค ๊ฐ€๋Šฅํ•œ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ณต์‹ ๋ฌธ์„œ SSD ๋“œ๋ผ์ด๋ธŒ, ์ตœ์†Œ XNUMX์ค‘ ๋ณต์ œ ๋ฐ ํด๋Ÿฌ์Šคํ„ฐ ๋…ธ๋“œ ๊ฐ„์˜ ์•ˆ์ •์ ์ธ "๋‘๊บผ์šด" ์—ฐ๊ฒฐ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.
  2. ๋œ ๊นŒ๋‹ค๋กœ์šด ์˜ต์…˜์€ NFS ์„œ๋ฒ„๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์›น ์„œ๋ฒ„์˜ ์š”์ฒญ ์ฒ˜๋ฆฌ์— ๋Œ€ํ•œ ์‘๋‹ต ์‹œ๊ฐ„์ด ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•ด์•ผ ํ•˜๋ฉฐ ๋‚ด๊ฒฐํ•จ์„ฑ์€ ์•„์ง ๋งŽ์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. ์‹คํŒจ์˜ ๊ฒฐ๊ณผ๋Š” ์น˜๋ช…์ ์ž…๋‹ˆ๋‹ค. ๋งˆ์šดํŠธ๊ฐ€ ์†์‹ค๋˜๋ฉด ํ•˜๋Š˜๋กœ ๋Œ์ง„ํ•˜๋Š” LA ๋ถ€ํ•˜์˜ ์••๋ ฅ์œผ๋กœ ์ธํ•ด ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์‚ฌ๋งํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋ฌด์—‡๋ณด๋‹ค๋„ ์˜๊ตฌ ์ €์žฅ์†Œ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๋ชจ๋“  ์˜ต์…˜์—๋Š” ๋‹ค์Œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ฐฐ๊ฒฝ ์ฒญ์†Œ ํŠน์ • ๊ธฐ๊ฐ„ ๋™์•ˆ ๋ˆ„์ ๋œ ์˜ค๋ž˜๋œ ํŒŒ์ผ ์„ธํŠธ. PHP๊ฐ€ ํฌํ•จ๋œ ์ปจํ…Œ์ด๋„ˆ ์•ž์— ๋‹ค์Œ์„ ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ๋ชฌ์…‹ ์ œํ•œ๋œ ์‹œ๊ฐ„ ๋™์•ˆ ์ž์‚ฐ ์‚ฌ๋ณธ์„ ์ €์žฅํ•˜๋Š” nginx ์บ์‹ฑ์—์„œ. ์ด ๋™์ž‘์€ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‰ฝ๊ฒŒ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. proxy_cache ์ผ ๋‹จ์œ„ ๋˜๋Š” ๊ธฐ๊ฐ€๋ฐ”์ดํŠธ ๋‹จ์œ„์˜ ๋””์Šคํฌ ๊ณต๊ฐ„ ์ €์žฅ ๊นŠ์ด.

์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๋ถ„์‚ฐ ํŒŒ์ผ ์‹œ์Šคํ…œ๊ณผ ์ด ๋ฐฉ๋ฒ•์„ ๊ฒฐํ•ฉํ•˜๋ฉด ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์ง€์›ํ•  ์‚ฌ๋žŒ๋“ค์˜ ์˜ˆ์‚ฐ๊ณผ ๊ธฐ์ˆ ์  ์ž ์žฌ๋ ฅ์— ์˜ํ•ด์„œ๋งŒ ์ œํ•œ๋˜๋Š” ์ƒ์ƒ์˜ ๊ฑฐ๋Œ€ํ•œ ์˜์—ญ์ด ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ๊ฒฝํ—˜์„ ํ†ตํ•ด ์šฐ๋ฆฌ๋Š” ์‹œ์Šคํ…œ์ด ๋‹จ์ˆœํ• ์ˆ˜๋ก ๋” ์•ˆ์ •์ ์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ณ„์ธต์ด ์ถ”๊ฐ€๋˜๋ฉด ์ธํ”„๋ผ๋ฅผ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๊ธฐ๊ฐ€ ํ›จ์”ฌ ๋” ์–ด๋ ค์›Œ์ง€๊ณ  ๋™์‹œ์— ์žฅ์• ๋ฅผ ์ง„๋‹จํ•˜๊ณ  ๋ณต๊ตฌํ•˜๋Š” ๋ฐ ์†Œ์š”๋˜๋Š” ์‹œ๊ฐ„๋„ ๋Š˜์–ด๋‚ฉ๋‹ˆ๋‹ค.

์ถ”์ฒœ

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

Yii ํ”„๋ ˆ์ž„์›Œํฌ์˜ ํŠน์ • ์˜ˆ๋กœ ๋Œ์•„๊ฐ€์„œ ๊ทธ ๊ตฌ์กฐ๋ฅผ ์ž์„ธํžˆ ๋‹ค๋ฃจ์ง€ ์•Š๋Š”๋‹ค๋ฉด(์ด ๊ธ€์˜ ๋ชฉ์ ์€ ์•„๋‹™๋‹ˆ๋‹ค) ๋‘ ๊ฐ€์ง€ ์ธ๊ธฐ ์žˆ๋Š” ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ง€์ ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

  1. ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์œ„์น˜์— ์ž์‚ฐ์„ ๋ฐฐ์น˜ํ•˜๋„๋ก ์ด๋ฏธ์ง€ ๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ œ์•ˆ/๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค. yii2-์ •์  ์ž์‚ฐ.
  2. ์˜ˆ๋ฅผ ๋“ค์–ด ์„ค๋ช…๋œ ๋Œ€๋กœ ์ž์‚ฐ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๋Œ€ํ•œ ํŠน์ • ํ•ด์‹œ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ํ”„๋ ˆ์  ํ…Œ์ด์…˜ (์Šฌ๋ผ์ด๋“œ 35๋ฒˆ๋ถ€ํ„ฐ ์‹œ์ž‘) ๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ , ๋ณด๊ณ ์„œ ์ž‘์„ฑ์ž๋Š” ๊ถ๊ทน์ ์œผ๋กœ (๊ทธ๋ฆฌ๊ณ  ์ด์œ  ์—†์ด๋Š” ์•„๋‹™๋‹ˆ๋‹ค!) ๋นŒ๋“œ ์„œ๋ฒ„์—์„œ ์ž์‚ฐ์„ ์กฐ๋ฆฝํ•œ ํ›„ ์ค‘์•™ ์Šคํ† ๋ฆฌ์ง€(์˜ˆ: S3)์— ์—…๋กœ๋“œํ•˜๊ณ  ๊ทธ ์•ž์— CDN์„ ๋ฐฐ์น˜ํ•˜๋ผ๊ณ  ์กฐ์–ธํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์šด๋กœ๋“œ

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ๋•Œ ํ™•์‹คํžˆ ์ค‘์š”ํ•œ ๋˜ ๋‹ค๋ฅธ ์‚ฌ๋ก€๋Š” ์‚ฌ์šฉ์ž ํŒŒ์ผ์„ ํŒŒ์ผ ์‹œ์Šคํ…œ์— ์ €์žฅํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์—…๋กœ๋“œ ์–‘์‹์„ ํ†ตํ•ด ํŒŒ์ผ์„ ๋ฐ›์•„๋“ค์ด๊ณ , ์ž‘์—… ์ค‘์— ํ•ด๋‹น ํŒŒ์ผ๋กœ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ๋‹ค์‹œ ๋ณด๋‚ด๋Š” PHP ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

Kubernetes์—์„œ ์ด๋Ÿฌํ•œ ํŒŒ์ผ์„ ๋ฐฐ์น˜ํ•ด์•ผ ํ•˜๋Š” ์œ„์น˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ชจ๋“  ๋ณต์ œ๋ณธ์— ๊ณตํ†ต๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ณต์žก์„ฑ๊ณผ ์ด๋Ÿฌํ•œ ํŒŒ์ผ์˜ ์ง€์†์„ฑ์„ ๊ตฌ์„ฑํ•ด์•ผ ํ•˜๋Š” ํ•„์š”์„ฑ์— ๋”ฐ๋ผ ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๊ณต์œ  ์žฅ์น˜ ์˜ต์…˜์ด ๊ทธ๋Ÿฌํ•œ ์œ„์น˜์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ณด์‹œ๋‹ค์‹œํ”ผ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ถ”์ฒœ

ํ•œ ๊ฐ€์ง€ ํ•ด๊ฒฐ์ฑ…์€ S3 ํ˜ธํ™˜ ์Šคํ† ๋ฆฌ์ง€ ์‚ฌ์šฉ (minio์™€ ๊ฐ™์€ ์ผ์ข…์˜ ์ž์ฒด ํ˜ธ์ŠคํŒ… ์นดํ…Œ๊ณ ๋ฆฌ์ธ ๊ฒฝ์šฐ์—๋„) S3๋กœ ์ „ํ™˜ํ•˜๋ ค๋ฉด ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ ์ˆ˜์ค€์—์„œ, ํ”„๋ŸฐํŠธ์—”๋“œ์—์„œ ์ฝ˜ํ…์ธ ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ „๋‹ฌ๋ ์ง€์— ๋Œ€ํ•ด ์ด๋ฏธ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ะฟะธัะฐะปะธ.

์‚ฌ์šฉ์ž ์„ธ์…˜

์ด์™€ ๋ณ„๋„๋กœ ์‚ฌ์šฉ์ž ์„ธ์…˜ ์ €์žฅ ๊ตฌ์„ฑ์— ์ฃผ๋ชฉํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ข…์ข… ๋””์Šคํฌ์— ์žˆ๋Š” ํŒŒ์ผ์ด๊ธฐ๋„ ํ•˜๋ฉฐ, Kubernetes์˜ ๋งฅ๋ฝ์—์„œ ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์ด ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋๋‚˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž์˜ ์ง€์†์ ์ธ ์Šน์ธ ์š”์ฒญ์œผ๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค.

์ „์›์„ ์ผœ๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ถ€๋ถ„์ ์œผ๋กœ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค. stickySessions ์ง„์ž… ์‹œ (์ด ๊ธฐ๋Šฅ์€ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“  ์ˆ˜์‹  ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์ง€์›๋ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋‹ค์Œ์„ ์ฐธ์กฐํ•˜์„ธ์š”. ์šฐ๋ฆฌ์˜ ๋ฆฌ๋ทฐ)์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž๋ฅผ ํŠน์ • ํฌ๋“œ์— ๋ฐ”์ธ๋”ฉํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜์„ธ์š”.

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: nginx-test
  annotations:
    nginx.ingress.kubernetes.io/affinity: "cookie"
    nginx.ingress.kubernetes.io/session-cookie-name: "route"
    nginx.ingress.kubernetes.io/session-cookie-expires: "172800"
    nginx.ingress.kubernetes.io/session-cookie-max-age: "172800"

spec:
  rules:
  - host: stickyingress.example.com
    http:
      paths:
      - backend:
          serviceName: http-svc
          servicePort: 80
        path: /

๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด ๋ฐ˜๋ณต ๋ฐฐํฌ๋กœ ์ธํ•œ ๋ฌธ์ œ๋ฅผ ์ œ๊ฑฐํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

์ถ”์ฒœ

๋” ์ •ํ™•ํ•œ ๋ฐฉ๋ฒ•์€ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ๋‹ค์Œ์œผ๋กœ ์ „์†กํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. memcached, Redis ๋ฐ ์œ ์‚ฌํ•œ ์†”๋ฃจ์…˜์— ์„ธ์…˜ ์ €์žฅ - ์ผ๋ฐ˜์ ์œผ๋กœ ํŒŒ์ผ ์˜ต์…˜์„ ์™„์ „ํžˆ ํฌ๊ธฐํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๋ก 

๋ณธ๋ฌธ์—์„œ ๋…ผ์˜๋œ ์ธํ”„๋ผ ์†”๋ฃจ์…˜์€ ์ž„์‹œ "๋ชฉ๋ฐœ" ํ˜•์‹์œผ๋กœ๋งŒ ์‚ฌ์šฉํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(ํ•ด๊ฒฐ์ฑ…์œผ๋กœ ์˜์–ด๋กœ ํ•˜๋ฉด ๋” ์•„๋ฆ„๋‹ต๊ฒŒ ๋“ค๋ฆผ). ์ด๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ Kubernetes๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„์™€ ๊ด€๋ จ์ด ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๋ฟŒ๋ฆฌ๋ฅผ ๋‚ด๋ฆฌ๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ๊ถŒ์žฅ๋˜๋Š” ๊ฒฝ๋กœ๋Š” ์ด๋ฏธ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ž˜ ์•Œ๋ ค์ง„ ๋‚ด์šฉ์— ๋”ฐ๋ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์•„ํ‚คํ…์ฒ˜ ์ˆ˜์ •์„ ์œ„ํ•ด ์ด๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. 12ํŒฉํ„ฐ ์•ฑ. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ƒํƒœ ๋น„์ €์žฅ ํ˜•์‹์œผ๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์€ ํ•„์—ฐ์ ์œผ๋กœ ์ฝ”๋“œ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๋ฉฐ, ์—ฌ๊ธฐ์„œ๋Š” ๋น„์ฆˆ๋‹ˆ์Šค์˜ ๊ธฐ๋Šฅ/์š”๊ตฌ ์‚ฌํ•ญ๊ณผ ์„ ํƒํ•œ ๊ฒฝ๋กœ์˜ ๊ตฌํ˜„ ๋ฐ ์œ ์ง€์— ๋Œ€ํ•œ ์ „๋ง ์‚ฌ์ด์˜ ๊ท ํ˜•์„ ์ฐพ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. .

PS

๋ธ”๋กœ๊ทธ์—์„œ๋„ ์ฝ์–ด๋ณด์„ธ์š”.

์ถœ์ฒ˜ : habr.com

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