Создание простого YAML-манифеста
Прежде чем создавать свой первый YAML-манифест, важно понять ключевые объекты Kubernetes, с которыми вы будете работать. Эти объекты являются строительными блоками для управления и оркестрации ваших приложений в Kubernetes.
Понимание объектов Kubernetes
- Pod: Самая базовая единица в Kubernetes. Pod — это как контейнер, который может содержать один или несколько контейнеров. Эти контейнеры внутри пода совместно используют одну и ту же сеть и хранилище. Думайте о поде как о представлении одного экземпляра вашего приложения.
- Deployment: Развертывания используются для управления подами. Они гарантируют, что желаемое количество реплик подов всегда запущено. Если под выходит из строя, развертывание автоматически заменит его. Развертывания также обрабатывают обновления вашего приложения контролируемым образом, например, с помощью поэтапных обновлений (rolling updates).
- Service: Сервисы предоставляют стабильный способ доступа к вашему приложению, работающему в подах. Поскольку поды могут создаваться и уничтожаться, их IP-адреса могут меняться. Сервис предоставляет фиксированный IP-адрес и DNS-имя, которые всегда указывают на набор управляемых им подов. Это позволяет другим частям вашего приложения или внешним пользователям надежно получать доступ к вашему приложению без необходимости отслеживать IP-адреса отдельных подов.
Вот диаграмма, иллюстрирующая взаимосвязи между этими объектами:
graph TD;
A[Deployment] -->|Manages| B[Pods]
B -->|Contains| C[Containers]
B -->|Communicates via| D[Services]
D -->|Exposes| E[External Clients]
Понимание этих объектов имеет решающее значение, поскольку вы будете определять их желаемое состояние и конфигурацию с помощью YAML-манифестов.
Обзор YAML-манифеста
YAML-манифест в Kubernetes — это файл, написанный в формате YAML, который описывает объекты Kubernetes, которые вы хотите создать или управлять. YAML — это человекочитаемый язык сериализации данных. Использование YAML для манифестов Kubernetes имеет ряд преимуществ:
- Декларативное управление: Вы описываете желаемое состояние ваших ресурсов в YAML-файле (например, «Я хочу, чтобы работало 3 реплики моего приложения»). Kubernetes затем работает над тем, чтобы фактическое состояние соответствовало вашему желаемому состоянию. Это называется декларативным управлением.
- Контроль версий: YAML-файлы основаны на тексте и могут быть легко сохранены в системах контроля версий, таких как Git. Это позволяет отслеживать изменения в ваших конфигурациях Kubernetes с течением времени, откатываться к предыдущим конфигурациям и сотрудничать с другими.
- Повторное использование и переносимость: Вы можете повторно использовать YAML-манифесты в различных средах (разработка, тестирование, продакшн) с минимальными изменениями. Это делает ваши развертывания более последовательными и воспроизводимыми.
Теперь, когда вы понимаете основы объектов Kubernetes и YAML-манифестов, вы готовы создать свой первый манифест.
Создание YAML-манифеста
Сначала перейдите в каталог вашего проекта. Предполагается, что у вас есть каталог project в вашей домашней директории (~). Если у вас его нет, создайте его сейчас с помощью mkdir project. Затем измените текущий каталог на project с помощью cd project:
cd ~/project
Далее создайте новый каталог для хранения ваших манифестов Kubernetes. Назовем его k8s-manifests. Используйте команду mkdir, чтобы создать каталог, а затем cd, чтобы перейти в него:
mkdir -p k8s-manifests
cd k8s-manifests
Теперь вы создадите свой первый YAML-манифест-файл. Начнем с простого манифеста для пода NGINX. NGINX — популярный веб-сервер. Мы создадим под, который запускает один контейнер NGINX. Используйте текстовый редактор nano для создания файла с именем nginx-pod.yaml:
nano nginx-pod.yaml
nano — это простой текстовый редактор, который работает в вашем терминале. Как только nano откроется, вставьте следующее содержимое в файл:
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
Давайте разберем каждую часть этого YAML-манифеста:
apiVersion: v1: Указывает версию API Kubernetes, используемую для создания этого объекта. v1 — это основная группа API, и она используется для фундаментальных объектов, таких как поды, сервисы и пространства имен.
kind: Pod: Указывает, что вы определяете ресурс Pod.
metadata:: Содержит данные о поде, такие как его имя и метки (labels).
name: nginx-pod: Устанавливает имя пода как nginx-pod. Так вы будете ссылаться на этот под в Kubernetes.
labels:: Метки — это пары ключ-значение, которые прикрепляются к объектам. Они используются для организации и выбора подмножеств объектов. Здесь мы добавляем метку app: nginx к этому поду.
spec:: Описывает желаемое состояние пода.
containers:: Список контейнеров, которые будут запущены внутри пода. В данном случае у нас только один контейнер.
- name: nginx: Устанавливает имя контейнера как nginx.
image: nginx:latest: Указывает образ контейнера для использования. nginx:latest ссылается на последнюю версию образа Docker NGINX из Docker Hub.
ports:: Список портов, которые будет предоставлять этот контейнер.
- containerPort: 80: Указывает, что контейнер будет предоставлять порт 80. Порт 80 — это стандартный порт HTTP.
После вставки содержимого сохраните файл и выйдите из nano. Для этого нажмите Ctrl+X (выйти), затем введите Y (да, сохранить) и, наконец, нажмите Enter, чтобы подтвердить имя файла и сохранить.
Теперь, когда вы создали файл nginx-pod.yaml, вам нужно применить его к вашему кластеру Kubernetes, чтобы создать под. Используйте команду kubectl apply с флагом -f, который указывает файл, содержащий манифест:
kubectl apply -f nginx-pod.yaml
Эта команда отправит манифест в ваш кластер Kubernetes, и Kubernetes создаст под в соответствии с определением. Вы должны увидеть вывод, похожий на этот:
pod/nginx-pod created
Чтобы проверить, что под был создан и работает, используйте команду kubectl get pods. Она выведет список всех подов в пространстве имен по умолчанию. Вы также можете использовать kubectl describe pod nginx-pod для получения подробной информации о nginx-pod. Выполните эти команды:
kubectl get pods
kubectl describe pod nginx-pod
Пример вывода для kubectl get pods:
NAME READY STATUS RESTARTS AGE
nginx-pod 1/1 Running 0 1m
Этот вывод показывает, что nginx-pod находится в состоянии READY (1 из 1 контейнера готов) и его STATUS — Running. Это означает, что ваш под NGINX был успешно создан и работает.
Теперь давайте создадим манифест для более сложного ресурса: Deployment. Deployment будет управлять набором подов, гарантируя, что запущено желаемое количество реплик. Создайте новый файл с именем nginx-deployment.yaml с помощью nano:
nano nginx-deployment.yaml
Вставьте следующее содержимое в nginx-deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
Выделим ключевые отличия и новые части по сравнению с манифестом nginx-pod.yaml:
apiVersion: apps/v1: Для Deployment используется версия API apps/v1, которая является частью группы API apps и обрабатывает ресурсы управления приложениями более высокого уровня.
kind: Deployment: Указывает, что вы определяете ресурс Deployment.
spec:: Секция spec для Deployment более сложна, поскольку она определяет, как Deployment будет управлять подами.
replicas: 3: Это новое. Оно указывает, что вы хотите, чтобы работало 3 реплики (копии) вашего пода. Deployment будет гарантировать, что всегда будет 3 пода, соответствующих критериям, определенным в template.
selector:: Селектор используется Deployment для идентификации подов, которыми он должен управлять.
matchLabels:: Определяет метки, которые должны быть у подов, чтобы они были выбраны этим Deployment. Здесь он выбирает поды с меткой app: nginx.
template:: template определяет спецификацию пода, которую Deployment будет использовать для создания новых подов. По сути, это то же определение пода, что и в нашем примере nginx-pod.yaml, включая metadata.labels и spec.containers. Важно: Метки, определенные здесь в template.metadata.labels, должны соответствовать selector.matchLabels, чтобы Deployment мог управлять этими подами.
Сохраните и выйдите из nano (Ctrl+X, Y, Enter).
Теперь примените этот манифест Deployment к вашему кластеру:
kubectl apply -f nginx-deployment.yaml
Вы должны увидеть вывод, похожий на:
deployment.apps/nginx-deployment created
Проверьте Deployment и созданные им поды. Используйте kubectl get deployments, чтобы проверить статус Deployment, и kubectl get pods, чтобы увидеть поды.
kubectl get deployments
kubectl get pods
Пример вывода:
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 3/3 3 3 1m
NAME READY STATUS RESTARTS AGE
nginx-deployment-xxx-yyy 1/1 Running 0 1m
nginx-deployment-xxx-zzz 1/1 Running 0 1m
nginx-deployment-xxx-www 1/1 Running 0 1m
kubectl get deployments показывает, что nginx-deployment имеет READY 3/3, UP-TO-DATE 3 и AVAILABLE 3. Это означает, что Deployment успешно создал и управляет 3 подами, и все они готовы и доступны.
kubectl get pods теперь перечисляет три пода с именами, начинающимися с nginx-deployment-. Это поды, созданные и управляемые вашим nginx-deployment.