
Kubernetesã§ã®æ¥ã
ã®äœæ¥ã楜ã«ããæ¹æ³ã«ã€ããŠã®å®çšçãªæé ãèšäºã«ç¶ããŠãç¹å®ã®ã¿ã¹ã¯ãžã®åã
ã®ããŒãã®å²ãåœãŠãšãé«è² è·ã®ããã®php-fpmïŒãŸãã¯å¥ã®ã¢ããªã±ãŒã·ã§ã³ãµãŒããŒïŒã®æ§æã«ã€ããŠãéçšã®äžçãã2ã€ã®ã¹ããŒãªãŒã«ã€ããŠèª¬æããŸãã åã«èª¬æããããã«ãããã§èª¬æãããœãªã¥ãŒã·ã§ã³ã¯çæ³çã§ãããšäž»åŒµãããã®ã§ã¯ãããŸããããç¹å®ã®äºäŸã®åºçºç¹ãšããŠããŸãåçã®åºç€ãšããŠæäŸãããŸãã ã³ã¡ã³ãã®è³ªåãæ¹åã¯å€§æè¿ã§ãïŒ
1.ç¹å®ã®ã¿ã¹ã¯ã«å¯Ÿããåã
ã®ããŒãã®å²ãåœãŠ
ä»®æ³ãµãŒããŒãã¯ã©ãŠãããŸãã¯ãã¢ã¡ã¿ã«ãµãŒããŒã§Kubernetesã¯ã©ã¹ã¿ãŒãäœæããŠããŸãã ãã¹ãŠã®ã·ã¹ãã ãœãããŠã§ã¢ãšã¯ã©ã€ã¢ã³ãã¢ããªã±ãŒã·ã§ã³ãåãããŒãã«ã€ã³ã¹ããŒã«ãããšãåé¡ãçºçããå¯èœæ§ããããŸãã
- ã¯ã©ã€ã¢ã³ãã¢ããªã±ãŒã·ã§ã³ã¯ããã®å¶éãéåžžã«é«ããã®ã®ãçªç¶ã¡ã¢ãªããããªãŒã¯ããå§ããŸãã
- ãã°ããŠã¹ãããã¡ããŠã¹ããŸãã¯ã€ã³ã°ã¬ã¹ãžã®è€éãª1åéãã®èŠæ±*ã¯OOMã«ã€ãªããããã®çµæãã¯ã©ã€ã¢ã³ãã¢ããªã±ãŒã·ã§ã³ã¯èŠãã¿ãŸãã
- ã³ã³ããŒãã³ããäºãã«è«ççã«æ¥ç¶ãããŠããªãå Žåã§ããã·ã¹ãã ãœãããŠã§ã¢ã®ãã°ã«ããã¡ã¢ãªãªãŒã¯ã«ããã¯ã©ã€ã¢ã³ãã¢ããªã±ãŒã·ã§ã³ã匷å¶çµäºãããŸãã
*ç¹ã«ãå€ãããŒãžã§ã³ã®Ingressã«é¢é£ããŠããŸãããå€æ°ã®websocketæ¥ç¶ãšnginxã®ç¶ç¶çãªãªããŒãã«ãããããã³ã°ããnginxããã»ã¹ãã衚瀺ãããæ°åã«ã®ãŒããèšå€§ãªãªãœãŒã¹ãæ¶è²»ããŸãããå®éã®ã±ãŒã¹ã¯ãå€æ°ã®ã¡ããªãã¯ãåããPrometheusã®ã€ã³ã¹ããŒã«ã§ãããéããããã·ã¥ããŒãã衚瀺ãããšãå€æ°ã®ã¢ããªã±ãŒã·ã§ã³ã³ã³ãããŒã衚瀺ãããããããããã°ã©ããæç»ãããã¡ã¢ãªæ¶è²»ã15 GBãŸã§æ¥éã«å¢å ããŸãã ãã®çµæãOOMãã©ãŒã¯ãã¹ãã·ã¹ãã ã«ã䟵å
¥ãããä»ã®ãµãŒãã¹ã匷å¶çµäºããå¯èœæ§ãããããã®çµæããã¯ã©ã¹ã¿ãŒå
ã®ã¢ããªã±ãŒã·ã§ã³ã®ç解ã§ããªãåäœããçºçããŸããã ãŸããã¯ã©ã€ã¢ã³ãã¢ããªã±ãŒã·ã§ã³ã®CPUè² è·ãé«ããããäžå®å®ãªIngressã¯ãšãªåŠçæéãç°¡åã«ååŸã§ããŸã...
ãœãªã¥ãŒã·ã§ã³ã¯ããã«ãããä¿ããŸãããç°ãªãã¿ã¹ã¯ã«åã
ã®ãã·ã³ãå²ãåœãŠãå¿
èŠããããŸããã ã¿ã¹ã¯ã°ã«ãŒãã«ã¯ãäž»ã«3ã€ã®ã¿ã€ãããããŸãã
- ä»ã®ãµãŒãã¹ããªã¯ãšã¹ãã®åŠçæéã«åœ±é¿ãäžããªãããã«ãã€ã³ã°ã¬ã¹ã®ã¿ãé
眮ããFronts ã
- VPN ã ãã°ããŠã¹ ã ããã¡ããŠã¹ ãããã·ã¥ããŒããCoreDNSãªã©ãå±éããã·ã¹ãã ããŒã ã
- ã¢ããªã±ãŒã·ã§ã³ã®ããŒã -å®éãã¯ã©ã€ã¢ã³ãã¢ããªã±ãŒã·ã§ã³ãå±éãããå Žæã ãŸããç°å¢ãŸãã¯æ©èœïŒdevãprodãperfãªã©ïŒã«å²ãåœãŠãããšãã§ããŸãã
解決ç
ãããã©ã®ããã«å®è£
ããŸããïŒ éåžžã«ç°¡åïŒ2ã€ã®ãã€ãã£ãKubernetesã¡ã«ããºã ã 1ã€ç®ã¯ãåããŒãã«
ã€ã³ã¹ããŒã«ãããŠããã©ãã«ã«åºã¥ããŠãã¢ããªã±ãŒã·ã§ã³ã移åããå¿
èŠã®ããããŒããéžæãã
nodeSelectorã§ãã
kube-system-1
ããŒãããããšããŸãã è¿œå ã®ã©ãã«ãè¿œå ããŸãã
$ kubectl label node kube-system-1 node-role/monitoring=
...ãããŠããã®ããŒãã«
Deployment
ãã
Deployment
ã§ã次ã®ããã«èšè¿°ããŸãã
nodeSelector: node-role/monitoring: ""
2çªç®ã®ã¡ã«ããºã ã¯
æ±æãšèš±å®¹ã§ãã ãã®å©ããåããŠããããã®ãã·ã³ã§ã¯ããã®æ±æã«èããããã³ã³ããã®ã¿ãèµ·åã§ããããšãæ瀺çã«ç€ºããŸãã
ããšãã°ãã€ã³ã°ã¬ã¹ã®ã¿ãå±éãã
kube-frontend-1
ãã·ã³ããããŸãã ãã®ããŒãã«æ±æãè¿œå ããŸãã
$ kubectl taint node kube-frontend-1 node-role/frontend="":NoExecute
...ãããŠ
Deployment
ã§èš±å®¹ãäœæããŸãïŒ
tolerations: - effect: NoExecute key: node-role/frontend
kopsã®å ŽåãåãããŒãºã«åãããŠåã
ã®ã€ã³ã¹ã¿ã³ã¹ã°ã«ãŒããäœæã§ããŸãã
$ kops create ig --name cluster_name IG_NAME
...ãããŠãkopsã§ãã®ã€ã³ã¹ã¿ã³ã¹ã°ã«ãŒãæ§æã®ãããªãã®ãååŸããŸãã
apiVersion: kops/v1alpha2 kind: InstanceGroup metadata: creationTimestamp: 2017-12-07T09:24:49Z labels: dedicated: monitoring kops.k8s.io/cluster: k-dev.k8s name: monitoring spec: image: kope.io/k8s-1.8-debian-jessie-amd64-hvm-ebs-2018-01-14 machineType: m4.4xlarge maxSize: 2 minSize: 2 nodeLabels: dedicated: monitoring role: Node subnets: - eu-central-1c taints: - dedicated=monitoring:NoSchedule
ãããã£ãŠããã®ã€ã³ã¹ã¿ã³ã¹ã°ã«ãŒãã®ããŒãã¯ãè¿œå ã®ã©ãã«ãšæ±æãèªåçã«è¿œå ããŸãã
2.è² è·ãéãå Žåã®php-fpmã®æ§æ
Webã¢ããªã±ãŒã·ã§ã³ã®å®è¡ã«äœ¿çšããããµãŒããŒã«ã¯ãphp-fpmãgunicornãªã©ãããŸããŸãªçš®é¡ããããŸãã Kubernetesã§ãããã䜿çšããããšã¯ã次ã®ããšãåžžã«èæ
®ããå¿
èŠãããããšãæå³ããŸãã
- åã³ã³ããã«php-fpmã§å²ãåœãŠããã¯ãŒã«ãŒã®æ°ã倧ãŸãã«ç解ããå¿
èŠããããŸãã ããšãã°ãåä¿¡ãªã¯ãšã¹ããåŠçããããã«10人ã®ã¯ãŒã«ãŒãå²ãåœãŠããããã«å²ãåœãŠããªãœãŒã¹ãæžããããããã®æ°ã«åãããŠã¹ã±ãŒãªã³ã°ããããšãã§ããŸã-ããã¯è¯ãç¿æ
£ã§ãã å¥ã®äŸã§ã¯ãåãããã«500人ã®ã¯ãŒã«ãŒãå²ãåœãŠããã®ãããªãããã2ã3æ¬çç£ããŠããŸã...ããããããã¯ããªãæªãèãã§ãã
- åãããã®æ£åžžãªåäœã確èªãããããããã³ãããã¯ãŒã¯ã®åé¡ãããŒã¿ããŒã¹ã¢ã¯ã»ã¹ã®ããã«ãããããã¹ã¿ãã¯ãããŠããå Žåã¯ã ã©ã€ã/ã¬ãã£ãã¹ãã¹ããå¿
èŠã§ãïŒãªãã·ã§ã³ãšçç±ãããå ŽåããããŸãïŒã ãã®ãããªç¶æ³ã§ã¯ãåé¡ã®ããããããåäœæããå¿
èŠããããŸãã
- ã¢ããªã±ãŒã·ã§ã³ããã®ãµãŒããŒäžã®ãã¹ãŠã®ãµãŒãã¹ãããããŒãããããã¹ãŠã®ãµãŒãã¹ã«æ害ãäžããªãããã«ãæ瀺çã«ãªã¯ãšã¹ããç»é²ããåã³ã³ããã®ãªãœãŒã¹ãå¶éããããšãéèŠã§ãã
解決ç
æ®å¿µãªãããã¢ããªã±ãŒã·ã§ã³ã«å¿
èŠãªãªãœãŒã¹ïŒCPUãRAMïŒã®æ°ãããã«ç解ããã®ã«åœ¹ç«ã€
ç¹å¹è¬ã¯ãããŸãã ã å¯èœãªãªãã·ã§ã³ã¯ããªãœãŒã¹ã®æ¶è²»ã確èªããæ¯åæé©ãªå€ãéžæããããšã§ãã ãµãŒãã¹ã«å€§ããªåœ±é¿ãäžããäžåœãªOOM kill'ovãšCPU throttling'aãåé¿ããããã«ã以äžãæäŸã§ããŸãã
- ãã®ã³ã³ãããæ£ããåäœããŠããããšã確èªã§ããããã«ãæ£ãã掻æ§/æºåãã¹ããè¿œå ããŠãã ããã ã»ãšãã©ã®å Žåããã¹ãŠã®ã€ã³ãã©ã¹ãã©ã¯ãã£èŠçŽ ã®å¯çšæ§ã確èªãããµãŒãã¹ããŒãžïŒã¢ããªã±ãŒã·ã§ã³ããããã§åäœããããã«å¿
èŠïŒãš200 OKå¿çã³ãŒããè¿ããŸãã
- ãªã¯ãšã¹ããåŠçããã¯ãŒã«ãŒã®æ°ãæ£ããéžæããããããæ£ããé
åžããŸãã
ããšãã°ã2ã€ã®ã³ã³ããã§æ§æããã10åã®ãããããããŸããnginxïŒéçãéä¿¡ããããã¯ãšã³ãã«ãªã¯ãšã¹ãããããã·ããããïŒãšphp-fpmïŒå®éã«ã¯åçããŒãžãåŠçããããã¯ãšã³ãïŒã§ãã php-fpmããŒã«ã¯ãéçãªæ°ã®ã¯ãŒã«ãŒçšã«æ§æãããŠããŸãïŒ10ïŒã ãããã£ãŠãåäœæéå
ã«ãããã¯ãšã³ããžã®100ã®ã¢ã¯ãã£ããªãªã¯ãšã¹ããåŠçã§ããŸãã åãªã¯ãšã¹ãã1ç§ã§PHPã«ãã£ãŠåŠçãããããã«ããŸãã
çŸåš10åã®ãªã¯ãšã¹ããã¢ã¯ãã£ãã«åŠçããŠããç¹å®ã®ãããã«å¥ã®ãªã¯ãšã¹ããå°çãããšã©ããªããŸããïŒ PHPã¯ãããåŠçã§ãããIngressã¯GETãªã¯ãšã¹ãã§ããå Žåã次ã®ãããã«åè©Šè¡ããããã«éä¿¡ããŸãã POSTãªã¯ãšã¹ãããã£ãå Žåããšã©ãŒãè¿ããŸãã
ãããŠã10åãã¹ãŠã®ãªã¯ãšã¹ãã®åŠçäžã«kubeletïŒliveness probeïŒãããã§ãã¯ãåãåãããšãèæ
®ãããšã倱æããKubernetesã¯ãã®ã³ã³ããã«äœãåé¡ããããšèãå§ããããã匷å¶çµäºããŸãã ãã®å Žåããã®æç¹ã§åŠçããããã¹ãŠã®ãªã¯ãšã¹ãã¯ãšã©ãŒïŒïŒïŒã§çµäºããŸãããŸããã³ã³ããã®åèµ·åæã«ãã©ã³ã¹ã厩ããä»ã®ãã¹ãŠã®ããã¯ãšã³ãã®ãªã¯ãšã¹ããå¢å ããŸãã
æããã«
ãããã2ã€ãããããããã«10åã®php-fpmã¯ãŒã«ãŒãèšå®ãããŠãããšããŸãã 以äžã¯ããããŠã³ã¿ã€ã ãäžã®æ
å ±ã衚瀺ããã°ã©ãã§ãã php-fpmãèŠæ±ããå¯äžã®php-fpmãšã¯ã¹ããŒã¿ãŒïŒã¢ã¯ãã£ããªã¯ãŒã«ãŒããããã1人ããïŒã®å ŽåïŒ

次ã«ãåæå®è¡19ã§ããŒããéå§ããŸãã

ã§ã¯ãåæåŠçãåŠçã§ããç¯å²ãããé«ãããŠã¿ãŸãããïŒ20ïŒ... 23ãšããŸãããããã¹ãŠã®php-fpmã¯ãŒã«ãŒã¯ãã¯ã©ã€ã¢ã³ããªã¯ãšã¹ãã®åŠçã§å¿ãããªããŸãã

Vorkerã¯æŽ»åãµã³ãã«ãåŠçããã®ã«ååã§ã¯ãªããããKubernetesããã·ã¥ããŒãã«ãã®åçã衚瀺ãããŸãïŒãŸãã¯
describe pod
ïŒã

çŸåšããããã®1ã€ããªããŒããããšã
éªåŽ©å¹æãçºçããŸã ããªã¯ãšã¹ãã¯2çªç®ã®ãããã«èœã¡å§ããŸããããããåŠçã§ãããã¯ã©ã€ã¢ã³ãããå€æ°ã®ãšã©ãŒãåãåããŸãã ãã¹ãŠã®ã³ã³ããã®ããŒã«ããã£ã±ãã«ãªã£ãåŸããµãŒãã¹ãäžããããšã«ã¯åé¡ããããŸããããã¯ãããããŸãã¯ã¯ãŒã«ãŒã®æ°ãæ¥æ¿ã«å¢ããããšã«ãã£ãŠã®ã¿å¯èœã§ãã
æåã®ãªãã·ã§ã³
PHPã䜿çšããã³ã³ãããŒã§ã¯ã2ã€ã®fpmããŒã«ãæ§æã§ããŸãã1ã€ã¯ã¯ã©ã€ã¢ã³ããªã¯ãšã¹ãã®åŠççšããã1ã€ã¯ã³ã³ãããŒã®åç¶å¯èœæ§ã®ç¢ºèªçšã§ãã 次ã«ãnginxã³ã³ãããŒã§åæ§ã®æ§æãè¡ãå¿
èŠããããŸãã
upstream backend { server 127.0.0.1:9000 max_fails=0; } upstream backend-status { server 127.0.0.1:9001 max_fails=0; }
ããšã¯ãåŠççšã®æŽ»æ§ãµã³ãã«ã
backend-status
ãšããã¢ããã¹ããªãŒã ã«éä¿¡ããã ãã§ãã
livenessãããŒããåå¥ã«åŠçãããããã«ãªã£ããããäžéšã®ã¯ã©ã€ã¢ã³ãã§ãšã©ãŒãåŒãç¶ãçºçããŸãããå°ãªããšããããã®åèµ·åãšä»ã®ã¯ã©ã€ã¢ã³ãã®åæã«é¢é£ããåé¡ã¯ãããŸããã ãããã£ãŠãããã¯ãšã³ããçŸåšã®è² è·ã«å¯ŸåŠã§ããªãå Žåã§ãããšã©ãŒã®æ°ã倧å¹
ã«åæžããŸãã
ãã®ãªãã·ã§ã³ã¯äœããªãããã¯ç¢ºãã«åªããŠããŸãããã¡ã€ã³ããŒã«ã«äœããèµ·ããå¯èœæ§ããããããæªãããšã§ããããŸããããã¯ã掻æ§ãã¹ãã®äœ¿çšã«ã€ããŠã¯åŠç¿ããŸããã
2çªç®ã®ãªãã·ã§ã³
nginx-limit-upstreamãšåŒã°ããããŸã人æ°ã®ãªãnginxã¢ãžã¥ãŒã«ã䜿çšããããšãã§ããŸãã 次ã«ãPHPã§11人ã®ã¯ãŒã«ãŒãæå®ããnginxãå«ãã³ã³ãããŒã§åæ§ã®æ§æãäœæããŸãã
limit_upstream_zone limit 32m; upstream backend { server 127.0.0.1:9000 max_fails=0; limit_upstream_conn limit=10 zone=limit backlog=10 timeout=5s; } upstream backend-status { server 127.0.0.1:9000 max_fails=0; }
ããã³ããšã³ãã¬ãã«ã§ã¯ãnginxã¯ããã¯ãšã³ãã«éä¿¡ããããªã¯ãšã¹ãã®æ°ãå¶éããŸãïŒ10ïŒã èå³æ·±ãç¹ã¯ãç¹å¥ãªããã¯ãã°ãäœæãããããšã§ãïŒã¯ã©ã€ã¢ã³ããnginxã®11çªç®ã®ãªã¯ãšã¹ããåä¿¡ããnginxãphp-fpmããŒã«ãããžãŒã§ããããšã確èªããå Žåããã®ãªã¯ãšã¹ãã¯5ç§éããã¯ãã°ã«çœ®ãããŸãã ãã®éã«php-fpmã解æŸãããªãå ŽåãIngressãåäœããå¥ã®ããããžã®ãªã¯ãšã¹ããåè©Šè¡ããŸãã 掻æ§ãµã³ãã«ãåŠçããããã«åžžã«1ã€ã®ç¡æã®PHPã¯ãŒã«ãŒããããããããã«ããç¶æ³ãã¹ã ãŒãºã«ãªããŸããéªåŽ©ã®åœ±é¿ãåé¿ã§ããŸãã
ãã®ä»ã®èã
ãã®åé¡ã解決ããããã®ããæ±çšçã§çŸãããªãã·ã§ã³ã«ã€ããŠã¯ã
Envoyãšãã®é¡äŒŒç©ã®æ¹åæ§ã調ã¹ã䟡å€ããããŸãã
äžè¬ã«ãPrometheusãåŽåè
ãæ確ã«éçšããããã«ãåé¡ãè¿
éã«çºèŠïŒããã³éç¥ïŒããã®ã«åœ¹ç«ã€ããããœãããŠã§ã¢ããPrometheus圢åŒã«ããŒã¿ãå€æããæ¢è£œã®
茞åºæ¥è
ãååŸããããšã匷ããå§ãããŸãã
PS
ãã®ä»ã®K8sã®ãã³ããšããªãã¯ã®ãµã€ã¯ã«ïŒ
ããã°ãã芧ãã ããã