Какой у вас опыт работы с Kubernetes?

Ответ

Я разворачивал и поддерживал в Kubernetes кластерах (как managed, так и self-hosted) сервисы для инференса ML-моделей и оркестрации тренировочных джоб. Основные задачи:

  1. Деплой сервисов: Создание Deployments, Services (включая LoadBalancer и ClusterIP) и Ingress-контроллеров для доступа к API.
  2. Конфигурация и секреты: Использование ConfigMaps и Secrets для управления настройками и чувствительными данными.
  3. Масштабирование: Настройка HorizontalPodAutoscaler (HPA) на основе CPU/памяти или кастомных метрик из Prometheus.

Пример манифеста для сервиса инференса с лимитами ресурсов и readiness-пробой:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: model-inference
spec:
  selector:
    matchLabels:
      app: model-inference
  template:
    metadata:
      labels:
        app: model-inference
    spec:
      containers:
      - name: api
        image: my-registry/model-api:v1.2
        ports:
        - containerPort: 8000
        readinessProbe:
          httpGet:
            path: /health
            port: 8000
          initialDelaySeconds: 10
        resources:
          requests:
            memory: '512Mi'
            cpu: '250m'
          limits:
            memory: '1Gi'
            cpu: '500m'

Также использовал Kubeflow Pipelines для организации воспроизводимых ML-воркфлоу и Helm для управления релизами сложных приложений.

Ответ 18+ 🔞

А, ну ты про куберы! Да, я с этой штукой на короткой ноге, ёпта. Разворачивал и поддерживал в этих самых Kubernetes кластерах (и те, что как услуга, и те, что сам собирал, с горем пополам) сервисы для инференса ML-моделей и для оркестрации тренировочных джоб. Задачи там были, я тебе скажу, на овердохуища.

Вот, например, что приходилось делать:

  1. Деплой сервисов: Создавать эти самые Deployments, Services (включая LoadBalancer, который денег стоит, и ClusterIP для внутреннего общения) и Ingress-контроллеры, чтобы к API доступ был. Иногда так настроишь, что сам потом полдня ищешь, где косяк — волнение ебать, честно.
  2. Конфигурация и секреты: Работа с ConfigMaps и Secrets. Это чтобы настройки не в код пихать, а то потом, если что-то поменять надо, пересобирать всё — терпения ноль ебать. А секреты — ну, чтобы пароли и ключи не светить на каждом углу.
  3. Масштабирование: Настройка HorizontalPodAutoscaler (HPA). Чтобы поды сами плодились, когда нагрузка растёт, и умирали, когда она падает. Можно по CPU/памяти, а можно и по кастомным метрикам из Prometheus прикрутить — было дело.

Вот, смотри, пример манифеста для сервиса инференса. Тут и лимиты ресурсов, чтобы один жадный под всю память не сожрал, и readiness-проба, чтобы трафик на здоровые инстансы только шёл. Без этого — пиздец, а не сервис.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: model-inference
spec:
  selector:
    matchLabels:
      app: model-inference
  template:
    metadata:
      labels:
        app: model-inference
    spec:
      containers:
      - name: api
        image: my-registry/model-api:v1.2
        ports:
        - containerPort: 8000
        readinessProbe:
          httpGet:
            path: /health
            port: 8000
          initialDelaySeconds: 10
        resources:
          requests:
            memory: '512Mi'
            cpu: '250m'
          limits:
            memory: '1Gi'
            cpu: '500m'

А ещё, чувак, использовал Kubeflow Pipelines — штука для организации ML-воркфлоу, чтобы их можно было воспроизводить, а не как попало. И Helm, конечно. Без него управлять релизами сложных приложений — это как гвозди микроскопом забивать, ей-богу. Чарты эти, values.yaml... Но когда всё летает — красота.