Thứ ba, 23/06/2020 | 00:00 GMT+7

Cách triển khai Laravel 7 và MySQL trên Kubernetes bằng Helm

Laravel là một trong những framework ứng dụng PHP open-souce phổ biến nhất hiện nay. Nó thường được triển khai với sở dữ liệu MySQL nhưng có thể được cấu hình để sử dụng nhiều tùy chọn lưu trữ dữ liệu backend . Laravel tự hào về việc tận dụng nhiều tính năng hiện đại của PHP và hệ sinh thái gói mở rộng.

Kubernetes là một nền tảng điều phối containers có thể được lưu trữ trên các cụm DigitalOcean Kubernetes để đảm nhận phần lớn công việc quản trị từ việc cài đặt và chạy các containers trong production . Helm là một trình quản lý gói Kubernetes giúp cấu hình và cài đặt các dịch vụ và group trên Kubernetes dễ dàng hơn.

Trong hướng dẫn này, bạn sẽ tạo một ứng dụng PHP Laravel, xây dựng ứng dụng của bạn thành một Docker image và triển khai hình ảnh đó vào một cụm DigitalOcean Kubernetes bằng cách sử dụng biểu đồ LAMP Helm . Tiếp theo, bạn sẽ cài đặt Bộ điều khiển Ingress để thêm SSL và domain tùy chỉnh vào ứng dụng của bạn . Khi hoàn thành, bạn sẽ có một ứng dụng Laravel đang hoạt động được kết nối với database MySQL đang chạy trên một cụm Kubernetes.

Yêu cầu

  • Docker được cài đặt trên máy mà bạn sẽ truy cập vào cụm của bạn . Bạn có thể tìm thấy hướng dẫn chi tiết vềcách cài đặt Docker cho hầu hết các bản phân phối Linux tại đây hoặc trên trang web của Docker cho các hệ điều hành khác.
  • Một account tại Docker Hub để lưu trữ Docker image mà bạn sẽ tạo trong suốt hướng dẫn này.
  • Một cụm DigitalOcean Kubernetes 1.17+ với cấu hình kết nối của bạn được đặt làm mặc định kubectl . Để tìm hiểu cách tạo một cụm Kubernetes trên DigitalOcean, hãy xem Kubernetes Quickstart . Để tìm hiểu cách kết nối với cụm, hãy xem Cách kết nối với cụm DigitalOcean Kubernetes .
  • Trình quản lý gói Helm 3 được cài đặt trên máy local của bạn. Hoàn thành bước đầu tiên và thêm repo stable từ bước thứ hai của Cách cài đặt phần mềm trên Kubernetes Cluster với hướng dẫn Trình quản lý gói Helm 3 .
  • Tên domain được đăng ký đầy đủ với bản ghi A có sẵn. Hướng dẫn này sẽ sử dụng your_domain xuyên suốt. Bạn có thể mua domain trên Namecheap , nhận một domain miễn phí trên Freenom hoặc sử dụng công ty đăng ký domain mà bạn chọn. Đừng lo lắng về việc liên kết bản ghi A của domain của bạn với một IP vào lúc này. Khi bạn đến Bước 5 và bộ điều khiển Ingress của bạn đã sẵn sàng, bạn sẽ kết nối your_domain với IP thích hợp.

Bước 1 - Tạo một ứng dụng Laravel mới

Trong bước này, bạn sẽ sử dụng Docker để tạo một ứng dụng Laravel 7 mới, nhưng bạn có thể thực hiện quy trình tương tự với một ứng dụng Laravel hiện có sử dụng MySQL làm database hỗ trợ. Ứng dụng mới bạn xây dựng sẽ xác minh Laravel được kết nối với database và hiển thị tên của database .

Đầu tiên, di chuyển đến folder chính của bạn và sau đó tạo một ứng dụng Laravel mới bằng cách sử dụng containers Docker của trình composer :

  • cd ~
  • docker run --rm -v $(pwd):/app composer create-project --prefer-dist laravel/laravel laravel-kubernetes

Sau khi hoàn tất quá trình chứa và tất cả các gói Composer đã được cài đặt, bạn sẽ thấy một bản cài đặt mới của Laravel trong folder hiện tại của bạn có tên laravel-kubernetes/ . Điều hướng đến folder đó:

  • cd ~/laravel-kubernetes

Bạn sẽ thực hiện phần còn lại của các lệnh trong hướng dẫn này từ đây.

Mục đích của ứng dụng này là để kiểm tra kết nối database của bạn và hiển thị tên của nó trong trình duyệt của bạn. Để kiểm tra kết nối database , hãy mở file ./resources/views/welcome.blade.php trong editor :

  • nano ./resources/views/welcome.blade.php

Tìm phần <div class="links">...</div> và thay thế nội dung của nó bằng phần sau:

./resources/views/welcome.blade.php
... <div class="links">    <strong>Database Connected: </strong>     @php         try {             DB::connection()->getPDO();             echo DB::connection()->getDatabaseName();             } catch (\Exception $e) {             echo 'None';         }     @endphp </div> ... 

Lưu và đóng file .

Đó là tất cả những tùy chỉnh bạn cần thực hiện đối với ứng dụng Laravel mặc định cho hướng dẫn này. Sau khi hoàn tất, đoạn mã PHP ngắn gọn này sẽ kiểm tra kết nối database của bạn và hiển thị tên database trên màn hình Laravel trong trình duyệt web .

Trong bước tiếp theo, bạn sẽ sử dụng Docker để xây dựng một hình ảnh chứa ứng dụng Laravel này và Docker Compose để kiểm tra xem nó có chạy local và kết nối với database MySQL hay không.

Bước 2 - Giữ lại ứng dụng Laravel của bạn

Đến đây bạn đã tạo một ứng dụng Laravel mới, bạn cần phải xây dựng mã của bạn thành một Docker image và sau đó kiểm tra hình ảnh bằng Docker Compose. Mặc dù mục tiêu của hướng dẫn này là triển khai ứng dụng của bạn vào một cụm Kubernetes, Docker Compose là một cách thuận tiện để kiểm tra local hình ảnh và cấu hình Docker của bạn trước khi chạy nó trên cloud . Vòng phản hồi nhanh này có thể hữu ích để thực hiện và thử nghiệm các thay đổi nhỏ.

Đầu tiên, sử dụng nano hoặc editor bạn muốn , tạo một file trong folder root của ứng dụng Laravel của bạn có tên Dockerfile :

  • nano ./Dockerfile

Thêm nội dung sau. Docker sẽ sử dụng file này để xây dựng mã của bạn thành một hình ảnh:

./Dockerfile
FROM php:7.4-apache  # Install packages RUN apt-get update && apt-get install -y \     git \     zip \     curl \     sudo \     unzip \     libicu-dev \     libbz2-dev \     libpng-dev \     libjpeg-dev \     libmcrypt-dev \     libreadline-dev \     libfreetype6-dev \     g++  # Apache configuration ENV APACHE_DOCUMENT_ROOT=/var/www/html/public RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf RUN sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf RUN a2enmod rewrite headers  # Common PHP Extensions RUN docker-php-ext-install \     bz2 \     intl \     iconv \     bcmath \     opcache \     calendar \     pdo_mysql  # Ensure PHP logs are captured by the container ENV LOG_CHANNEL=stderr  # Set a volume mount point for your code VOLUME /var/www/html  # Copy code and run composer COPY --from=composer:latest /usr/bin/composer /usr/bin/composer COPY . /var/www/tmp RUN cd /var/www/tmp && composer install --no-dev  # Ensure the entrypoint file can be run RUN chmod +x /var/www/tmp/docker-entrypoint.sh ENTRYPOINT ["/var/www/tmp/docker-entrypoint.sh"]  # The default apache run command CMD ["apache2-foreground"] 

Lưu và đóng file .

Dockerfile này bắt đầu với Docker image PHP 7.4 Apache được tìm thấy trên Docker Hub , sau đó cài đặt một số gói Linux thường được các ứng dụng Laravel yêu cầu. Tiếp theo, nó tạo các file cấu hình Apache và cho phép ghi lại tiêu đề. Dockerfile cài đặt một số phần mở rộng PHP phổ biến và thêm một biến môi trường đảm bảo rằng các bản ghi của Laravel được truyền trực tuyến đến containers thông qua stderr . Điều này sẽ cho phép bạn xem log Laravel bằng cách gắn thẻ log Docker Compose hoặc Kubernetes của bạn.

Cuối cùng, Dockerfile sao chép tất cả mã trong ứng dụng Laravel của bạn sang /var/www/tmp và cài đặt các phần phụ thuộc của Composer. Sau đó, nó đặt một ENTRYPOINT , nhưng bạn cần tạo file đó, mà ta sẽ thực hiện tiếp theo.

Tại folder root của dự án của bạn, hãy tạo một file mới có tên là docker-entrypoint.sh . Tệp này sẽ chạy khi containers của bạn được chạy local hoặc trong cụm Kubernetes và nó sẽ sao chép mã ứng dụng Laravel của bạn từ folder /var/www/tmp sang /var/www/html nơi Apache sẽ có thể phân phối nó.

  • nano ./docker-entrypoint.sh

Bây giờ thêm tập lệnh sau:

./docker-entrypoint.sh
#!/bin/bash  cp -R /var/www/tmp/. /var/www/html/ chown -R www-data:www-data /var/www/html  exec "$@" 

Dòng cuối cùng, exec "$@" hướng dẫn shell chạy bất kỳ lệnh nào được chuyển vào làm đối số đầu vào tiếp theo. Điều này quan trọng vì bạn muốn Docker tiếp tục chạy lệnh chạy Apache ( apache2-foreground ) sau khi tập lệnh này thực thi. Lưu và đóng file .

Tiếp theo, tạo file .dockerignore trong folder root của ứng dụng của bạn. Tệp này sẽ đảm bảo khi bạn xây dựng Docker image của bạn , nó sẽ không bị ô nhiễm bởi các gói hoặc file môi trường không nên sao chép vào đó:

  • nano ./.dockerignore
./.dockerignore
.env /vendor 

Lưu và đóng file .

Tệp cuối cùng mà bạn cần tạo trước khi có thể chạy ứng dụng local bằng Docker Compose là file docker-compose.yml . Nhưng trong quá trình cấu hình file YAML này, bạn cần nhập APP_KEY mà Laravel đã tạo trong quá trình cài đặt. Tìm điều này bằng cách mở và tìm kiếm file ./.env hoặc bằng cách chạy các lệnh catgrep sau:

  • cat .env | grep ^APP_KEY

Bạn sẽ thấy một kết quả như thế này:

Output
APP_KEY=base64:0EHhVpgg ... UjGE=

Sao chép khóa của bạn vào clipboard . Đảm bảo bao gồm tiền tố base64: Bây giờ, hãy tạo file docker-compose.yml trong folder root của ứng dụng của bạn:

  • nano ./docker-compose.yml

Ở đây ta sẽ bao gồm hình ảnh PHP của ứng dụng Laravel của bạn cũng như một containers MySQL để chạy database của bạn. Thêm nội dung sau:

./docker-compose.yml
version: '3.5' services:   php:     image: your_docker_hub_username/laravel-kubernetes:latest     restart: always     ports:       - 8000:80     environment:       - APP_KEY="your_laravel_app_key"       - APP_ENV=local       - APP_DEBUG=true       - DB_PORT=3306       - DB_HOST=mysql       - DB_DATABASE       - DB_USERNAME       - DB_PASSWORD   mysql:     image: mysql:5.7     restart: always     environment:       - MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD}       - MYSQL_DATABASE=${DB_DATABASE}       - MYSQL_USER=${DB_USERNAME}       - MYSQL_PASSWORD=${DB_PASSWORD} 

Sử dụng biến APP_KEY mà bạn đã sao chép vào clipboard cho biến your_laravel_app_key và sử dụng tên user Docker Hub cho biến your_docker_hub_username . Lưu và đóng file .

Bạn sẽ tạo local hình ảnh đầu tiên bằng cách sử dụng bản docker build . Hình ảnh thứ hai là hình ảnh MySQL Docker chính thức có sẵn trên Docker Hub. Cả hai đều yêu cầu một số biến môi trường mà bạn sẽ đưa vào khi chạy containers .

Để tạo Docker image chứa ứng dụng Laravel của bạn, hãy chạy lệnh sau. Đảm bảo thay thế your_docker_hub_username bằng tên user của bạn hoặc tên user của group của bạn tại Docker Hub nơi hình ảnh này sẽ được lưu trữ:

  • docker build -t your_docker_hub_username/laravel-kubernetes:latest .

Tiếp theo, bạn có thể chạy hai containers với Docker Compose với thông tin đăng nhập database bắt buộc:

  • DB_ROOT_PASSWORD=rootpassword DB_DATABASE=local_db DB_USERNAME=admin DB_PASSWORD=password docker-compose up -d

Bốn biến môi trường được sử dụng ở đây ( DB_ROOT_PASSWORD , DB_DATABASE , DB_USERNAME , DB_PASSWORD ) có thể được sửa đổi nếu bạn muốn, nhưng vì bạn chỉ đang kiểm tra local ứng dụng của bạn nên bạn chưa phải lo lắng về việc bảo mật chúng.

Có thể mất đến 30 giây để database MySQL của bạn khởi tạo và các containers của bạn sẵn sàng. Sau khi có, bạn có thể xem ứng dụng Laravel trên máy của bạn tại localhost:8000 .

Ứng dụng Laravel chạy local  bằng Docker Compose

Ứng dụng PHP của bạn sẽ kết nối với database MySQL của bạn. Sau khi kết nối thành công, dòng chữ “Database Connected: local_db” sẽ xuất hiện bên dưới logo Laravel.

Đến đây bạn đã kiểm tra local Docker image của bạn bằng Docker Compose, bạn có thể đưa các containers xuống bằng cách chạy docker-compose down :

  • docker-compose down

Trong phần tiếp theo, bạn sẽ đẩy Docker image của bạn vào Docker Hub để biểu đồ Helm của bạn có thể sử dụng nó để triển khai ứng dụng của bạn cho cụm Kubernetes của bạn.

Bước 3 - Đẩy Docker image của bạn lên Docker Hub

Biểu đồ Helm LAMP mà bạn sẽ sử dụng để triển khai mã của bạn cho Kubernetes yêu cầu mã của bạn phải có sẵn trong register containers . Mặc dù bạn có thể đẩy hình ảnh của bạn vào register riêng tư hoặc tự lưu trữ, nhưng với mục đích của hướng dẫn này, bạn sẽ sử dụng register Docker miễn phí và công khai trên Docker Hub.

Truy cập account của bạn trên Docker Hub bằng trình duyệt web và sau đó tạo một repository mới có tên laravel-kubernetes .

Tạo repository  mới trên Docker Hub

Tiếp theo, nếu bạn chưa kết nối với Docker Hub từ máy local của bạn , bạn cần đăng nhập vào Docker Hub. Bạn có thể làm điều này thông qua dòng lệnh:

  • docker login -u your_docker_hub_username

Nhập thông tin đăng nhập của bạn khi được yêu cầu . Điều này thường chỉ cần được thực hiện một lần cho mỗi máy vì Docker sẽ lưu thông tin đăng nhập của bạn vào ~/.docker/config.json trong folder chính của bạn.

Cuối cùng, đẩy hình ảnh của bạn lên Docker Hub:

  • docker push your_docker_hub_username/laravel-kubernetes:latest

Có thể mất vài phút để tải lên ứng dụng của bạn tùy thuộc vào kết nối của bạn
về tốc độ, nhưng khi Docker được thực hiện, bạn sẽ thấy mã băm thông báo cuối cùng và kích thước hình ảnh của bạn trong terminal. Nó trông giống như sau :

Output
latest: digest: sha256:df4bdeda91484c8c26a989b13b8f27ab14d93ab2e676e3c396714cb3811c4086 size: 4918

Bây giờ ứng dụng Laravel của bạn đã được chứa và bạn đã đẩy một hình ảnh vào Docker Hub, bạn có thể sử dụng hình ảnh đó trong Helm Chart hoặc triển khai Kubernetes. Trong bước tiếp theo, bạn sẽ đặt các giá trị tùy chỉnh dựa trên Biểu đồ Helm LAMP và triển khai nó vào cụm DigitalOcean Kubernetes của bạn.

Bước 4 - Cấu hình và Triển khai Ứng dụng với Biểu đồ Helm LAMP

Helm cung cấp một số Biểu đồ để giúp bạn cài đặt các ứng dụng Kubernetes bằng cách sử dụng các tổ hợp công cụ đặt trước. Mặc dù bạn có thể viết các file dịch vụ Kubernetes của riêng mình để thực hiện triển khai tương tự, nhưng bạn sẽ thấy trong phần này việc sử dụng Biểu đồ Helm sẽ yêu cầu cấu hình ít hơn nhiều.

Trước tiên, bạn cần một folder để lưu trữ tất cả các file cấu hình Helm của bạn . Tạo một folder mới trong folder root của dự án Laravel của bạn có tên là helm/ :

  • mkdir ./helm

Bên trong helm/ folder , bạn sẽ tạo ra hai file mới: values.ymlsecrets.yml . Đầu tiên hãy tạo và mở các giá values.yml :

  • nano ./helm/values.yml

Tệp values.yml sẽ bao gồm các tùy chọn cấu hình không bí mật sẽ overrides các giá trị mặc định trong biểu đồ LAMP Helm. Thêm các cấu hình sau, đảm bảo thay thế your_docker_hub_username bằng tên user của bạn :

./helm/values.yml
php:   repository: "your_docker_hub_username/laravel-kubernetes"   tag: "latest"   fpmEnabled: false   envVars:     - name: APP_ENV       value: production     - name: APP_DEBUG       value: false     - name: DB_PORT       value: 3306     - name: DB_HOST       value: localhost 

Lưu và đóng file .

Bây giờ tạo một file secrets.yml :

  • nano ./helm/secrets.yml

secrets.yml sẽ không được kiểm soát version . Nó sẽ chứa thông tin cấu hình nhạy cảm như password database của bạn và khóa ứng dụng Laravel. Thêm các cấu hình sau, điều chỉnh nếu cần để phù hợp với thông tin đăng nhập của bạn:

./helm/secrets.yml
mysql:   rootPassword: "your_database_root_password"   user: your_database_user   password: "your_database_password"   database: your_database_name  php:   envVars:     - name: APP_KEY       value: "your_laravel_app_key"     - name: DB_DATABASE       value: your_database_name     - name: DB_USERNAME       value: your_database_user     - name: DB_PASSWORD       value: "your_database_password" 

Đảm bảo sử dụng kết hợp tên user và password mạnh cho database production của bạn và sử dụng cùng your_laravel_app_key như trên hoặc mở cửa sổ dòng lệnh mới và tạo một cửa sổ mới bằng cách chạy lệnh sau. Sau đó, bạn có thể sao chép giá trị mới Laravel đặt trong file .env của bạn :

  • docker run --rm -v $(pwd):/app php:cli php /app/artisan key:generate

Lưu và đóng các secrets.yml .

Tiếp theo, để ngăn file secrets.yml của bạn được tích hợp vào Docker image hoặc được lưu vào kiểm soát version , hãy đảm bảo thêm dòng sau vào cả .dockerignore.gitignore của bạn. Mở và thêm /helm/secrets.yml vào từng file hoặc chạy lệnh sau để thêm cả hai:

  • echo '/helm/secrets.yml' >> ./.dockerignore && echo '/helm/secrets.yml' >> ./.gitignore

Đến đây bạn đã tạo các file cấu hình Helm cho ứng dụng của bạn và Docker image , bạn có thể cài đặt biểu đồ Helm này dưới dạng bản phát hành mới trên cụm Kubernetes của bạn . Cài đặt biểu đồ của bạn từ folder root của ứng dụng:

  • helm install laravel-kubernetes -f helm/values.yml -f helm/secrets.yml stable/lamp

Bạn sẽ thấy một kết quả như thế này:

Output
NAME: laravel-kubernetes LAST DEPLOYED: Mon May 18 13:21:20 2020 NAMESPACE: default STATUS: deployed REVISION: 1

Ứng dụng của bạn sẽ mất một hoặc hai phút để có sẵn, nhưng bạn có thể chạy lệnh này để giám sát các dịch vụ Kubernetes trong cụm của bạn :

  • kubectl get services -w

Tìm tên ứng dụng của bạn:

Output
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) laravel-kubernetes-lamp LoadBalancer your_cluster_ip your_external_ip 80:32175/TCP,3306:32243/TCP

Khi dịch vụ laravel-kubernetes-lamp mới của bạn hiển thị địa chỉ IP trong EXTERNAL-IP , bạn có thể truy cập your_external_ip để xem ứng dụng đang chạy trên cụm Kubernetes của bạn . Ứng dụng của bạn sẽ kết nối với database của bạn và bạn sẽ thấy tên của database bên dưới logo Laravel, giống như khi bạn chạy ứng dụng local trên Docker Compose.

Ứng dụng Laravel chạy trên Kubernetes sử dụng biểu đồ LAMP Helm

Việc chạy một ứng dụng web trên địa chỉ IP không an toàn có thể được chấp nhận đối với một bằng chứng về khái niệm, nhưng trang web chưa sẵn sàng production nếu không có certificate SSL và domain tùy chỉnh. Trước khi bạn cài đặt điều đó trong bước tiếp theo, hãy gỡ cài đặt bản phát hành của bạn qua dòng lệnh:

  • helm delete laravel-kubernetes

Trong bước tiếp theo, bạn sẽ mở rộng cấu hình Helm đầu tiên này để thêm bộ điều khiển Ingress, certificate SSL và domain tùy chỉnh vào ứng dụng Laravel của bạn.

Bước 5 - Thêm Bộ điều khiển Ingress và SSL vào Cụm Kubernetes của bạn

Trong Kubernetes, Bộ điều khiển Ingress chịu trách nhiệm đưa các dịch vụ của ứng dụng của bạn lên internet. Ở bước trước, biểu đồ LAMP Helm đã tạo một Bộ cân bằng tải DigitalOcean và hiển thị ứng dụng của bạn trực tiếp thông qua địa chỉ IP của bộ cân bằng tải.

Bạn có thể chấm dứt SSL và domain của bạn trực tiếp trên bộ cân bằng tải , nhưng vì bạn đang làm việc ở Kubernetes, có thể thuận tiện hơn khi quản lý tất cả ở cùng một nơi. Để biết thêm thông tin về Bộ điều khiển Ingress và chi tiết về các bước sau, hãy đọc Cách cài đặt Nginx Ingress trên DigitalOcean Kubernetes bằng Helm .

Biểu đồ LAMP Helm bao gồm tùy chọn cấu hình để hỗ trợ Ingress. Mở file helm/values.yml của bạn:

  • nano ./helm/values.yml

Bây giờ thêm các dòng sau:

./helm/values.yml
... # Use Ingress Controller service:   type: ClusterIP   HTTPPort: 80 ingress:   enabled: true   domain: your_domain 

Điều này hướng dẫn triển khai của bạn không cài đặt bộ cân bằng tải và thay vào đó, để ứng dụng hiển thị với cổng 80 của cụm Kubernetes nơi Bộ điều khiển Ingress sẽ hiển thị nó với internet. Lưu và đóng giá values.yml .

Bây giờ hãy chạy lệnh helm install mà bạn đã chạy trước đó để ứng dụng Laravel của bạn chạy lại. Đảm bảo chạy lệnh từ folder root của ứng dụng của bạn:

  • helm install laravel-kubernetes -f helm/values.yml -f helm/secrets.yml stable/lamp

Tiếp theo, cài đặt bộ điều khiển nginx-ingress trên cụm Kubernetes của bạn bằng cách sử dụng Nginx Ingress Controller do Kubernetes bảo trì:

  • helm install nginx-ingress stable/nginx-ingress --set controller.publishService.enabled=true

Sau khi cài đặt, bạn sẽ thấy một kết quả như sau:

Output
NAME: nginx-ingress LAST DEPLOYED: Mon May 18 13:28:34 2020 NAMESPACE: default STATUS: deployed REVISION: 1

Bạn cũng cần Tài nguyên Ingress để hiển thị việc triển khai ứng dụng Laravel của bạn . Tạo một file mới trong folder root của ứng dụng có tên ingress.yml :

  • nano ./ingress.yml

Tệp này xác định server , trình quản lý certificate SSL, dịch vụ backend và tên cổng của ứng dụng của bạn. Thêm các cấu hình sau, thay thế your_domain bằng domain bạn chọn:

./ingress.yml
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata:   name: laravel-kubernetes-ingress   annotations:     kubernetes.io/ingress.class: nginx     cert-manager.io/cluster-issuer: letsencrypt-prod spec:   tls:     - hosts:         - your_domain       secretName: laravel-kubernetes-tls   rules:     - host: your_domain       http:         paths:           - backend:               serviceName: laravel-kubernetes-lamp               servicePort: 80 

Lưu và đóng file .

Tiếp theo, bạn nên cài đặt Cert-Manager và tạo một tổ chức phát hành cho phép bạn tạo certificate SSL production bằng Let's Encrypt . Cert-Manager yêu cầu Định nghĩa tài nguyên tùy chỉnh mà bạn có thể áp dụng từ kho lưu trữ Cert-Manager bằng dòng lệnh:

  • kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v0.15.0/cert-manager.crds.yaml

Điều này sẽ tạo ra một số tài nguyên Kubernetes sẽ được hiển thị trong dòng lệnh:

Output
customresourcedefinition.apiextensions.k8s.io/certificaterequests.cert-manager.io created customresourcedefinition.apiextensions.k8s.io/certificates.cert-manager.io created customresourcedefinition.apiextensions.k8s.io/challenges.acme.cert-manager.io created customresourcedefinition.apiextensions.k8s.io/clusterissuers.cert-manager.io created customresourcedefinition.apiextensions.k8s.io/issuers.cert-manager.io created customresourcedefinition.apiextensions.k8s.io/orders.acme.cert-manager.io create

Cert-Manager cũng yêu cầu một không gian tên để cô lập nó trong cụm Kubernetes của bạn:

  • kubectl create namespace cert-manager

Bạn sẽ thấy kết quả này:

Output
namespace/cert-manager created

Bởi vì Jetstack's Cert-Manager không phải là một trong những biểu đồ được Kubernetes duy trì, bạn cũng cần thêm kho lưu trữ Jetstack Helm . Chạy lệnh sau để làm cho nó có sẵn trong Helm:

  • helm repo add jetstack https://charts.jetstack.io

Một bổ sung thành công sẽ xuất ra như sau:

Output
"jetstack" has been added to your repositories

Đến đây bạn đã sẵn sàng cài đặt Cert-Manager vào không gian tên cert-manager trên cụm Kubernetes của bạn:

  • helm install cert-manager --version v0.15.0 --namespace cert-manager jetstack/cert-manager

Khi hoàn tất, bạn sẽ thấy một bản tóm tắt về việc triển khai như sau:

Output
NAME: cert-manager LAST DEPLOYED: Mon May 18 13:32:08 2020 NAMESPACE: cert-manager STATUS: deployed REVISION: 1

Các file cuối cùng bạn cần phải thêm vào folder root ứng dụng Laravel của bạn là một production_issuer.yml file cấu hình Kubernetes. Tạo file :

  • nano ./production_issuer.yml

Bây giờ hãy thêm những thứ sau:

apiVersion: cert-manager.io/v1alpha2 kind: ClusterIssuer metadata:   name: letsencrypt-prod spec:   acme:     # Email address used for ACME registration     email: your_email_address     server: https://acme-v02.api.letsencrypt.org/directory     privateKeySecretRef:       # Name of a secret used to store the ACME account private key       name: letsencrypt-prod-private-key     # Add a single challenge solver, HTTP01 using nginx     solvers:       - http01:           ingress:             class: nginx 

Lưu và đóng file .

Let's Encrypt sẽ gửi your_email_address bất kỳ thông báo quan trọng nào và cảnh báo hết hạn, vì vậy hãy nhớ thêm địa chỉ mà bạn sẽ kiểm tra thường xuyên. Lưu file này và tạo tài nguyên mới cho cả tài nguyên Ingress và nhà phát hành production trong cụm Kubernetes của bạn:

  • kubectl create -f ingress.yml
  • kubectl create -f production_issuer.yml

Cuối cùng, cập nhật bản ghi DNS của domain của bạn để trỏ bản ghi A đến địa chỉ IP của bộ cân bằng tải của bạn. Để tìm địa chỉ IP cho Bộ điều khiển Ingress của bạn, hãy nhập:

  • kubectl get service nginx-ingress-controller
Output
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx-ingress-controller LoadBalancer your_cluster_ip your_external_ip 80:30187/TCP,443:31468/TCP 6m10s

Sử dụng địa chỉ your_external_ip làm địa chỉ IP cho Bản ghi DNS A của bạn. Quy trình cập nhật bản ghi DNS của bạn khác nhau tùy thuộc vào nơi bạn quản lý domain và lưu trữ DNS của bạn , nhưng nếu bạn đang sử dụng DigitalOcean, bạn có thể tham khảo hướng dẫn của ta về Cách quản lý bản ghi DNS .

Sau khi bản ghi DNS của bạn cập nhật và certificate SSL của bạn được tạo, ứng dụng của bạn sẽ có sẵn tại your_domain và SSL sẽ được bật.

Ứng dụng Laravel với kết thúc SSL và domain  tùy chỉnh

Trong khi ứng dụng PHP và database của bạn đã được kết nối, bạn vẫn cần chạy di chuyển database . Trong bước cuối cùng, bạn sẽ thấy cách chạy lệnh Artisan trên Kubernetes pod của bạn để thực hiện di chuyển database và các việc bảo trì thông thường khác.

Bước 6 - Chạy lệnh từ xa

Trong khi ứng dụng Laravel của bạn đang chạy và được kết nối với database MySQL trong Kubernetes, có một số thao tác phổ biến mà bạn nên chạy trên bản cài đặt Laravel mới. Một tác vụ phổ biến mà bạn nên thực hiện là di chuyển database .

Trước khi có thể chạy lệnh Artisan trên ứng dụng Laravel của bạn , bạn cần biết tên của group đang chạy containers ứng dụng Laravel của bạn. Sử dụng dòng lệnh, bạn có thể xem tất cả các group trong cụm Kubernetes của bạn :

  • kubectl get pods

Bạn sẽ thấy một kết quả như thế này:

Output
NAME READY STATUS RESTARTS AGE laravel-kubernetes-lamp-77fb989b46-wczgb 2/2 Running 0 16m

Chọn group để triển khai laravel-kubernetes-lamp-... . Đảm bảo sử dụng tên trong kết quả của bạn chứ không phải tên được liệt kê ở trên. Đến đây bạn có thể chạy kubectl exec trên đó. Ví dụ: chạy di chuyển database bằng lệnh artisan migrate . Bạn sẽ thêm cờ --force vì bạn đang chạy group trong production :

  • kubectl exec laravel-kubernetes-lamp-77fb989b46-wczgb -- php artisan migrate --force

Lệnh này sẽ tạo ra một kết quả :

Output
Migration table created successfully. Migrating: 2014_10_12_000000_create_users_table Migrated: 2014_10_12_000000_create_users_table (0.16 seconds) Migrating: 2019_08_19_000000_create_failed_jobs_table Migrated: 2019_08_19_000000_create_failed_jobs_table (0.05 seconds)

Đến đây bạn đã triển khai thành công Laravel 7 và MySQL cho Kubernetes và thực hiện một tác vụ bảo trì database thiết yếu.

Kết luận

Trong hướng dẫn này, bạn đã học cách chứa một ứng dụng PHP Laravel, kết nối nó với database MySQL, đẩy Docker image chứa mã của bạn đến Docker Hub, sau đó sử dụng biểu đồ Helm để triển khai hình ảnh đó vào một cụm DigitalOcean Kubernetes. Cuối cùng, bạn đã thêm SSL và một domain tùy chỉnh và học cách chạy các công cụ dòng lệnh trên các group đang chạy của bạn .

Kubernetes và Helm cung cấp cho bạn một số lợi thế so với lưu trữ LAMP truyền thống: khả năng mở rộng, khả năng swap dịch vụ mà không cần đăng nhập trực tiếp vào server của bạn, các công cụ để thực hiện nâng cấp luân phiên và kiểm soát môi trường lưu trữ của bạn. Điều đó nói lên rằng, sự phức tạp của việc chứa và cấu hình ứng dụng của bạn ban đầu khiến rào cản để bắt đầu khá cao. Với hướng dẫn này là điểm khởi đầu, việc triển khai Laravel cho Kubernetes trở nên khả thi hơn. Từ đây, bạn có thể cân nhắc tìm hiểu thêm về sức mạnh của Laravel hoặc thêm các công cụ giám sát vào Kubernetes như Linkerd, bạn có thể cài đặt thủ công với hướng dẫn của ta hoặc với DigitalOcean 1-Click .


Tags:

Các tin liên quan

Cách đặt lại mật khẩu gốc MySQL hoặc MariaDB của bạn
2020-05-05
Cách sử dụng Kiểu dữ liệu MySQL BLOB để lưu trữ image bằng PHP trên Ubuntu 18.04
2020-05-05
Cách cài đặt MySQL trên Ubuntu 18.04
2020-04-21
Cách cài đặt MySQL trên CentOS 8
2020-03-18
Cách triển khai phân trang trong MySQL với PHP trên Ubuntu 18.04
2020-01-29
Cách tối ưu hóa truy vấn MySQL với bộ đệm ProxySQL trên Ubuntu 16.04
2019-12-30
Cách cấu hình Cụm Galera với MySQL trên server Ubuntu 18.04
2019-12-16
Cách quản lý và sử dụng trình kích hoạt database MySQL trên Ubuntu 18.04
2019-12-10
Cách tạo một ứng dụng trích dẫn đầy cảm hứng bằng AdonisJs và MySQL
2019-11-22
Cách cài đặt MySQL mới nhất trên Debian 10
2019-07-25