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

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


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

Создание 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