Как развернуть приложение PHP с Kubernetes в Ubuntu 18.04

Автор выбрал Electronic Frontier Foundation для получения пожертвования в рамках Write for DOnations program.

Вступление

Kubernetes - это система оркестровки контейнеров с открытым исходным кодом. Он позволяет создавать, обновлять и масштабировать контейнеры, не беспокоясь о времени простоя.

Для запуска приложения PHP Nginx выступает в роли прокси-сервера для PHP-FPM. Хранение этой настройки в одном контейнере может быть трудоемким процессом, но Kubernetes поможет управлять обеими службами в отдельных контейнерах. Использование Kubernetes позволит вам сохранять контейнеры для повторного использования и замены, и вам не нужно будет перестраивать свой контейнерный образ каждый раз, когда появляется новая версия Nginx или PHP.

В этом руководстве вы развернете приложение PHP 7 в кластере Kubernetes с Nginx и PHP-FPM, работающими в отдельных контейнерах. Вы также узнаете, как сохранить свои файлы конфигурации и код приложения вне образа контейнера, используя систему DigitalOcean’s Block Storage. Этот подход позволит вам повторно использовать образ Nginx для любого приложения, которому требуется веб / прокси-сервер, передавая том конфигурации, а не перестраивая образ.

Предпосылки

Шаг 1 - Создание служб PHP-FPM и Nginx

На этом шаге вы создадите службы PHP-FPM и Nginx. Служба позволяет получить доступ к набору модулей из кластера. Службы в кластере могут связываться напрямую через свои имена без необходимости использования IP-адресов. Служба PHP-FPM разрешит доступ к модулям PHP-FPM, а служба Nginx разрешит доступ к модулям Nginx.

Поскольку модули Nginx проксируют модули PHP-FPM, вам необходимо сообщить службе, как их найти. Вместо использования IP-адресов вы воспользуетесь автоматическим обнаружением службы в Kubernetes, чтобы использовать удобочитаемые имена для направления запросов в соответствующую службу.

Чтобы создать сервис, вы создадите файл определения объекта. Каждое определение объекта Kubernetes представляет собой файл YAML, который содержит как минимум следующие элементы:

  • + apiVersion +: версия API Kubernetes, к которой относится это определение.

  • + kind +: объект Kubernetes, который представляет этот файл. Например, + pod или` + service`.

  • + metadata +: содержит + name + объекта и любые + метки +, которые вы можете применить к нему.

  • + spec +: содержит конкретную конфигурацию в зависимости от типа создаваемого вами объекта, например, образа контейнера или портов, с которых контейнер будет доступен.

Сначала вы создадите каталог для хранения определений ваших объектов Kubernetes.

SSH к вашему * главному узлу * и создайте каталог + Definitions +, в котором будут храниться ваши определения объектов Kubernetes.

mkdir definitions

Перейдите во вновь созданный каталог + Definitions +:

cd definitions

Создайте службу PHP-FPM, создав файл + php_service.yaml +:

nano php_service.yaml

Установите + kind + как + Service +, чтобы указать, что этот объект является службой:

php_service.yaml

apiVersion: v1
kind: Service

Назовите сервис + php +, поскольку он предоставит доступ к PHP-FPM:

php_service.yaml

...
metadata:
 name: php

Вы будете логически группировать различные объекты с метками. В этом уроке вы будете использовать метки для группировки объектов по «уровням», таким как внешний интерфейс или внутренний интерфейс. PHP-модули будут работать за этим сервисом, поэтому вы пометите его как + tier: backend +.

php_service.yaml

...
 labels:
   tier: backend

Сервис определяет, к каким модулям обращаться, используя метки + selector +. Модуль, соответствующий этим меткам, будет обслуживаться независимо от того, был ли модуль создан до или после обслуживания. Вы добавите ярлыки для ваших модулей позже в этом уроке.

Используйте метку + tier: backend +, чтобы назначить модуль на внутренний уровень. Вы также добавите метку + app: php +, чтобы указать, что этот модуль запускает PHP. Добавьте эти две метки после раздела + metadata +.

php_service.yaml

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

Далее укажите порт, используемый для доступа к этому сервису. Вы будете использовать порт + 9000 + в этом уроке. Добавьте его в файл + php_service.yaml + в + spec +:

php_service.yaml

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

Ваш завершенный файл + php_service.yaml + будет выглядеть так:

php_service.yaml

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

Нажмите + CTRL + O +, чтобы сохранить файл, а затем + CTRL + X, чтобы выйти из` + nano`.

Теперь, когда вы создали определение объекта для своего сервиса, для запуска сервиса вы будете использовать команду + kubectl apply + вместе с аргументом + -f + и укажите свой файл + php_service.yaml +.

Создайте свой сервис:

kubectl apply -f php_service.yaml

Эти выходные данные подтверждают создание сервиса:

Outputservice/php created

Убедитесь, что ваш сервис работает:

kubectl get svc

Вы увидите, что ваш сервис PHP-FPM работает:

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

Существует несколько типов service, которые поддерживает Kubernetes. Ваш сервис + php использует тип сервиса по умолчанию,` + ClusterIP`. Этот тип сервиса назначает внутренний IP и делает сервис доступным только внутри кластера.

Теперь, когда служба PHP-FPM готова, вы создадите службу Nginx. Создайте и откройте новый файл с именем + nginx_service.yaml + в редакторе:

nano nginx_service.yaml

Этот сервис будет нацелен на модули Nginx, поэтому вы назовете его + nginx +. Вы также добавите метку + tier: backend +, так как она принадлежит к внутреннему уровню:

nginx_service.yaml

apiVersion: v1
kind: Service
metadata:
 name: nginx
 labels:
   tier: backend

Подобно сервису + php +, предназначайтесь для модулей с помощью селекторных меток + app: nginx и` + tier: backend`. Сделайте этот сервис доступным через порт + 80 +, порт HTTP по умолчанию.

nginx_service.yaml

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

Служба Nginx будет общедоступна в Интернете с публичного IP-адреса вашего Droplet. «+» можно найти на вашем https://cloud.digitalocean.com [Панель управления DigitalOcean]. Под ` spec.externalIPs +` добавьте:

nginx_service.yaml

...
spec:
 externalIPs:
 -

Ваш файл + nginx_service.yaml + будет выглядеть так:

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:
 -

Сохраните и закройте файл. Создайте сервис Nginx:

kubectl apply -f nginx_service.yaml

Вы увидите следующий вывод при запуске службы:

Outputservice/nginx created

Вы можете просмотреть все запущенные сервисы, выполнив:

kubectl get svc

В выводе вы увидите службы PHP-FPM и Nginx:

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    80/TCP     50s
php          ClusterIP   10.100.59.238   <none>        9000/TCP   8m

Обратите внимание, что если вы хотите удалить сервис, вы можете запустить:

kubectl delete svc/

Теперь, когда вы создали службы PHP-FPM и Nginx, вам нужно будет указать, где хранить код приложения и файлы конфигурации.

Шаг 2 - Установка подключаемого модуля DigitalOcean Storage

Kubernetes предоставляет различные подключаемые модули хранения, которые могут создать пространство для хранения в вашей среде. На этом этапе вы установите плагин хранилища DigitalOcean для создания block storage в DigitalOcean. , После завершения установки он добавит класс хранилища с именем + do-block-storage, который вы будете использовать для создания блочного хранилища.

Сначала вы настроите объект секрета Kubernetes для хранения вашего токена API DigitalOcean. Секретные объекты используются для обмена конфиденциальной информацией, такой как ключи и пароли SSH, с другими объектами Kubernetes в том же пространстве имен. Пространства имен предоставляют способ логически разделить ваши объекты Kubernetes.

Откройте файл с именем + secret.yaml + в редакторе:

nano secret.yaml

Вы назовете свой секретный объект + digitalocean и добавите его в пространство имен` + kube-system`. Пространство имен + kube-system + является пространством имен по умолчанию для внутренних служб Kubernetes, а также используется подключаемым модулем хранения DigitalOcean для запуска различных компонентов.

secret.yaml

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

Вместо ключа + spec + Секрет использует ключ + data или` + string Data` для хранения необходимой информации. Параметр + data + содержит данные в кодировке base64, которые автоматически извлекаются при извлечении. Параметр + stringData + содержит некодированные данные, которые автоматически кодируются при создании или обновлении, и не выводит данные при получении секретов. Вы будете использовать + stringData + в этом руководстве для удобства.

Добавьте + access-token как` + string Data`:

secret.yaml

...
stringData:
 access-token:

Сохраните и выйдите из файла.

Ваш файл + secret.yaml + будет выглядеть так:

secret.yaml

apiVersion: v1
kind: Secret
metadata:
 name: digitalocean
 namespace: kube-system
stringData:
 access-token:

Создать секрет:

kubectl apply -f secret.yaml

Вы увидите этот вывод при создании Secret:

Outputsecret/digitalocean created

Вы можете просмотреть секрет с помощью следующей команды:

kubectl -n kube-system get secret digitalocean

Вывод будет выглядеть примерно так:

OutputNAME           TYPE      DATA      AGE
digitalocean   Opaque    1         41s

Тип + Opaque + означает, что этот секрет доступен только для чтения, что является стандартным для секретов + stringData +. Вы можете прочитать больше об этом в Secret design spec. Поле + DATA + показывает количество элементов, хранящихся в этом секрете. В этом случае он показывает «+ 1 +», потому что у вас хранится один ключ.

Теперь, когда ваш секрет на месте, установите плагин DigitalOcean для хранения блоков:

kubectl apply -f https://raw.githubusercontent.com/digitalocean/csi-digitalocean/master/deploy/kubernetes/releases/csi-digitalocean-v1.1.0.yaml

Вы увидите вывод, похожий на следующий:

Outputcsidriver.storage.k8s.io/dobs.csi.digitalocean.com created
customresourcedefinition.apiextensions.k8s.io/volumesnapshotclasses.snapshot.storage.k8s.io created
customresourcedefinition.apiextensions.k8s.io/volumesnapshotcontents.snapshot.storage.k8s.io created
customresourcedefinition.apiextensions.k8s.io/volumesnapshots.snapshot.storage.k8s.io created
storageclass.storage.k8s.io/do-block-storage created
statefulset.apps/csi-do-controller created
serviceaccount/csi-do-controller-sa created
clusterrole.rbac.authorization.k8s.io/csi-do-provisioner-role created
clusterrolebinding.rbac.authorization.k8s.io/csi-do-provisioner-binding created
clusterrole.rbac.authorization.k8s.io/csi-do-attacher-role created
clusterrolebinding.rbac.authorization.k8s.io/csi-do-attacher-binding created
clusterrole.rbac.authorization.k8s.io/csi-do-snapshotter-role created
clusterrolebinding.rbac.authorization.k8s.io/csi-do-snapshotter-binding created
daemonset.apps/csi-do-node created
serviceaccount/csi-do-node-sa created
clusterrole.rbac.authorization.k8s.io/csi-do-node-driver-registrar-role created
clusterrolebinding.rbac.authorization.k8s.io/csi-do-node-driver-registrar-binding created
error: unable to recognize "https://raw.githubusercontent.com/digitalocean/csi-digitalocean/master/deploy/kubernetes/releases/csi-digitalocean-v1.1.0.yaml": no matches for kind "VolumeSnapshotClass" in version "snapshot.storage.k8s.io/v1alpha1"

Для этого урока безопасно игнорировать ошибки.

Теперь, когда вы установили подключаемый модуль хранилища DigitalOcean, вы можете создать блочное хранилище для хранения кода приложения и файлов конфигурации.

Шаг 3 - Создание постоянного тома

С вашим секретом на месте и установленным модулем хранения блоков вы готовы к созданию Persistent Volume. Постоянный том, или PV, - это блочное хранилище указанного размера, которое живет независимо от жизненного цикла модуля. Использование постоянного тома позволит вам управлять модулями или обновлять их, не беспокоясь о потере кода приложения. Доступ к постоянным томам осуществляется с помощью + PersistentVolumeClaim + или PVC, который монтирует PV по требуемому пути.

Откройте файл с именем + code_volume.yaml + в вашем редакторе:

nano code_volume.yaml

Назовите PVC + code +, добавив в ваш файл следующие параметры и значения:

code_volume.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
 name: code

+ Spec + для PVC содержит следующие элементы:

  • + accessModes +, которые зависят от варианта использования. Это:

  • + ReadWriteOnce + - монтирует том как чтение-запись одним узлом

  • + ReadOnlyMany + - монтирует том как доступный только для чтения многими узлами

  • + ReadWriteMany + - монтирует том как чтение-запись многими узлами

  • + resources + - требуемое место для хранения

Хранилище блоков DigitalOcean монтируется только к одному узлу, поэтому вы установите для + accessModes + значение + ReadWriteOnce +. Это руководство поможет вам добавить небольшое количество кода приложения, поэтому в этом случае будет достаточно 1 ГБ. Если вы планируете хранить больший объем кода или данных на томе, вы можете изменить параметр + storage + в соответствии с вашими требованиями. Вы можете увеличить объем памяти после создания тома, но сжатие диска не поддерживается.

code_volume.yaml

...
spec:
 accessModes:
 - ReadWriteOnce
 resources:
   requests:
     storage:

Затем укажите класс хранения, который Kubernetes будет использовать для предоставления томов. Вы будете использовать класс + do-block-storage +, созданный модулем блочного хранилища DigitalOcean.

code_volume.yaml

...
 storageClassName: do-block-storage

Ваш файл + code_volume.yaml + будет выглядеть так:

code_volume.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
 name: code
spec:
 accessModes:
 - ReadWriteOnce
 resources:
   requests:
     storage:
 storageClassName: do-block-storage

Сохраните и выйдите из файла.

Создайте + код PVC с помощью` + kubectl`:

kubectl apply -f code_volume.yaml

Следующий вывод сообщает вам, что объект был успешно создан, и вы готовы смонтировать PVC объемом 1 ГБ в качестве тома.

Outputpersistentvolumeclaim/code created

Чтобы просмотреть доступные постоянные тома (PV):

kubectl get pv

Вы увидите свой PV в списке:

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

Поля выше представляют собой обзор вашего файла конфигурации, за исключением + Reclaim Policy + и + Status +. Политика + Reclaim определяет, что будет сделано с PV после удаления доступа к нему. + Delete + удаляет PV из Kubernetes, а также инфраструктуру DigitalOcean. Вы можете узнать больше о + Reclaim Policy + и + Status + из Kubernetes PV документации.

Вы успешно создали постоянный том с помощью подключаемого модуля блочного хранилища DigitalOcean. Теперь, когда ваш Persistent Volume готов, вы создадите свои модули, используя Deployment.

Шаг 4 - Создание развертывания PHP-FPM

На этом шаге вы узнаете, как использовать Deployment для создания вашего модуля PHP-FPM. Развертывания предоставляют универсальный способ создания, обновления и управления модулями с помощью ReplicaSets. Если обновление не работает должным образом, при развертывании автоматически выполняется откат его модулей до предыдущего образа.

Ключ Deployment + spec.selector + выведет список ярлыков модулей, которыми он будет управлять. Он также будет использовать ключ + template + для создания необходимых модулей.

Этот шаг также представит использование Init Containers. Init Containers запускает одну или несколько команд перед обычными контейнерами, указанными под ключом + template + модуля. В этом руководстве ваш контейнер Init будет извлекать пример файла + index.php + из https://gist.github.com [GitHub Gist], используя + wget +. Это содержимое файла примера:

index.php

<?php
echo phpinfo();

Чтобы создать ваше развертывание, откройте новый файл с именем + php_deployment.yaml + в вашем редакторе:

nano php_deployment.yaml

Это Deployment будет управлять вашими модулями PHP-FPM, поэтому вы назовете объект Deployment + php +. Модули относятся к фоновому уровню, поэтому вы сгруппируете развертывание в эту группу, используя метку + tier: backend +:

php_deployment.yaml

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

Для Deployment + spec + вы будете указывать, сколько копий этого модуля создать, используя параметр + replicas +. Количество + replicas + будет варьироваться в зависимости от ваших потребностей и доступных ресурсов. Вы создадите одну реплику в этом уроке:

php_deployment.yaml

...
spec:
 replicas: 1

Это развертывание будет управлять модулями, которые соответствуют меткам + app: php + и + tier: backend +. Под клавишей + selector + добавьте:

php_deployment.yaml

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

Затем для развертывания + spec требуется` + template` для определения объекта вашего модуля. Этот шаблон будет определять спецификации для создания модуля. Сначала вы добавите метки, которые были указаны для + php сервиса` + selectors` и Deployment + matchLabels. Добавьте + app: php и` + tier: backend` в + template.metadata.labels:

php_deployment.yaml

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

Модуль может иметь несколько контейнеров и томов, но каждому будет необходимо имя. Вы можете выборочно монтировать тома в контейнер, указав путь монтирования для каждого тома.

Сначала укажите тома, к которым будут обращаться ваши контейнеры. Вы создали PVC с именем + code + для хранения кода своего приложения, поэтому назовите этот том + code +. Под + spec.template.spec.volumes + добавьте следующее:

php_deployment.yaml

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

Затем укажите контейнер, который вы хотите запустить в этом модуле. Вы можете найти различные изображения на the Docker store, но в этом руководстве вы будете использовать изображение + php: 7-fpm +.

Под + spec.template.spec.containers + добавьте следующее:

php_deployment.yaml

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

Далее вы смонтируете тома, к которым контейнеру требуется доступ. Этот контейнер будет запускать ваш PHP-код, поэтому ему потребуется доступ к тому + code +. Вы также будете использовать + mountPath +, чтобы указать + / code + в качестве точки монтирования.

Под + spec.template.spec.containers.volumeMounts + добавьте:

php_deployment.yaml

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

Теперь, когда вы смонтировали том, вам нужно получить код приложения на томе. Возможно, вы ранее использовали FTP / SFTP или клонировали код через соединение SSH, чтобы выполнить это, но этот шаг покажет вам, как скопировать код с помощью контейнера Init.

В зависимости от сложности вашего процесса установки вы можете либо использовать один + initContainer + для запуска скрипта, который создает ваше приложение, либо вы можете использовать один + initContainer + для каждой команды. Убедитесь, что тома подключены к + initContainer +.

В этом уроке вы будете использовать один контейнер контейнера с + busybox для загрузки кода. + busybox + - это небольшое изображение, которое содержит утилиту + wget +, которую вы будете использовать для этого.

Под + spec.template.spec + добавьте ваш + initContainer + и укажите изображение + busybox +:

php_deployment.yaml

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

Вашему контейнеру Init потребуется доступ к тому + code +, чтобы он мог загрузить код в этом месте. Под + spec.template.spec.initContainers монтируйте том` + code + по пути + / code + `:

php_deployment.yaml

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

Каждый Init-контейнер должен запускать + command +. Ваш контейнер Init будет использовать + wget + для загрузки the code с https://github.com/do-community / php-kubernetes [Github] в рабочий каталог + / code +. Опция + -O + дает загруженному файлу имя, и вы назовете этот файл + index.php +.

Под контейнером + install в` + spec.template.spec.initContainers` добавьте следующие строки:

php_deployment.yaml

...
       command:
       - wget
       - "-O"
       - "/code/index.php"
       -

Ваш завершенный файл + php_deployment.yaml + будет выглядеть так:

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

Сохраните файл и выйдите из редактора.

Создайте развертывание PHP-FPM с помощью + kubectl +:

kubectl apply -f php_deployment.yaml

При создании развертывания вы увидите следующий вывод:

Outputdeployment.apps/php created

Подводя итог, можно сказать, что развертывание начнется с загрузки указанных образов. Затем он запросит + PersistentVolume + из вашего + PersistentVolumeClaim + и последовательно запустит ваш + initContainers +. После завершения контейнеры будут работать и монтировать + volume + в указанную точку монтирования. Когда все эти шаги будут выполнены, ваш модуль будет запущен.

Вы можете просмотреть свое развертывание, запустив:

kubectl get deployments

Вы увидите вывод:

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

Этот вывод может помочь вам понять текущее состояние развертывания. + Deployment + - это one контроллеров, который поддерживает желаемое состояние. Созданный вами + template + указывает, что состояние + DESIRED + будет иметь 1 + реплики + модуля с именем + php +. Поле + CURRENT указывает, сколько реплик запущено, поэтому оно должно соответствовать состоянию` + DESIRED`. Вы можете прочитать об остальных полях в Kubernetes Deployments документации.

Вы можете просмотреть модули, которые это развертывание запустило, с помощью следующей команды:

kubectl get pods

Вывод этой команды зависит от того, сколько времени прошло с момента создания развертывания. Если вы запустите его вскоре после создания, результат будет выглядеть примерно так:

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

Столбцы представляют следующую информацию:

  • + Ready +: количество + реплик +, на которых запущен этот модуль.

  • + Status +: статус модуля. + Init + указывает на то, что init-контейнеры работают. В этом выводе 0 из 1 начальных контейнеров завершили работу.

  • + Restarts +: Сколько раз этот процесс перезапускался, чтобы запустить модуль. Это число будет увеличиваться в случае сбоя любого из ваших контейнеров инициализации. Развертывание перезапустит его, пока не достигнет желаемого состояния.

В зависимости от сложности ваших сценариев запуска, для изменения состояния на + podInitializing + может потребоваться несколько минут:

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

Это означает, что начальные контейнеры завершены, и контейнеры инициализируются. Если вы запустите команду, когда все контейнеры будут запущены, вы увидите изменение статуса модуля на «+ Запуск +».

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

Теперь вы видите, что ваш модуль успешно работает. Если ваш модуль не запускается, вы можете выполнить отладку с помощью следующих команд:

  • Просмотр подробной информации о пакете:

kubectl describe pods
  • Просмотр журналов, созданных модулем:

kubectl logs
  • Просмотр журналов для конкретного контейнера в модуле:

kubectl logs

Код вашего приложения смонтирован, и служба PHP-FPM готова для обработки соединений. Теперь вы можете создать свой Nginx Deployment.

Шаг 5 - Создание развертывания Nginx

На этом этапе вы будете использовать ConfigMap для настройки Nginx. ConfigMap хранит вашу конфигурацию в формате ключ-значение, на которое вы можете ссылаться в других определениях объектов Kubernetes. Такой подход предоставит вам возможность повторно использовать или менять изображение при необходимости в другой версии Nginx. Обновление ConfigMap автоматически реплицирует изменения на любой модуль, монтирующий его.

Создайте файл + nginx_configMap.yaml + для вашей ConfigMap с вашим редактором:

nano nginx_configMap.yaml

Назовите ConfigMap + nginx-config + и сгруппируйте его в микро-сервис + tier: backend +:

nginx_configMap.yaml

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

Далее вы добавите + data для ConfigMap. Назовите ключ + config + и добавьте содержимое вашего файла конфигурации Nginx в качестве значения. Вы можете использовать пример конфигурации Nginx по адресу https://www.digitalocean.com/community/tutorials/how-to-set-up-nginx-server-blocks-virtual-hosts-on-ubuntu-16-04#step- 3-create-server-block-files-for-each-domain [это руководство].

Поскольку Kubernetes может направлять запросы на соответствующий хост для службы, вы можете ввести имя вашей службы PHP-FPM в параметре + fastcgi_pass + вместо его IP-адреса. Добавьте следующее в ваш файл + nginx_configMap.yaml +:

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 ;

     location / {
         try_files $uri $uri/ /index.php?$query_string;
     }

     location ~ \.php$ {
         try_files $uri =404;
         fastcgi_split_path_info ^(.+\.php)(/.+)$;
         fastcgi_pass ;
         fastcgi_index index.php;
         include fastcgi_params;
         fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
         fastcgi_param PATH_INFO $fastcgi_path_info;
       }
   }

Ваш файл + nginx_configMap.yaml + будет выглядеть так:

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;
       }
   }

Сохраните файл и выйдите из редактора.

Создайте ConfigMap:

kubectl apply -f nginx_configMap.yaml

Вы увидите следующий вывод:

Outputconfigmap/nginx-config created

Вы завершили создание своей ConfigMap и теперь можете создать свое развертывание Nginx.

Начните с открытия нового файла + nginx_deployment.yaml + в редакторе:

nano nginx_deployment.yaml

Назовите Deployment + nginx и добавьте метку` + tier: backend`:

nginx_deployment.yaml

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

Укажите, что вы хотите одну + replicas + в Deployment + spec +. Это развертывание будет управлять модулями с метками + app: nginx + и + tier: backend +. Добавьте следующие параметры и значения:

nginx_deployment.yaml

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

Затем добавьте модуль + template +. Вам нужно использовать те же метки, которые вы добавили для Deployment + selector.matchLabels +. Добавьте следующее:

nginx_deployment.yaml

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

Предоставьте Nginx доступ к PVC-коду + code +, который вы создали ранее. Под + spec.template.spec.volumes + добавьте:

nginx_deployment.yaml

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

Модули могут монтировать ConfigMap как том. Указание имени файла и ключа создаст файл с его значением в качестве содержимого. Чтобы использовать ConfigMap, установите + path + для имени файла, в котором будет содержаться содержимое + key +. Вы хотите создать файл + site.conf + из ключа + config +. Под + spec.template.spec.volumes + добавьте следующее:

nginx_deployment.yaml

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

Далее вы укажете изображение для создания вашего модуля. В этом руководстве для стабильности будет использоваться образ + nginx: 1.7.9 +, но другие образы Nginx можно найти по адресу the хранилище Docker. Кроме того, сделайте Nginx доступным для порта + 80 +. Под + spec.template.spec добавьте:

nginx_deployment.yaml

...
     containers:
     - name: nginx
       image:
       ports:
       - containerPort: 80

Nginx и PHP-FPM должны обращаться к файлу по одному и тому же пути, поэтому смонтируйте том + code + в + / code +:

nginx_deployment.yaml

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

Образ + nginx: 1.7.9 + автоматически загрузит любые файлы конфигурации в каталог + / etc / nginx / conf.d +. При монтировании тома + config + в этом каталоге будет создан файл + / etc / nginx / conf.d / site.conf +. Под + volumeMounts + добавьте следующее:

nginx_deployment.yaml

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

Ваш файл + nginx_deployment.yaml + будет выглядеть так:

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:
       ports:
       - containerPort: 80
       volumeMounts:
       - name: code
         mountPath: /code
       - name: config
         mountPath: /etc/nginx/conf.d

Сохраните файл и выйдите из редактора.

Создайте развертывание Nginx:

kubectl apply -f nginx_deployment.yaml

Следующий вывод показывает, что ваше развертывание теперь создано:

Outputdeployment.apps/nginx created

Перечислите свои Развертывания с этой командой:

kubectl get deployments

Вы увидите развертывания Nginx и PHP-FPM:

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

Перечислите модули, управляемые обоими Развертываниями:

kubectl get pods

Вы увидите работающие стручки:

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

Теперь, когда все объекты Kubernetes активны, вы можете посетить сервис Nginx в своем браузере.

Список запущенных сервисов:

kubectl get services -o wide

Получите внешний IP для вашего сервиса Nginx:

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    80/TCP     27m       app=nginx,tier=backend
php          ClusterIP   10.100.59.238   <none>        9000/TCP   34m       app=php,tier=backend

В браузере зайдите на свой сервер, набрав + http: // +. Вы увидите вывод + phpinfo () + и подтвердите, что ваши сервисы Kubernetes запущены и работают.

Заключение

В этом руководстве вы создали контейнеры PHP-FPM и Nginx, чтобы управлять ими независимо. Такой подход не только улучшит масштабируемость вашего проекта по мере роста, но также позволит вам эффективно использовать ресурсы. Вы также сохранили код приложения на томе, чтобы в будущем можно было легко обновлять свои услуги.

Related