# Создание Deployment, Service, Ingress в Kubernetes ## Введение В Kubernetes для запуска и управления приложениями используются различные абстракции. Три ключевых из них - Deployment, Service и Ingress - обеспечивают масштабирование, доступность и внешний доступ к вашим приложениям. ## 1. Deployment * **Определение:** Объект Kubernetes, который обеспечивает декларативное обновление приложений Pod'ами и ReplicaSet'ами. Deployment описывает желаемое состояние вашего приложения (например, количество реплик) и Kubernetes стремится поддерживать это состояние. * **Основные характеристики:** * **Декларативное обновление:** Вы описываете желаемую версию приложения, и Deployment постепенно обновляет работающие Pod'ы до этой версии. * **Rollouts и Rollbacks:** Поддерживает плавные обновления (Rolling Updates) и возможность отката к предыдущим версиям (Rollbacks). * **Масштабирование:** Позволяет легко увеличивать или уменьшать количество реплик Pod'ов. * **Самовосстановление:** Если Pod'ы выходят из строя, Deployment автоматически создает новые для поддержания желаемого количества реплик. * **YAML-манифест Deployment (пример):** ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: my-app-deployment labels: app: my-app spec: replicas: 3 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: containers: - name: my-app-container image: nginx:latest ports: - containerPort: 80 ``` * **`apiVersion`:** Версия API Kubernetes для Deployment. * **`kind`:** Тип объекта (Deployment). * **`metadata.name`:** Имя Deployment. * **`metadata.labels`:** Метки, идентифицирующие Deployment. * **`spec.replicas`:** Желаемое количество реплик Pod'ов. * **`spec.selector.matchLabels`:** Селектор, определяющий, какие Pod'ы управляются этим Deployment. Должен соответствовать меткам в `template.metadata.labels`. * **`spec.template.metadata.labels`:** Метки, которые будут присвоены создаваемым Pod'ам. * **`spec.template.spec.containers`:** Описание контейнеров в Pod'е (имя, образ, порты и т.д.). * **Управление Deployment:** * **Создание:** `kubectl apply -f my-deployment.yaml` * **Просмотр:** `kubectl get deployments` * **Просмотр деталей:** `kubectl describe deployment my-app-deployment` * **Масштабирование:** `kubectl scale deployment my-app-deployment --replicas=5` * **Обновление образа:** `kubectl set image deployment/my-app-deployment my-app-container=nginx:1.21` * **Откат:** `kubectl rollout undo deployment/my-app-deployment` * **Просмотр истории обновлений:** `kubectl rollout history deployment/my-app-deployment` ## 2. Service * **Определение:** Абстракция, которая предоставляет стабильный IP-адрес и DNS-имя для набора Pod'ов, обеспечивая балансировку нагрузки между ними. Service позволяет другим приложениям внутри кластера надежно обращаться к вашему приложению, не заботясь об IP-адресах отдельных Pod'ов, которые могут меняться. * **Типы Service:** * **ClusterIP (по умолчанию):** Предоставляет IP-адрес, доступный только внутри кластера. Используется для внутренней коммуникации между сервисами. * **NodePort:** Открывает порт на каждом узле кластера, через который можно получить доступ к сервису. Обычно используется для разработки или для предоставления ограниченного внешнего доступа. * **LoadBalancer:** Создает внешний балансировщик нагрузки (если поддерживается облачным провайдером) и предоставляет внешний IP-адрес для доступа к сервису. * **ExternalName:** Предоставляет DNS-запись для внешнего сервиса. * **YAML-манифест Service (пример - ClusterIP):** ```yaml apiVersion: v1 kind: Service metadata: name: my-app-service labels: app: my-app spec: selector: app: my-app ports: - protocol: TCP port: 80 targetPort: 80 ``` * **`apiVersion`:** Версия API Kubernetes для Service. * **`kind`:** Тип объекта (Service). * **`metadata.name`:** Имя Service. * **`metadata.labels`:** Метки, идентифицирующие Service. * **`spec.selector`:** Селектор, определяющий, к каким Pod'ам направлять трафик. Должен соответствовать меткам `spec.template.metadata.labels` в Deployment. * **`spec.ports`:** Список портов, которые предоставляет Service. * **`protocol`:** Протокол (TCP, UDP, SCTP). * **`port`:** Порт Service, на котором он принимает входящие соединения. * **`targetPort`:** Порт контейнера, на который перенаправляется трафик. * **YAML-манифест Service (пример - NodePort):** ```yaml apiVersion: v1 kind: Service metadata: name: my-app-nodeport-service labels: app: my-app spec: type: NodePort selector: app: my-app ports: - protocol: TCP port: 80 targetPort: 80 nodePort: 30080 ``` * **`type: NodePort`:** Указывает тип Service. * **`spec.ports.nodePort`:** Порт, открытый на каждом узле (обычно в диапазоне 30000-32767). * **YAML-манифест Service (пример - LoadBalancer):** ```yaml apiVersion: v1 kind: Service metadata: name: my-app-loadbalancer-service labels: app: my-app spec: type: LoadBalancer selector: app: my-app ports: - protocol: TCP port: 80 targetPort: 80 ``` * **`type: LoadBalancer`:** Указывает тип Service. Kubernetes будет пытаться создать внешний балансировщик нагрузки. * **Управление Service:** * **Создание:** `kubectl apply -f my-service.yaml` * **Просмотр:** `kubectl get services` * **Просмотр деталей:** `kubectl describe service my-app-service` * **Просмотр endpoints (IP-адреса Pod'ов, входящих в Service):** `kubectl get endpoints my-app-service` ## 3. Ingress * **Определение:** Объект Kubernetes, который управляет внешним доступом к сервисам в кластере, обычно через HTTP и HTTPS. Ingress действует как маршрутизатор трафика, направляя входящие запросы на правильные сервисы на основе правил, определенных в Ingress-ресурсе. * **Требования:** Для работы Ingress необходимо установить Ingress Controller (например, nginx-ingress, traefik). Ingress Controller - это Pod'ы, которые прослушивают входящий трафик и перенаправляют его в соответствии с Ingress-правилами. * **Основные характеристики:** * **Маршрутизация на основе хоста:** Направление трафика на разные сервисы в зависимости от доменного имени в HTTP-запросе. * **Маршрутизация на основе пути:** Направление трафика на разные сервисы в зависимости от пути в URL-запросе. * **TLS/SSL Termination:** Поддержка шифрования HTTPS путем настройки TLS-сертификатов. * **Балансировка нагрузки:** Ingress Controller может выполнять балансировку нагрузки между Pod'ами сервисов. * **YAML-манифест Ingress (пример):** ```yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-app-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: rules: - host: my-app.example.com http: paths: - path: / pathType: Prefix backend: service: name: my-app-service port: number: 80 - host: api.example.com http: paths: - path: /v1 pathType: Prefix backend: service: name: my-api-service port: number: 8080 ``` * **`apiVersion`:** Версия API Kubernetes для Ingress. * **`kind`:** Тип объекта (Ingress). * **`metadata.name`:** Имя Ingress. * **`metadata.annotations`:** Дополнительные настройки, специфичные для Ingress Controller (например, `nginx.ingress.kubernetes.io/rewrite-target`). * **`spec.rules`:** Список правил маршрутизации. * **`host`:** Доменное имя, для которого применяется правило. * **`http.paths`:** Список путей и соответствующих бэкендов. * **`path`:** Путь в URL-запросе. * **`pathType`:** Тип сопоставления пути (`Prefix`, `Exact`, `ImplementationSpecific`). * **`backend.service.name`:** Имя Service, на который направляется трафик. * **`backend.service.port.number`:** Порт Service, на который направляется трафик. * **Управление Ingress:** * **Создание:** `kubectl apply -f my-ingress.yaml` * **Просмотр:** `kubectl get ingress` * **Просмотр деталей:** `kubectl describe ingress my-app-ingress` ## Взаимодействие Deployment, Service, Ingress 1. **Deployment** управляет репликами Pod'ов, обеспечивая их количество и обновление. 2. **Service** предоставляет стабильный внутренний IP-адрес и DNS-имя для группы Pod'ов, управляемых Deployment'ом, обеспечивая балансировку нагрузки внутри кластера. 3. **Ingress** обеспечивает внешний доступ к Service'ам, маршрутизируя входящий HTTP/HTTPS трафик на основе хоста и пути. Ingress Controller реализует эти правила, направляя трафик на IP-адреса Pod'ов, стоящих за Service'ом. ## Заключение Deployment, Service и Ingress являются фундаментальными строительными блоками для развертывания и управления приложениями в Kubernetes. Понимание их назначения и взаимодействия позволяет создавать масштабируемые, отказоустойчивые и доступные приложения. Для обеспечения внешнего доступа к вашим приложениям в большинстве случаев потребуется связка Deployment (для управления приложением), Service (для внутренней балансировки) и Ingress (для внешней маршрутизации).