We are not waiting for future, We create the future

Tags


ตัวอย่างไฟล์ Laravel 5 + nginx + phpfpm บน k8s

27th November 2018

*บทความยาวเน้อออ...

บทความนี้ผมจะมาแชร์ประสบการณ์ในการทำ CI/CD สำหรับเว็บไซต์ PHP Application จากที่ได้ลองทำมาหลาย Stack แล้ว ผมคิดว่า Stack ที่ผมทำปัจจุบันน่าจะ OK ที่สุดละ (เข้าข้างตัวเอง)

โดยจะขอยกตัวอย่างสำหรับ Laravel 5 ทำหน้าเว็บไซต์ ซึ่งถ้าเป็น php framework อื่นก็น่าจะแนวๆ เดียวกันได้

PHP on K8S Diagram

สังเกตุจาก diagram ด้านบนทำให้เราสามารถแยก scale เฉพาะ nignx หรือ phpfpm ได้เลย โดยผมได้ทำ code ตัวอย่างไว้ให้แล้วตามนี้

https://gitlab.com/twin-opensource/laravel-nginx-phpfpm-k8s

สามารถ clone มาลองดูได้

หลังจาก clone มาแล้วผมจะทำการอธิบายเพิ่มสำหรับไฟล์ข้างในว่าส่วนไหนไว้ทำอะไร แต่ผมจะยังไม่ลงลึกถึงการเขียนไฟล์ .gitlab-ci.yml นะ ไว้คราวหลังจะมาอธิบายแยกอีกครั้ง


โครงสร้าง Project

.
├── config/
├── Dockerfile-nginx
├── Dockerfile-php
├── .git
├── .gitignore
├── .gitlab-ci.yml
├── k8s/
├── laravel/
└── README.md
  • config/ โฟลเดอร์นี้ไว้เก็บ config ไฟล์ของ nginx และ php
  • k8s/ โฟลเดอร์นี้ไว้เก็บไฟล์ deployment และ service ของ k8s
  • laravel/ โพลเดอร์นี้ไว้เก็บ app ของเรา ด้านในจะเป็น code ของ laravel
  • dockerfile-nginx และ dockerfile-php จะเป็นการทำ docker image
  • .gitlab-ci.yml ไว้เขียน CI/CD บน gitlab

โฟลเดอร์ k8s/

k8s/
├── deploy.yml
└── svc.yml

ในนี้ผมจะเก็บไฟล์ yml ของ k8s ไว้โดยจะมีสองไฟล์คือ deploy.yml และ svc.yml

โฟลเดอร์ config/

config/
├── nginx/
│   └── default.conf
└── php/
    └── php.ini

ในนี้ผมจะแยกไฟล์ config ไว้ของ nginx และ php โดยจุดสังเกตุที่จะให้ดูก็คือในส่วนของ nginx/default.conf เพราะผมได้ทำการเขียนแบบ upstream เอาไว้โดยให้วิ่งไปหา nginx service ของ k8s ดังโค็ดด้านล่าง

upstream phpfpm { 
    server svc-laravel-nginx-phpfpm-k8s-php:9000; 
}
server {

    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;
    server_name _;

...

location ~ \.php$ {
        try_files $uri /index.php =404;
        fastcgi_pass phpfpm;

...

สังเกตุ fastcgi_pass phpfpm; จะชื่อตรงกับ upstream phpfpm แล้วค่าใน upstream จะเป็นชื่อของ service php ตามด้วย port 9000

ไฟล์ .gitlab-ci.yml

เป็นไฟล์ที่เอาไว้เขียน ci/cd บน gitlab ซึ่งถ้าเรา push ขึ้น gitlab เมื่อไรมันจะทำการอ่านไฟล์นี้เสมอ

Gitlab Pipeline

อย่างที่ได้กล่าวไว้แล้ว ผมจะไม่อธิบายโค็ดในไฟล์นี้เพราะมันเยอะ ไว้ค่อยทำบทความแยกออกมาอีก แต่จะให้ดูไฟล์รูปด้านบน ผมได้ทำการเขียนไว้มี 2 stages สำหรับ project นี้คือ

  • Build ไว้สำหรับทำการติดตั้ง component ของพวก composer และ npm จากนั้นทำ caching folder พวก vendor/ และ node_modules/ ไว้
  • Release ไว้สำหรับสร้าง Docker image แยกเลยสำหรับ nginx และ php โดยแต่ละ Job จะทำการโหลด caching folder ที่ผมทำการแยกไว้ Build stage มาด้วย

จริงๆ ต้องมี Deploy stage ด้วยแต่เอาไว้ก่อน ตอนนี้เรามา deploy เองด้วยมือกัน

วิธีใช้งาน

สร้าง deployment และ service

⚡ kubectl create -f k8s/

ทดสอบเรียกหน้าเว็บ

⚡ kubectl port-forward svc/svc-laravel-nginx-phpfpm-k8s-nginx 8080:80

จากนั้นเข้า http://localhost:8080 จะเจอหน้า laravel พื้นฐาน

IT manager & DevOps @Twin Synergy Co.,Ltd

View Comments