Автор выбрал Open Internet / Free Speech, чтобы получить пожертвование в рамках https://do.co/w4do-cta [ Пишите для ДОНОЦИЙ] program.
Вступление
Kubernetes - это система оркестровки контейнеров с открытым исходным кодом. Он позволяет создавать, обновлять и масштабировать контейнеры, не беспокоясь о времени простоя.
Для запуска приложения PHP Nginx выступает в роли прокси-сервера для PHP-FPM. Хранение этой настройки в одном контейнере может быть трудоемким процессом, но Kubernetes поможет управлять обеими службами в отдельных контейнерах. Использование Kubernetes позволит вам сохранять контейнеры для повторного использования и замены, и вам не нужно будет перестраивать свой контейнерный образ каждый раз, когда появляется новая версия Nginx или PHP.
В этом руководстве вы развернете приложение PHP 7 в кластере Kubernetes с Nginx и PHP-FPM, работающими в отдельных контейнерах. Вы также узнаете, как сохранить свои файлы конфигурации и код приложения вне образа контейнера, используя систему DigitalOcean’s Block Storage. Этот подход позволит вам повторно использовать образ Nginx для любого приложения, которому требуется веб / прокси-сервер, передавая том конфигурации, а не перестраивая образ.
Предпосылки
-
Базовое понимание объектов Kubernetes. Ознакомьтесь с нашей Introduction to Kubernetes статьей для получения дополнительной информации.
-
Кластер Kubernetes работает на Ubuntu 16.04. Вы можете настроить это, следуя https://www.digitalocean.com/community/tutorials/how-to-create-a-kubernetes-1-10-cluster-using-kubeadm-on-ubuntu-16-04 [ Как создать кластер Kubernetes 1.10 с помощью Kubeadm в Ubuntu 16.04].
-
Учетная запись DigitalOcean и токен доступа API с разрешениями на чтение и запись для создания тома нашего хранилища. Если у вас нет токена доступа к API, вы можете create его отсюда.
-
Код вашего приложения размещен на общедоступном URL-адресе, например https://github.com [Github].
Шаг 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 +
, так как она принадлежит к уровню 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` + namespace
. Пространство имен + 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-v0.3.0.yaml
Вы увидите вывод, похожий на следующий:
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
Теперь, когда вы установили подключаемый модуль хранилища 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
Сохраните и выйдите из файла.
Создайте + code +
PersistentVolumeClaim, используя + 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"
-
Сохраните файл и выйдите из редактора.
Создайте развертывание 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 ^/code^;
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 ;
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;
}
}
Сохраните файл и выйдите из редактора.
Создайте 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, чтобы управлять ими независимо. Такой подход не только улучшит масштабируемость вашего проекта по мере роста, но также позволит вам эффективно использовать ресурсы. Вы также сохранили код приложения на томе, чтобы в будущем можно было легко обновлять свои услуги.