Thứ sáu, 18/01/2019 | 00:00 GMT+7

Cách triển khai một ứng dụng PHP với Kubernetes trên Ubuntu 16.04

Kubernetes là một hệ thống điều phối containers open-souce . Nó cho phép bạn tạo, cập nhật và mở rộng các containers mà không cần lo lắng về thời gian chết.

Để chạy một ứng dụng PHP, Nginx hoạt động như một proxy cho PHP-FPM . Lưu trữ cài đặt này trong một containers duy nhất có thể là một quá trình phức tạp, nhưng Kubernetes sẽ giúp quản lý cả hai dịch vụ trong các containers riêng biệt. Sử dụng Kubernetes sẽ cho phép bạn giữ cho các containers của bạn có thể tái sử dụng và có thể swap , đồng thời bạn sẽ không phải xây dựng lại containers images của bạn mỗi khi có version mới của Nginx hoặc PHP.

Trong hướng dẫn này, bạn sẽ triển khai ứng dụng PHP 7 trên một cụm Kubernetes với Nginx và PHP-FPM chạy trong các containers riêng biệt. Bạn cũng sẽ học cách giữ các file cấu hình và mã ứng dụng của bạn bên ngoài containers images bằng cách sử dụng hệ thống Lưu trữ khối của DigitalOcean . Cách tiếp cận này sẽ cho phép bạn sử dụng lại hình ảnh Nginx cho bất kỳ ứng dụng nào cần web server / proxy bằng cách chuyển một dung lượng cấu hình, thay vì xây dựng lại hình ảnh.

Yêu cầu

  • Hiểu biết cơ bản về các đối tượng Kubernetes. Hãy xem bài viết Giới thiệu về Kubernetes của ta để biết thêm thông tin.
  • Một cụm Kubernetes chạy trên Ubuntu 16.04. Bạn có thể cài đặt điều này theo hướng dẫn Cách tạo cụm Kubernetes 1.10 bằng Kubeadm trên Ubuntu 16.04 .
  • Tài khoản DigitalOcean và mã thông báo truy cập API có quyền đọc và ghi để tạo dung lượng lưu trữ của ta . Nếu bạn không có mã thông báo truy cập API của bạn , bạn có thể tạo nó từ đây .
  • Mã ứng dụng của bạn được lưu trữ trên một URL có thể truy cập , chẳng hạn như Github .

Bước 1 - Tạo Dịch vụ PHP-FPM và Nginx

Trong bước này, bạn sẽ tạo các dịch vụ PHP-FPM và Nginx. Một dịch vụ cho phép truy cập vào một group các group từ bên trong cụm. Các dịch vụ trong một cụm có thể giao tiếp trực tiếp thông qua tên của chúng mà không cần địa chỉ IP. Dịch vụ PHP-FPM sẽ cho phép truy cập vào các group PHP-FPM, trong khi dịch vụ Nginx sẽ cho phép truy cập vào các group Nginx.

Vì các pod Nginx sẽ ủy quyền cho các pod PHP-FPM, bạn cần cho dịch vụ biết cách tìm chúng. Thay vì sử dụng địa chỉ IP, bạn sẽ tận dụng khả năng khám phá dịch vụ tự động của Kubernetes để sử dụng các tên có thể đọc được của con người để định tuyến các yêu cầu đến dịch vụ thích hợp.

Để tạo dịch vụ, bạn sẽ tạo một file định nghĩa đối tượng. Mọi định nghĩa đối tượng Kubernetes là một file YAML chứa ít nhất các mục sau:

  • apiVersion : Phiên bản của API Kubernetes mà định nghĩa thuộc về.
  • kind : Đối tượng Kubernetes mà file này đại diện. Ví dụ, một pod hoặc một service .
  • metadata : Cái này chứa name của đối tượng cùng với bất kỳ labels nào mà bạn có thể cần áp dụng cho nó.
  • spec : Điều này chứa một cấu hình cụ thể tùy thuộc vào loại đối tượng bạn đang tạo, chẳng hạn như containers images hoặc các cổng mà containers sẽ có thể truy cập từ đó.

Đầu tiên, bạn sẽ tạo một folder để chứa các định nghĩa đối tượng Kubernetes của bạn .

SSH vào nút chính của bạn và tạo folder definitions sẽ chứa các định nghĩa đối tượng Kubernetes của bạn.

  • mkdir definitions

Điều hướng đến folder definitions mới được tạo:

  • cd definitions

Tạo dịch vụ PHP-FPM của bạn bằng cách tạo file php_service.yaml :

  • nano php_service.yaml

Đặt kindService để chỉ định rằng đối tượng này là một dịch vụ:

php_service.yaml
... apiVersion: v1 kind: Service 

Đặt tên cho dịch vụ là php vì nó sẽ cung cấp quyền truy cập vào PHP-FPM:

php_service.yaml
... metadata:   name: php 

Bạn sẽ group các đối tượng khác nhau một cách hợp lý với các nhãn. Trong hướng dẫn này, bạn sẽ sử dụng các nhãn để group các đối tượng thành các "tầng", chẳng hạn như giao diện user hoặc backend . Các group PHP sẽ chạy sau dịch vụ này, vì vậy bạn sẽ gắn nhãn nó là tier: backend .

php_service.yaml
...   labels:     tier: backend 

Dịch vụ xác định group nào cần truy cập bằng cách sử dụng nhãn selector . Group phù hợp với các nhãn này sẽ được phục vụ, không phụ thuộc vào việc group được tạo trước hay sau dịch vụ. Bạn sẽ thêm nhãn cho các group của bạn ở phần sau trong hướng dẫn.

Sử dụng nhãn tier: backend để gán group vào tầng backend . Bạn cũng sẽ thêm nhãn app: php để chỉ định rằng group này chạy PHP. Thêm hai nhãn này sau phần metadata .

php_service.yaml
... spec:   selector:     app: php     tier: backend 

Tiếp theo, chỉ định cổng được sử dụng để truy cập dịch vụ này. Bạn sẽ sử dụng cổng 9000 trong hướng dẫn này. Thêm nó vào file php_service.yaml theo spec :

php_service.yaml
...   ports:     - protocol: TCP       port: 9000 

Tệp php_service.yaml đã hoàn thành của bạn sẽ giống như sau:

php_service.yaml
apiVersion: v1 kind: Service metadata:   name: php   labels:     tier: backend spec:   selector:     app: php     tier: backend   ports:   - protocol: TCP     port: 9000 

Nhấn CTRL + o để lưu file , sau đó nhấn CTRL + x để thoát nano .

Đến đây bạn đã tạo định nghĩa đối tượng cho dịch vụ của bạn , để chạy dịch vụ, bạn sẽ sử kubectl apply lệnh kubectl apply cùng với đối số -f và chỉ định file php_service.yaml của bạn.

Tạo dịch vụ của bạn:

  • kubectl apply -f php_service.yaml

Đầu ra này xác nhận việc tạo dịch vụ:

Output
service/php created

Xác minh dịch vụ của bạn đang chạy:

  • kubectl get svc

Bạn sẽ thấy dịch vụ PHP-FPM của bạn đang chạy:

Output
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 10m php ClusterIP 10.100.59.238 <none> 9000/TCP 5m

Có nhiều loại dịch vụ khác nhau mà Kubernetes hỗ trợ. Dịch vụ php của bạn sử dụng loại dịch vụ mặc định, ClusterIP . Loại dịch vụ này chỉ định một IP nội bộ và làm cho dịch vụ chỉ có thể truy cập được từ bên trong cụm.

Bây giờ dịch vụ PHP-FPM đã sẵn sàng, bạn sẽ tạo dịch vụ Nginx. Tạo và mở file mới có tên nginx_service.yaml bằng editor :

  • nano nginx_service.yaml

Dịch vụ này sẽ nhắm đến đến các pod Nginx, vì vậy bạn sẽ đặt tên nó là nginx . Bạn cũng sẽ thêm nhãn tier: backend vì nó thuộc về cấp backend:

nginx_service.yaml
apiVersion: v1 kind: Service metadata:   name: nginx   labels:     tier: backend 

Tương tự như dịch vụ php , hãy nhắm đến các group bằng app: nginx nhãn bộ chọn app: nginxtier: backend . Làm cho dịch vụ này có thể truy cập được trên cổng 80, cổng HTTP mặc định.

nginx_service.yaml
... spec:   selector:     app: nginx     tier: backend   ports:   - protocol: TCP     port: 80 

Dịch vụ Nginx sẽ có thể truy cập vào internet từ địa chỉ IP công cộng của Server. your_public_ip có thể được tìm thấy từ Control panel cloud DigitalOcean của bạn. Trong spec.externalIPs , hãy thêm:

nginx_service.yaml
... spec:   externalIPs:   - your_public_ip 

Tệp nginx_service.yaml của bạn sẽ giống như sau:

nginx_service.yaml
apiVersion: v1 kind: Service metadata:   name: nginx   labels:     tier: backend spec:   selector:     app: nginx     tier: backend   ports:   - protocol: TCP     port: 80   externalIPs:   - your_public_ip     

Lưu và đóng file . Tạo dịch vụ Nginx:

  • kubectl apply -f nginx_service.yaml

Bạn sẽ thấy kết quả sau khi dịch vụ đang chạy:

Output
service/nginx created

Bạn có thể xem tất cả các dịch vụ đang chạy bằng cách thực hiện:

  • kubectl get svc

Bạn sẽ thấy cả dịch vụ PHP-FPM và Nginx được liệt kê trong kết quả :

Output
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 13m nginx ClusterIP 10.102.160.47 your_public_ip 80/TCP 50s php ClusterIP 10.100.59.238 <none> 9000/TCP 8m

Xin lưu ý, nếu bạn muốn xóa một dịch vụ, bạn có thể chạy:

  • kubectl delete svc/service_name

Đến đây bạn đã tạo các dịch vụ PHP-FPM và Nginx, bạn cần chỉ định nơi lưu trữ mã ứng dụng và file cấu hình của bạn .

Bước 2 - Cài đặt Trình cắm lưu trữ DigitalOcean

Kubernetes cung cấp các plug-in lưu trữ khác nhau có thể tạo không gian lưu trữ cho môi trường của bạn. Trong bước này, bạn sẽ cài đặt plugin lưu trữ DigitalOcean để tạo lưu trữ khối trên DigitalOcean. Khi quá trình cài đặt hoàn tất, nó sẽ thêm một lớp lưu trữ có tên do-block-storage mà bạn sẽ sử dụng để tạo bộ nhớ khối của bạn .

Trước tiên, bạn sẽ cấu hình đối tượng Kubernetes Secret để lưu trữ mã thông báo API DigitalOcean của bạn . Các đối tượng bí mật được sử dụng để chia sẻ thông tin nhạy cảm, như khóa và password SSH, với các đối tượng Kubernetes khác trong cùng một không gian tên. Không gian tên cung cấp một cách để tách các đối tượng Kubernetes của bạn một cách hợp lý.

Mở file có tên secret.yaml bằng editor :

  • nano secret.yaml

Bạn sẽ đặt tên cho đối tượng Bí mật của bạn là digitalocean và thêm nó vào namespace kube-system . Không gian tên kube-system là không gian tên mặc định cho các dịch vụ nội bộ của Kubernetes và cũng được plugin lưu trữ DigitalOcean sử dụng để chạy các thành phần khác nhau.

secret.yaml
apiVersion: v1 kind: Secret metadata:   name: digitalocean   namespace: kube-system 

Thay vì khóa spec , Bí mật sử dụng khóa data hoặc stringData data để giữ thông tin cần thiết. Tham số data giữ dữ liệu được mã hóa base64 được tự động giải mã khi được truy xuất. Tham số stringData giữ dữ liệu không được mã hóa được mã hóa tự động trong quá trình tạo hoặc cập nhật và không xuất dữ liệu khi truy xuất Bí mật. Bạn sẽ sử dụng stringData trong hướng dẫn này để thuận tiện.

Thêm access-token dưới dạng stringData :

secret.yaml
... stringData:   access-token: your-api-token 

Lưu và thoát khỏi file .

Tệp secret.yaml của bạn sẽ trông như thế này:

secret.yaml
apiVersion: v1 kind: Secret metadata:   name: digitalocean   namespace: kube-system stringData:   access-token: your-api-token 

Tạo bí mật:

  • kubectl apply -f secret.yaml

Bạn sẽ thấy kết quả này khi tạo Bí mật:

Output
secret/digitalocean created

Bạn có thể xem bí mật bằng lệnh sau:

  • kubectl -n kube-system get secret digitalocean

Đầu ra sẽ giống như sau:

Output
NAME TYPE DATA AGE digitalocean Opaque 1 41s

Loại Opaque nghĩa là Bí mật này ở chế độ chỉ đọc, là tiêu chuẩn cho Bí mật stringData . Bạn có thể đọc thêm về nó trên Thông số kỹ thuật thiết kế bí mật . Trường DATA hiển thị số lượng mục được lưu trữ trong Bí mật này. Trong trường hợp này, nó hiển thị 1 vì bạn có một khóa duy nhất được lưu trữ.

Bây giờ, Bí mật của bạn đã sẵn sàng, hãy cài đặt plugin lưu trữ khối DigitalOcean :

  • kubectl apply -f https://raw.githubusercontent.com/digitalocean/csi-digitalocean/master/deploy/kubernetes/releases/csi-digitalocean-v0.3.0.yaml

Bạn sẽ thấy kết quả tương tự như sau:

Output
storageclass.storage.k8s.io/do-block-storage created serviceaccount/csi-attacher created clusterrole.rbac.authorization.k8s.io/external-attacher-runner created clusterrolebinding.rbac.authorization.k8s.io/csi-attacher-role created service/csi-attacher-doplug-in created statefulset.apps/csi-attacher-doplug-in created serviceaccount/csi-provisioner created clusterrole.rbac.authorization.k8s.io/external-provisioner-runner created clusterrolebinding.rbac.authorization.k8s.io/csi-provisioner-role created service/csi-provisioner-doplug-in created statefulset.apps/csi-provisioner-doplug-in created serviceaccount/csi-doplug-in created clusterrole.rbac.authorization.k8s.io/csi-doplug-in created clusterrolebinding.rbac.authorization.k8s.io/csi-doplug-in created daemonset.apps/csi-doplug-in created

Đến đây bạn đã cài đặt plugin lưu trữ DigitalOcean, bạn có thể tạo lưu trữ khối để giữ mã ứng dụng và file cấu hình của bạn .

Bước 3 - Tạo Ổ đĩa liên tục

Với Bí mật của bạn đã có sẵn và plugin lưu trữ khối được cài đặt, bây giờ bạn đã sẵn sàng để tạo Dung lượng liên tục của bạn . Dung lượng liên tục hay còn gọi là PV, là khối lưu trữ có kích thước cụ thể tồn tại độc lập với vòng đời của group . Việc sử dụng Ổ đĩa liên tục sẽ cho phép bạn quản lý hoặc cập nhật các group của bạn mà không lo bị mất mã ứng dụng. Một Dung lượng Cố định được truy cập bằng cách sử dụng PersistentVolumeClaim , hoặc PVC, gắn PV theo đường dẫn cần thiết.

Mở file có tên code_volume.yaml bằng editor :

  • nano code_volume.yaml

Đặt tên cho code PVC bằng cách thêm các thông số và giá trị sau vào file của bạn:

code_volume.yaml
apiVersion: v1 kind: PersistentVolumeClaim metadata:   name: code 

Thông spec cho một PVC bao gồm các mục sau:

  • accessModes thay đổi tùy theo trường hợp sử dụng. Đó là:
    • ReadWriteOnce - gắn dung lượng dưới dạng đọc-ghi bởi một nút duy nhất
    • ReadOnlyMany - mount tập dưới dạng chỉ đọc bởi nhiều nút
    • ReadWriteMany - gắn dung lượng dưới dạng đọc-ghi bởi nhiều nút
  • resources - không gian lưu trữ mà bạn yêu cầu

Bộ nhớ khối DigitalOcean chỉ được gắn vào một nút duy nhất, vì vậy bạn sẽ đặt các accessModes thành ReadWriteOnce . Hướng dẫn này sẽ hướng dẫn bạn thêm một lượng nhỏ mã ứng dụng, vì vậy 1GB sẽ rất nhiều trong trường hợp sử dụng này. Nếu bạn dự định lưu trữ một lượng lớn mã hoặc dữ liệu trên ổ đĩa, bạn có thể sửa đổi thông số storage để phù hợp với yêu cầu của bạn . Bạn có thể tăng dung lượng lưu trữ sau khi tạo dung lượng , nhưng việc thu nhỏ đĩa không được hỗ trợ.

code_volume.yaml
... spec:   accessModes:   - ReadWriteOnce   resources:     requests:       storage: 1Gi 

Tiếp theo, chỉ định lớp lưu trữ mà Kubernetes sẽ sử dụng để cung cấp các ổ đĩa. Bạn sẽ sử dụng lớp do-block-storage do plug-in lưu trữ khối DigitalOcean tạo.

code_volume.yaml
...   storageClassName: do-block-storage 

Tệp code_volume.yaml của bạn sẽ giống như sau:

code_volume.yaml
apiVersion: v1 kind: PersistentVolumeClaim metadata:   name: code spec:   accessModes:   - ReadWriteOnce   resources:     requests:       storage: 1Gi   storageClassName: do-block-storage 

Lưu và thoát khỏi file .

Tạo code kubectl bằng kubectl :

  • kubectl apply -f code_volume.yaml

Kết quả sau cho bạn biết rằng đối tượng đã được tạo thành công và bạn đã sẵn sàng để gắn PVC 1GB của bạn làm ổ đĩa.

Output
persistentvolumeclaim/code created

Để xem các tập liên tục có sẵn (PV):

  • kubectl get pv

Bạn sẽ thấy PV của bạn được liệt kê:

Output
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pvc-ca4df10f-ab8c-11e8-b89d-12331aa95b13 1Gi RWO Delete Bound default/code do-block-storage 2m

Các trường ở trên là tổng quan về file cấu hình của bạn, ngoại trừ Reclaim PolicyStatus . Reclaim Policy xác nhận quyền sở hữu xác định những gì được thực hiện với PV sau khi PVC truy cập nó bị xóa. Delete sẽ xóa PV khỏi Kubernetes cũng như cơ sở hạ tầng DigitalOcean. Bạn có thể tìm hiểu thêm về Reclaim PolicyStatus từ tài liệu PV Kubernetes .

Bạn đã tạo thành công một Dung lượng liên tục bằng cách sử dụng plugin lưu trữ khối DigitalOcean. Bây giờ Dung lượng liên tục của bạn đã sẵn sàng, bạn sẽ tạo group của bạn bằng cách sử dụng Triển khai.

Bước 4 - Tạo triển khai PHP-FPM

Trong bước này, bạn sẽ học cách sử dụng Triển khai để tạo group PHP-FPM. Việc triển khai cung cấp một cách thống nhất để tạo, cập nhật và quản lý các group bằng cách sử dụng ReplicaSets . Nếu bản cập nhật không hoạt động như mong đợi, Triển khai sẽ tự động khôi phục các group của nó về hình ảnh trước đó.

Khóa Deployment spec.selector sẽ liệt kê các nhãn của các group mà nó sẽ quản lý. Nó cũng sẽ sử dụng khóa template để tạo các group cần thiết.

Bước này cũng sẽ giới thiệu việc sử dụng Init Containers. Các containers Init chạy một hoặc nhiều lệnh trước các containers thông thường được chỉ định trong khóa template của group . Trong hướng dẫn này, Init Container của bạn sẽ tìm nạp một index.php mẫu từ GitHub Gist bằng cách sử dụng wget . Đây là nội dung của file mẫu:

index.php
<?php echo phpinfo();  

Để tạo Triển khai của bạn, hãy mở file mới có tên php_deployment.yaml bằng editor :

  • nano php_deployment.yaml

Triển khai này sẽ quản lý các group PHP-FPM của bạn, vì vậy bạn sẽ đặt tên cho đối tượng Triển khai là php . Các group thuộc về tầng backend , vì vậy bạn sẽ group Triển khai vào group này bằng cách sử dụng nhãn tier: backend :

php_deployment.yaml
apiVersion: apps/v1 kind: Deployment metadata:   name: php   labels:     tier: backend 

Đối với việc triển khai spec , bạn sẽ xác định có bao nhiêu bản sao của pod này để tạo ra bằng cách sử dụng các replicas tham số. Số lượng replicas sẽ khác nhau tùy thuộc vào nhu cầu của bạn và nguồn lực sẵn có. Bạn sẽ tạo một bản sao trong hướng dẫn này:

php_deployment.yaml
... spec:   replicas: 1 

Triển khai này sẽ quản lý các group trùng với nhãn app: phptier: backend . Dưới phím selector thêm:

php_deployment.yaml
...   selector:     matchLabels:       app: php       tier: backend 

Tiếp theo, Deployment spec yêu cầu template cho định nghĩa của đối tượng pod của bạn. Mẫu này sẽ xác định các thông số kỹ thuật để tạo group từ đó. Đầu tiên, bạn sẽ thêm các nhãn đã được chỉ định cho các selectors dịch vụ phpmatchLabels của Triển khai. Thêm app: phptier: backend dưới template.metadata.labels :

php_deployment.yaml
...   template:     metadata:       labels:         app: php         tier: backend 

Một group có thể có nhiều containers và dung lượng , nhưng mỗi vùng cần một tên. Bạn có thể gắn các ổ một cách chọn lọc vào một containers bằng cách chỉ định đường dẫn gắn cho mỗi ổ.

Trước tiên, hãy chỉ định các ổ mà containers của bạn sẽ truy cập. Bạn đã tạo một code có tên PVC để giữ mã ứng dụng của bạn , vì vậy hãy đặt tên cho code dung lượng này. Trong spec.template.spec.volumes , thêm thông tin sau:

php_deployment.yaml
...     spec:       volumes:       - name: code         persistentVolumeClaim:           claimName: code 

Tiếp theo, chỉ định containers bạn muốn chạy trong group này. Bạn có thể tìm thấy nhiều hình ảnh khác nhau trên cửa hàng Docker , nhưng trong hướng dẫn này, bạn sẽ sử dụng hình ảnh php:7-fpm .

Trong spec.template.spec.containers , hãy thêm thông tin sau:

php_deployment.yaml
...       containers:       - name: php         image: php:7-fpm 

Tiếp theo, bạn sẽ gắn các ổ đĩa mà containers yêu cầu quyền truy cập. Vùng chứa này sẽ chạy mã PHP của bạn, vì vậy nó cần quyền truy cập vào dung lượng code . Bạn cũng sẽ sử dụng mountPath để chỉ định /code làm điểm mount .

Trong spec.template.spec.containers.volumeMounts , hãy thêm:

php_deployment.yaml
...         volumeMounts:         - name: code           mountPath: /code 

Đến đây bạn đã gắn ổ đĩa của bạn , bạn cần lấy mã ứng dụng của bạn trên ổ đĩa. Trước đây bạn có thể đã sử dụng FTP / SFTP hoặc sao chép mã qua kết nối SSH để thực hiện việc này, nhưng bước này sẽ chỉ cho bạn cách sao chép mã bằng Init Container.

Tùy thuộc vào mức độ phức tạp của quá trình cài đặt , bạn có thể sử dụng một initContainer duy nhất để chạy một tập lệnh xây dựng ứng dụng của bạn hoặc bạn có thể sử dụng một initContainer cho mỗi lệnh. Đảm bảo rằng các ổ đĩa được gắn vào initContainer .

Trong hướng dẫn này, bạn sẽ sử dụng một Init Container duy nhất với busybox để download mã. busybox là một hình ảnh nhỏ chứa tiện ích wget mà bạn sẽ sử dụng để thực hiện việc này.

Dưới spec.template.spec , thêm bạn initContainer và chỉ định busybox hình ảnh:

php_deployment.yaml
...       initContainers:       - name: install         image: busybox 

Init Container của bạn cần quyền truy cập vào dung lượng code để nó có thể download mã ở vị trí đó. Trong spec.template.spec.initContainers , hãy gắn code ổ đĩa tại đường dẫn /code :

php_deployment.yaml
...         volumeMounts:         - name: code           mountPath: /code 

Mỗi Init Container cần chạy một command . Init Container của bạn sẽ sử dụng wget để tải từ Github vào folder làm việc /code . Tùy chọn -O đặt tên cho file đã download và bạn sẽ đặt tên file này là index.php .

Lưu ý: Đảm bảo tin tưởng mã bạn đang lấy. Trước khi kéo nó đến server của bạn, hãy kiểm tra mã nguồn đảm bảo bạn thấy phù hợp với những gì mã thực hiện.

Bên dưới containers install trong spec.template.spec.initContainers , hãy thêm các dòng sau:

php_deployment.yaml
...         command:         - wget         - "-O"         - "/code/index.php"         - https://raw.githubusercontent.com/do-community/php-kubernetes/master/index.php 

Tệp php_deployment.yaml đã hoàn thành của bạn sẽ trông giống như sau:

php_deployment.yaml
apiVersion: apps/v1 kind: Deployment metadata:   name: php   labels:     tier: backend spec:   replicas: 1   selector:     matchLabels:       app: php       tier: backend   template:     metadata:       labels:         app: php         tier: backend     spec:       volumes:       - name: code         persistentVolumeClaim:           claimName: code       containers:       - name: php         image: php:7-fpm         volumeMounts:         - name: code           mountPath: /code       initContainers:       - name: install         image: busybox         volumeMounts:         - name: code           mountPath: /code         command:         - wget         - "-O"         - "/code/index.php"         - https://raw.githubusercontent.com/do-community/php-kubernetes/master/index.php 

Lưu file và thoát khỏi editor .

Tạo triển khai PHP-FPM với kubectl :

  • kubectl apply -f php_deployment.yaml

Bạn sẽ thấy kết quả sau khi tạo Triển khai:

Output
deployment.apps/php created

Tóm lại, Triển khai này sẽ bắt đầu bằng cách download các hình ảnh được chỉ định. Sau đó, nó sẽ yêu cầu PersistentVolume từ PersistentVolumeClaim của bạn và chạy initContainers của bạn. Sau khi hoàn tất, các containers sẽ chạy và gắn các volumes vào điểm mount được chỉ định. Khi tất cả các bước này hoàn tất, group của bạn sẽ được cài đặt và chạy.

Bạn có thể xem Triển khai của bạn bằng lệnh:

  • kubectl get deployments

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

Output
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE php 1 1 1 0 19s

Kết quả này có thể giúp bạn hiểu trạng thái hiện tại của Triển khai. Deploymentmột trong những bộ điều khiển duy trì trạng thái mong muốn. template bạn đã tạo chỉ định rằng trạng thái DESIRED sẽ có 1 replicas của group có tên php . Trường CURRENT cho biết có bao nhiêu bản sao đang chạy, vì vậy trường này phải trùng với trạng thái DESIRED . Bạn có thể đọc về các trường còn lại trong tài liệu Triển khai Kubernetes .

Bạn có thể xem các group mà Triển khai này đã bắt đầu bằng lệnh sau:

  • kubectl get pods

Đầu ra của lệnh này thay đổi tùy thuộc vào khoảng thời gian đã trôi qua kể từ khi tạo Triển khai. Nếu bạn chạy nó ngay sau khi tạo, kết quả có thể sẽ giống như sau:

Output
NAME READY STATUS RESTARTS AGE php-86d59fd666-bf8zd 0/1 Init:0/1 0 9s

Các cột thể hiện thông tin sau:

  • Ready : Số lượng replicas đang chạy group này.
  • Status : Trạng thái của vỏ. Init cho biết Init Containers đang chạy. Trong kết quả này, 0 trong số 1 Init Containers đã chạy xong.
  • Restarts : Quá trình này đã khởi động lại bao nhiêu lần để bắt đầu group . Con số này sẽ tăng lên nếu bất kỳ Init Container nào của bạn bị lỗi. Triển khai sẽ khởi động lại nó cho đến khi nó đạt đến trạng thái mong muốn.

Tùy thuộc vào mức độ phức tạp của các tập lệnh khởi động của bạn, có thể mất vài phút để trạng thái chuyển thành podInitializing :

Output
NAME READY STATUS RESTARTS AGE php-86d59fd666-lkwgn 0/1 podInitializing 0 39s

Điều này nghĩa là Init Containers đã hoàn thành và các container đang khởi tạo. Nếu bạn chạy lệnh khi tất cả các containers đang chạy, bạn sẽ thấy trạng thái group thay đổi thành Running .

Output
NAME READY STATUS RESTARTS AGE php-86d59fd666-lkwgn 1/1 Running 0 1m

Đến đây bạn thấy rằng group của bạn đang chạy thành công. Nếu group của bạn không bắt đầu, bạn có thể gỡ lỗi bằng các lệnh sau:

  • Xem thông tin chi tiết của một group :
  • kubectl describe pods pod-name
  • Xem log được tạo bởi một group :
  • kubectl logs pod-name
  • Xem log cho một containers cụ thể trong một group :
  • kubectl logs pod-name container-name

Mã ứng dụng của bạn đã được mount và dịch vụ PHP-FPM hiện đã sẵn sàng để xử lý các kết nối. Đến đây bạn có thể tạo Triển khai Nginx của bạn .

Bước 5 - Tạo triển khai Nginx

Trong bước này, bạn sẽ sử dụng ConfigMap để cấu hình Nginx. Bản đồ cấu hình giữ cấu hình của bạn ở định dạng key-value mà bạn có thể tham chiếu trong các định nghĩa đối tượng Kubernetes khác. Cách tiếp cận này sẽ cho phép bạn sử dụng lại hoặc swap hình ảnh với một version Nginx khác nếu cần. Việc cập nhật Bản đồ cấu hình sẽ tự động sao chép các thay đổi đối với bất kỳ group nào gắn nó.

Tạo file nginx_configMap.yaml cho Bản đồ cấu hình của bạn bằng editor :

  • nano nginx_configMap.yaml

Đặt tên cho ConfigMap nginx-config và group nó vào tier: backend micro-service:

nginx_configMap.yaml
apiVersion: v1 kind: ConfigMap metadata:   name: nginx-config   labels:     tier: backend 

Tiếp theo, bạn sẽ thêm data cho Bản đồ cấu hình. Đặt tên cho config khóa và thêm nội dung của file cấu hình Nginx của bạn làm giá trị. Bạn có thể sử dụng cấu hình Nginx mẫu từ hướng dẫn này .

Vì Kubernetes có thể định tuyến các yêu cầu đến server thích hợp cho một dịch vụ, nên bạn có thể nhập tên của dịch vụ PHP-FPM của bạn vào tham số fastcgi_pass thay vì địa chỉ IP của nó. Thêm phần sau vào file nginx_configMap.yaml của bạn:

nginx_configMap.yaml
... data:   config : |     server {       index index.php index.html;       error_log  /var/log/nginx/error.log;       access_log /var/log/nginx/access.log;       root ^/code^;        location / {           try_files $uri $uri/ /index.php?$query_string;       }        location ~ \.php$ {           try_files $uri =404;           fastcgi_split_path_info ^(.+\.php)(/.+)$;           fastcgi_pass php:9000;           fastcgi_index index.php;           include fastcgi_params;           fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;           fastcgi_param PATH_INFO $fastcgi_path_info;         }     } 

Tệp nginx_configMap.yaml của bạn sẽ giống như sau:

nginx_configMap.yaml
apiVersion: v1 kind: ConfigMap metadata:   name: nginx-config   labels:     tier: backend data:   config : |     server {       index index.php index.html;       error_log  /var/log/nginx/error.log;       access_log /var/log/nginx/access.log;       root /code;        location / {           try_files $uri $uri/ /index.php?$query_string;       }        location ~ \.php$ {           try_files $uri =404;           fastcgi_split_path_info ^(.+\.php)(/.+)$;           fastcgi_pass php:9000;           fastcgi_index index.php;           include fastcgi_params;           fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;           fastcgi_param PATH_INFO $fastcgi_path_info;         }     } 

Lưu file và thoát khỏi editor .

Tạo Bản đồ cấu hình:

  • kubectl apply -f nginx_configMap.yaml

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

Output
configmap/nginx-config created

Bạn đã hoàn thành việc tạo Bản đồ cấu hình của bạn và bây giờ có thể xây dựng Triển khai Nginx của bạn .

Bắt đầu bằng cách mở file nginx_deployment.yaml mới trong editor :

  • nano nginx_deployment.yaml

Đặt tên cho Deployment nginx và thêm tier: backend nhãn tier: backend :

nginx_deployment.yaml
apiVersion: apps/v1 kind: Deployment metadata:   name: nginx   labels:     tier: backend 

Xác định rằng bạn muốn một replicas trong Deployment spec . Triển khai này sẽ quản lý các group với app: nginx nhãn app: nginxtier: backend . Thêm các tham số và giá trị sau:

nginx_deployment.yaml
... spec:   replicas: 1   selector:     matchLabels:       app: nginx       tier: backend 

Tiếp theo, thêm template group . Bạn cần sử dụng cùng một nhãn mà bạn đã thêm cho Deployment selector.matchLabels . Thêm những điều sau:

nginx_deployment.yaml
...   template:     metadata:       labels:         app: nginx         tier: backend 

Cấp cho Nginx quyền truy cập vào code PVC mà bạn đã tạo trước đó. Trong spec.template.spec.volumes , hãy thêm:

nginx_deployment.yaml
...     spec:       volumes:       - name: code         persistentVolumeClaim:           claimName: code 

Các group có thể gắn một Bản đồ cấu hình dưới dạng một ổ đĩa. Chỉ định tên file và khóa sẽ tạo ra một file với giá trị của nó là nội dung. Để sử dụng Bản đồ cấu hình, hãy đặt path đến tên của file sẽ chứa nội dung của key . Bạn muốn tạo một file site.conf từ config khóa. Trong spec.template.spec.volumes , thêm thông tin sau:

nginx_deployment.yaml
...       - name: config         configMap:           name: nginx-config           items:           - key: config             path: site.conf 

Cảnh báo : Nếu file không được chỉ định, nội dung của key sẽ thay thế mountPath của ổ đĩa. Điều này nghĩa là nếu một đường dẫn không được chỉ định rõ ràng, bạn sẽ mất tất cả nội dung trong folder đích.

Tiếp theo, bạn sẽ chỉ định hình ảnh để tạo group của bạn. Hướng dẫn này sẽ sử dụng hình ảnh nginx:1.7.9 để ổn định, nhưng bạn có thể tìm thấy các hình ảnh Nginx khác trên cửa hàng Docker . Ngoài ra, cung cấp Nginx trên cổng 80. Trong spec.template.spec thêm:

nginx_deployment.yaml
...       containers:       - name: nginx         image: nginx:1.7.9         ports:         - containerPort: 80 

Nginx và PHP-FPM cần truy cập file theo cùng một đường dẫn, vì vậy hãy gắn dung lượng code tại /code :

nginx_deployment.yaml
...         volumeMounts:         - name: code           mountPath: /code 

Các nginx:1.7.9 hình ảnh sẽ tự động tải bất kỳ file cấu hình dưới /etc/nginx/conf.d folder . Gắn dung lượng config trong folder này sẽ tạo file /etc/nginx/conf.d/site.conf . Trong volumeMounts thêm những thứ sau:

nginx_deployment.yaml
...         - name: config           mountPath: /etc/nginx/conf.d 

Tệp nginx_deployment.yaml của bạn sẽ giống như sau:

nginx_deployment.yaml
apiVersion: apps/v1 kind: Deployment metadata:   name: nginx   labels:     tier: backend spec:   replicas: 1   selector:     matchLabels:       app: nginx       tier: backend   template:     metadata:       labels:         app: nginx         tier: backend     spec:       volumes:       - name: code         persistentVolumeClaim:           claimName: code       - name: config         configMap:           name: nginx-config           items:           - key: config             path: site.conf       containers:       - name: nginx         image: nginx:1.7.9         ports:         - containerPort: 80         volumeMounts:         - name: code           mountPath: /code         - name: config           mountPath: /etc/nginx/conf.d 

Lưu file và thoát khỏi editor .

Tạo triển khai Nginx:

  • kubectl apply -f nginx_deployment.yaml

Kết quả sau cho biết rằng Triển khai của bạn hiện đã được tạo:

Output
deployment.apps/nginx created

Liệt kê các Triển khai của bạn bằng lệnh này:

  • kubectl get deployments

Bạn sẽ thấy Triển khai Nginx và PHP-FPM:

Output
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE nginx 1 1 1 0 16s php 1 1 1 1 7m

Liệt kê các group được quản lý bởi cả hai Triển khai:

  • kubectl get pods

Bạn sẽ thấy các group đang chạy:

Output
NAME READY STATUS RESTARTS AGE nginx-7bf5476b6f-zppml 1/1 Running 0 32s php-86d59fd666-lkwgn 1/1 Running 0 7m

Bây giờ tất cả các đối tượng Kubernetes đang hoạt động, bạn có thể truy cập dịch vụ Nginx trên trình duyệt của bạn .

Liệt kê các dịch vụ đang chạy:

  • kubectl get services -o wide

Nhận IP bên ngoài cho dịch vụ Nginx của bạn:

Output
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 39m <none> nginx ClusterIP 10.102.160.47 your_public_ip 80/TCP 27m app=nginx,tier=backend php ClusterIP 10.100.59.238 <none> 9000/TCP 34m app=php,tier=backend

Trên trình duyệt của bạn, hãy truy cập server của bạn bằng lệnh vào http:// your_public_ip . Bạn sẽ thấy kết quả của php_info() và đã xác nhận các dịch vụ Kubernetes của bạn đang hoạt động.

Kết luận

Trong hướng dẫn này, bạn đã chứa các dịch vụ PHP-FPM và Nginx để bạn có thể quản lý chúng một cách độc lập. Cách tiếp cận này sẽ không chỉ cải thiện khả năng mở rộng dự án của bạn khi bạn phát triển mà còn cho phép bạn sử dụng hiệu quả các nguồn lực. Bạn cũng đã lưu trữ mã ứng dụng của bạn trên một ổ đĩa để bạn có thể dễ dàng cập nhật các dịch vụ của bạn trong tương lai.


Tags:

Các tin liên quan

Cách tạo địa chỉ kỹ thuật số ngắn và duy nhất cho bất kỳ vị trí nào bằng AngularJS và PHP
2018-08-16
Cách thay đổi cài đặt PHP của bạn trên Ubuntu 14.04
2016-03-25
Cách thiết lập XHProf và XHGui để lập profile ứng dụng PHP trên Ubuntu 14.04
2016-02-19
Cách nâng cấp lên PHP 7 trên CentOS 7
2016-01-14
Cách nâng cấp lên PHP 7 trên Ubuntu 14.04
2015-12-15
Cách triển khai nhiều ứng dụng PHP bằng Ansible trên Ubuntu 14.04
2015-06-28
Cách triển khai ứng dụng PHP nâng cao bằng Ansible trên Ubuntu 14.04
2015-06-02
Cách triển khai một ứng dụng PHP cơ bản bằng Ansible trên Ubuntu 14.04
2015-04-14
Cách chia sẻ các phiên PHP trên nhiều server Memcached trên Ubuntu 14.04
2014-07-22
Cách sử dụng Framework PHP miễn phí béo
2014-03-06