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ộtpod
hoặc mộtservice
. -
metadata
: Cái này chứaname
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 kind
là Service
để chỉ định rằng đối tượng này là một dịch vụ:
... 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:
... 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
.
... 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
.
... 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
:
... ports: - protocol: TCP port: 9000
Tệp php_service.yaml
đã hoàn thành của bạn sẽ giống như sau:
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ụ:
Outputservice/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:
OutputNAME 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:
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: nginx
và tier: 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.
... 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:
... spec: externalIPs: - your_public_ip
Tệp nginx_service.yaml
của bạn sẽ giống như sau:
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:
Outputservice/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ả :
OutputNAME 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.
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
:
... 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:
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:
Outputsecret/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:
OutputNAME 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:
Outputstorageclass.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:
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ợ.
... 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.
... storageClassName: do-block-storage
Tệp code_volume.yaml
của bạn sẽ giống như sau:
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.
Outputpersistentvolumeclaim/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ê:
OutputNAME 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 Policy
và Status
. 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 Policy
và Status
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:
<?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
:
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:
... spec: replicas: 1
Triển khai này sẽ quản lý các group trùng với nhãn app: php
và tier: backend
. Dưới phím selector
thêm:
... 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ụ php
và matchLabels
của Triển khai. Thêm app: php
và tier: backend
dưới template.metadata.labels
:
... 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:
... 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:
... 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:
... 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:
... 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
:
... 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 mã 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:
... 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:
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:
Outputdeployment.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ả :
OutputNAME 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. Deployment
là mộ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:
OutputNAME 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ượngreplicas
đ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
:
OutputNAME 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
.
OutputNAME 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:
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:
... 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:
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:
Outputconfigmap/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
:
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: nginx
và tier: backend
. Thêm các tham số và giá trị sau:
... 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:
... 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:
... 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:
... - 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:
... 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
:
... 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:
... - name: config mountPath: /etc/nginx/conf.d
Tệp nginx_deployment.yaml
của bạn sẽ giống như sau:
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:
Outputdeployment.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:
OutputNAME 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:
OutputNAME 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:
OutputNAME 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.
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à PHP2018-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