Kubernetes ã䜿çšã㊠CI/CD ããã»ã¹ãæ§ç¯ããå Žåãæ°ããã€ã³ãã©ã¹ãã©ã¯ãã£ã®èŠä»¶ãšããã«è»¢éãããã¢ããªã±ãŒã·ã§ã³ãšã®éã®éäºææ§ã®åé¡ãçºçããããšããããŸãã ç¹ã«ãã¢ããªã±ãŒã·ã§ã³ã®æ§ç¯æ®µéã§ã¯ã 1 ã§äœ¿çšãããç»å ãã¹ãŠ ãããžã§ã¯ãç°å¢ãšã¯ã©ã¹ã¿ãŒã ãã®ååã¯æ£ããèãæ¹ã®æ ¹åºã«ãããŸã
ãã ãããµã€ãã®ã³ãŒããæ¢è£œã®ãã¬ãŒã ã¯ãŒã¯ã䜿çšããŠããããã®ãã¬ãŒã ã¯ãŒã¯ã䜿çšãããšããã以éã®äœ¿çšã«å¶éã課ããããšããç¶æ³ã«ã¯èª°ãééããŸããã ãéåžžã®ç°å¢ãã§ã¯ããã«ç°¡åã«å¯ŸåŠã§ããŸãããKubernetes ã§ã¯ãç¹ã«åããŠãã®åäœã«ééããå Žåããã®åäœãåé¡ã«ãªãå¯èœæ§ããããŸãã åµæ工倫ãããã°ãäžèŠæçœããããã¯åªããŠããããã«èŠããã€ã³ãã©ã¹ãã©ã¯ã㣠ãœãªã¥ãŒã·ã§ã³ãæãã€ãããšãã§ããŸãããã»ãšãã©ã®ç¶æ³ã§ã¯ãããå¯èœã§ããããããã¹ãã§ããããšãèŠããŠããããšãéèŠã§ãã ã¢ãŒããã¯ãã£çã«è§£æ±ºããã.
ã¯ã©ã¹ã¿ãŒã®éçšæã«äžå¿«ãªçµæãåŒãèµ·ããå¯èœæ§ããããã¡ã€ã«ãä¿åããããã®äžè¬çãªåé¿çãèŠãŠãããæ£ãããã¹ã瀺ããŠã¿ãŸãããã
éçã¹ãã¬ãŒãž
説æã®ããã«ãããçš®ã®éçãžã§ãã¬ãŒã¿ãŒã䜿çšããŠç»åãã¹ã¿ã€ã«ããã®ä»ã®ãã®ã®ã»ãããååŸãã Web ã¢ããªã±ãŒã·ã§ã³ãèããŠã¿ãŸãããã ããšãã°ãYii PHP ãã¬ãŒã ã¯ãŒã¯ã«ã¯ãäžæã®ãã£ã¬ã¯ããªåãçæããã¢ã»ãã ãããŒãžã£ãŒãçµã¿èŸŒãŸããŠããŸãã ãããã£ãŠãåºåã¯ãæããã«äºãã«äº€å·®ããªãéçãµã€ãã®ãã¹ã®ã»ããã«ãªããŸã (ããã¯ãããã€ãã®çç±ããè¡ãããŸãããããšãã°ãè€æ°ã®ã³ã³ããŒãã³ããåããªãœãŒã¹ã䜿çšããå Žåã«éè€ãæé€ããããã§ã)ã ãã®ãããããã« Web ãªãœãŒã¹ ã¢ãžã¥ãŒã«ã«åããŠã¢ã¯ã»ã¹ãããšãéçãã¡ã€ã« (å®éã«ã¯ã·ã³ããªãã¯ãªã³ã¯ãå€ãã§ãããããã«ã€ããŠã¯åŸã»ã©èª¬æããŸã) ã圢æããããã®ãããã€ã¡ã³ãã«åºæã®å ±éã«ãŒã ãã£ã¬ã¯ããªã䜿çšããŠã¬ã€ã¢ãŠããããŸãã
-
webroot/assets/2072c2df/css/âŠ
-
webroot/assets/2072c2df/images/âŠ
-
webroot/assets/2072c2df/js/âŠ
ããã¯ã¯ã©ã¹ã¿ãŒã®èŠ³ç¹ããäœãæå³ããã®ã§ãããã?
æãç°¡åãªäŸ
éçããŒã¿ãé åžããåçŽãªãªã¯ãšã¹ããåŠçããããã«ãPHP ã®åã« nginx ã䜿çšããããããªãäžè¬çãªã±ãŒã¹ãèããŠã¿ãŸãããã æãç°¡åãªæ¹æ³ - å±é XNUMX ã€ã®ã³ã³ããã®å Žå:
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 ã³ã³ãããŒã«ã¢ã»ããã衚瀺ãããŸãã ãããã404 ã€ã®ãããå
ã« XNUMX ã€ã®ã³ã³ãããããå Žåãnginx ã¯ãããã®éçãã¡ã€ã«ã«ã€ããŠäœãç¥ããŸããããããã®éçãã¡ã€ã«ã¯ (èšå®ã«åŸã£ãŠ) éçãã¡ã€ã«ã«äžããããå¿
èŠããããŸãã ãã®çµæãã¯ã©ã€ã¢ã³ãã«ã¯ CSS ããã³ JS ãã¡ã€ã«ãžã®ãã¹ãŠã®ãªã¯ãšã¹ãã«å¯Ÿã㊠XNUMX ãšã©ãŒã衚瀺ãããŸããæãç°¡åãªè§£æ±ºçã¯ãã³ã³ããçšã®å
±éãã£ã¬ã¯ããªãæŽçããããšã§ãã åå§çãªãªãã·ã§ã³ - äžè¬ 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 ã€ã®ã³ããŒã§ã¯ååã§ã¯ãªãããšãæå³ããŸãã
- ã¹ã±ãŒã«ã¢ããããŠã¿ãŸããã å±é æ倧 XNUMX ã€ã®ã¬ããªã«ã
- ãµã€ãã«æåã«ã¢ã¯ã»ã¹ãããšããã¢ã»ãã㯠XNUMX ã€ã®ã¬ããªã«ã«äœæãããŸããã
- ããæç¹ã§ãIngress 㯠(è² è·åæ£ã®ç®çã§) XNUMX çªç®ã®ã¬ããªã«ã«ãªã¯ãšã¹ããéä¿¡ããããšã決å®ããŸãããããããã®ã¢ã»ããã¯ãŸã ããã«ãããŸããã§ããã ãããã¯ãç§ãã¡ã䜿çšããŠããããããããã¯ããååšããªãã®ãããããŸããã
RollingUpdate
ãããŠçŸæç¹ã§ã¯ãããã€ã¡ã³ããè¡ã£ãŠããŸãã
äžè¬ã«ãçµæã¯åã³ééãã«ãªããŸãã
å€ãè³ç£ã®æ倱ãé¿ããããã«ã次ã®ããã«å€æŽã§ããŸãã emptyDir
Ма hostPath
ãã¯ã©ã¹ã¿ãŒããŒãã«éçãç©ççã«è¿œå ããŸãã ãã®ã¢ãããŒãã¯è¯ããããŸããããªããªããå®éã«ã¯æ¬¡ã®ããã«ããå¿
èŠãããããã§ãã ç¹å®ã®ã¯ã©ã¹ã¿ãŒããŒãã«ãã€ã³ããã ä»ã®ããŒãã«ç§»åããå Žåããã£ã¬ã¯ããªã«ã¯å¿
èŠãªãã¡ã€ã«ãå«ãŸããŠããªãããã§ãã ãŸãã¯ãããŒãéã§äœããã®ããã¯ã°ã©ãŠã³ãã§ã®ãã£ã¬ã¯ããªåæãå¿
èŠã§ãã
解決çã¯äœã§ãã?
- ããŒããŠã§ã¢ãšãªãœãŒã¹ãèš±ãã°ã次ã®ããã«äœ¿çšã§ããŸãã
ã»ããã¹ éçãªããŒãºã«å¯Ÿå¿ããŠãåæ§ã«ã¢ã¯ã»ã¹ã§ãããã£ã¬ã¯ããªãæŽçããŸããå ¬åŒããã¥ã¡ã³ã SSD ãã©ã€ããå°ãªããšã XNUMX åã®ã¬ããªã±ãŒã·ã§ã³ãããã³ã¯ã©ã¹ã¿ãŒ ããŒãéã®å®å®ãããã·ãã¯ãæ¥ç¶ãæšå¥šããŸãã - ããã»ã©èŠæ±ã®å³ãããªãã·ã§ã³ã¯ãNFS ãµãŒããŒãç·šæããããšã§ãã ãã ããWeb ãµãŒããŒã«ãããªã¯ãšã¹ããåŠçããéã®å¿çæéãå¢å ããå¯èœæ§ãèæ ®ããå¿ èŠãããããã©ãŒã«ã ãã¬ã©ã³ã¹ã«ã¯ãŸã äžååãªç¹ãå€ãæ®ãããŠããŸãã 倱æã®çµæã¯å£æ» çã§ããããŠã³ãã倱ããšã空ã«åãã£ãŠçªé²ãã LA ã®è² è·ã®å§åã§ã¯ã©ã¹ã¿ãŒãæ»ã«è³ãããšã«ãªããŸãã
ãšããããæ°žç¶ã¹ãã¬ãŒãžãäœæããããã®ãã¹ãŠã®ãªãã·ã§ã³ã«ã¯ã èæ¯ã®ã¯ãªãŒãã³ã° äžå®æéã«ããã£ãŠèç©ãããå€ããã¡ã€ã«ã®ã»ããã PHP ã䜿çšããã³ã³ããã®åã«æ¬¡ã®ãã®ã眮ãããšãã§ããŸã ããŒã¢ã³ã»ãã nginx ã®ãã£ãã·ã¥ãããã¢ã»ããã®ã³ããŒãäžå®æéä¿åããŸãã ãã®åäœã¯ã次ã䜿çšããŠç°¡åã«èšå®ã§ããŸãã proxy_cache
ã¹ãã¬ãŒãžã®æ·±ãã¯æ¥åäœããŸãã¯ãã£ã¹ã¯é åã®ã®ã¬ãã€ãåäœã§æå®ã§ããŸãã
ãã®æ¹æ³ãåè¿°ã®åæ£ãã¡ã€ã« ã·ã¹ãã ãšçµã¿åããããšãæ³ååã®åºå€§ãªé åãæäŸãããŸãããå¶éãããã®ã¯ããããå®è£ ããã³ãµããŒãããæ åœè ã®äºç®ãšæè¡çå¯èœæ§ã ãã§ãã çµéšäžãã·ã¹ãã ãã·ã³ãã«ã§ããã°ããã»ã©ãåäœãå®å®ãããšèšããŸãã ãã®ãããªã¬ã€ã€ãŒãè¿œå ããããšãã€ã³ãã©ã¹ãã©ã¯ãã£ã®ä¿å®ãéåžžã«å°é£ã«ãªããšåæã«ãé害ã®èšºæãšå埩ã«è²»ããæéãå¢å ããŸãã
æèš
ææ¡ãããã¹ãã¬ãŒãž ãªãã·ã§ã³ã®å®è£ ãäžåœã§ãããšæãããå Žå (è€éãé«äŸ¡ãªã©)ãç¶æ³ãå察åŽããèŠãŠã¿ã䟡å€ããããŸãã ã€ãŸãããããžã§ã¯ãã®ã¢ãŒããã¯ãã£ã詳ãã調ã¹ã ã³ãŒãã®åé¡ãä¿®æ£ãããã€ã¡ãŒãžå ã®éçãªããŒã¿æ§é ãã€ã¡ãŒãžã®ã¢ã»ã³ããªæ®µéã§ã®ã¢ã»ããã®ããŠã©ãŒãã³ã°ã¢ãããããã³/ãŸãã¯ããªã³ã³ãã€ã«ã®ããã®å 容ãŸãã¯æé ã®æ確ãªå®çŸ©ã«é¢é£ä»ããããŠããŸãã ãã®ããã«ããŠãå®å šã«äºæž¬å¯èœãªåäœãšãå®è¡äžã®ã¢ããªã±ãŒã·ã§ã³ã®ãã¹ãŠã®ç°å¢ããã³ã¬ããªã«ã§åããã¡ã€ã«ã®ã»ãããåŸãããŸãã
Yii ãã¬ãŒã ã¯ãŒã¯ã䜿çšããå ·äœçãªäŸã«æ»ãããã®æ§é ã詳ãã調ã¹ãªãå Žå (ããã¯ãã®èšäºã®ç®çã§ã¯ãããŸãã)ãXNUMX ã€ã®äžè¬çãªã¢ãããŒããææããã ãã§ååã§ãã
- ã€ã¡ãŒãžã®æ§ç¯ããã»ã¹ãå€æŽããŠãã¢ã»ãããäºæž¬å¯èœãªå Žæã«é
眮ããŸãã ããã¯æ¬¡ã®ãããªæ¡åŒµæ©èœã§ææ¡/å®è£
ãããŠããŸã
yii2-éçè³ç£ . - äŸã§èª¬æãããŠããããã«ãã¢ã»ãã ãã£ã¬ã¯ããªã®ç¹å®ã®ããã·ã¥ãå®çŸ©ããŸãã
ãã®ãã¬ãŒã³ããŒã·ã§ã³ (ã¹ã©ã€ãçªå· 35 ãã)ã ã¡ãªã¿ã«ãã¬ããŒãã®èè ã¯æçµçã«ïŒçç±ããªãããã§ã¯ãããŸãããïŒïŒããã«ããµãŒããŒã§ã¢ã»ãããçµã¿ç«ãŠãåŸãããããäžå€®ã¹ãã¬ãŒãžïŒS3ãªã©ïŒã«ã¢ããããŒããããã®åã«CDNãé 眮ããããšãã¢ããã€ã¹ããŠããŸãã
ããŠã³ããŒã
ã¢ããªã±ãŒã·ã§ã³ã Kubernetes ã¯ã©ã¹ã¿ãŒã«ç§»è¡ãããšãã«ç¢ºå®ã«åœ±é¿ãããã XNUMX ã€ã®ã±ãŒã¹ã¯ããŠãŒã¶ãŒ ãã¡ã€ã«ããã¡ã€ã« ã·ã¹ãã ã«ä¿åããããšã§ãã ããšãã°ãããã§ããŸããã¢ããããŒã ãã©ãŒã ãéããŠãã¡ã€ã«ãåãåããæäœäžã«ãã¡ã€ã«ã«å¯ŸããŠäœããã®åŠçãè¡ã£ãŠããã¡ã€ã«ãéãè¿ã PHP ã¢ããªã±ãŒã·ã§ã³ããããŸãã
Kubernetes ã§ã¯ããããã®ãã¡ã€ã«ãé 眮ããå Žæã¯ãã¢ããªã±ãŒã·ã§ã³ã®ãã¹ãŠã®ã¬ããªã«ã§å ±éã§ããå¿ èŠããããŸãã ã¢ããªã±ãŒã·ã§ã³ã®è€éããšããããã®ãã¡ã€ã«ã®æ°žç¶æ§ãæŽçããå¿ èŠæ§ã«å¿ããŠãäžèšã®å ±æããã€ã¹ ãªãã·ã§ã³ããã®ãããªå Žæã«ãªãå¯èœæ§ããããŸãããã芧ã®ãšããããããã«ã¯æ¬ ç¹ããããŸãã
æèš
XNUMX ã€ã®è§£æ±ºçã¯ã 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 ã«ç§»è¡ããæåã®æ®µéã§ã¯é¢é£ãããããããŸããããæ ¹ä»ãã¹ãã§ã¯ãããŸããã
äžè¬çã«æšå¥šãããæ¹æ³ã¯ãå€ãã®äººã«ãã§ã«ããç¥ãããŠããå
容ã«åŸã£ãŠã¢ããªã±ãŒã·ã§ã³ã®ã¢ãŒããã¯ãã£ãå€æŽããããšãåªå
ããŠãããããåé€ããããšã§ãã
PS
ç§ãã¡ã®ããã°ããèªã¿ãã ãã:
- «
nginx ã䜿çšã㊠AWS S3 ãããã¡ã€ã«ããããã·ãã "; - «
Google ã«ããã³ã³ãã䜿çšã«é¢ãã 7 ã€ã®ãã¹ã ãã©ã¯ãã£ã¹ "; - «
ã³ã³ããããŒã¹ã®ã¢ããªã±ãŒã·ã§ã³ãèšèšããããã® 7 ã€ã®åå » (ã¬ããããããã); - «
7 Factor ã¢ããªã«æ¬ ããŠãã 12 ã€ã®èŠçŽ 'ã
åºæïŒ habr.com