Инструменты пользователя

Инструменты сайта


методология_devops:создание_deployment_service_ingress_в_kubernetes:start

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

методология_devops:создание_deployment_service_ingress_в_kubernetes:start [2025/05/31 21:15] (текущий)
kirill создано
Строка 1: Строка 1:
 +# Создание 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 (для внешней маршрутизации).
методология_devops/создание_deployment_service_ingress_в_kubernetes/start.txt · Последнее изменение: 2025/05/31 21:15 — kirill

DokuWiki Appliance - Powered by TurnKey Linux