Kubernetes MLflow Service Pod Connection - PullRequest
       33

Kubernetes MLflow Service Pod Connection

1 голос
/ 21 апреля 2020

Я развернул сборку mlflow в модуле в моем кластере kubernetes. Я могу портировать вперед на интерфейс mlflow, и теперь я пытаюсь проверить это. Для этого я запускаю следующий тест на ноутбуке Jupyter, который работает на другом модуле в том же кластере.

import mlflow

print("Setting Tracking Server")
tracking_uri = "http://mlflow-tracking-server.default.svc.cluster.local:5000"

mlflow.set_tracking_uri(tracking_uri)

print("Logging Artifact")
mlflow.log_artifact('/home/test/mlflow-example-artifact.png')

print("DONE")

Когда я запускаю это, я получаю

ConnectionError: HTTPConnectionPool(host='mlflow-tracking-server.default.svc.cluster.local', port=5000): Max retries exceeded with url: /api/2.0/mlflow/runs/get? (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object>: Failed to establish a new connection: [Errno 111] Connection refused'))

Способ развертывания модуля mlflow показан ниже в yaml и docker:

Yaml:

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mlflow-tracking-server
  namespace: default
spec:
  selector:
    matchLabels:
      app: mlflow-tracking-server
  replicas: 1
  template:
    metadata:
      labels:
        app: mlflow-tracking-server
    spec:
      containers:
      - name: mlflow-tracking-server
        image: <ECR_IMAGE>
        ports:
        - containerPort: 5000
        env:
        - name: AWS_MLFLOW_BUCKET
          value: <S3_BUCKET>
        - name: AWS_ACCESS_KEY_ID
          valueFrom:
            secretKeyRef:
              name: aws-secret
              key: AWS_ACCESS_KEY_ID
        - name: AWS_SECRET_ACCESS_KEY
          valueFrom:
            secretKeyRef:
              name: aws-secret
              key: AWS_SECRET_ACCESS_KEY

---
apiVersion: v1
kind: Service
metadata:
  name: mlflow-tracking-server
  namespace: default
  labels:
    app: mlflow-tracking-server
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-type: nlb
spec:
  externalTrafficPolicy: Local
  type: LoadBalancer
  selector:
    app: mlflow-tracking-server
  ports:
    - name: http
      port: 5000
      targetPort: http

Пока dockerfile вызывает скрипт, который выполняет команду mlflow server: mlflow server --default-artifact-root ${AWS_MLFLOW_BUCKET} --host 0.0.0.0 --port 5000

Проблема заключается в том, что я не могу подключиться к службе, которую создал, используя этот модуль mlflow. Я попытался использовать отслеживание uri http://mlflow-tracking-server.default.svc.cluster.local:5000, я попытался использовать службу EXTERNAL-IP: 5000, но все, что я пробовал, не может подключиться и войти в систему с помощью службы. Есть ли что-то, что я упустил при развертывании моего модуля mlflow server в моем кластере kubernetes?

1 Ответ

2 голосов
/ 21 апреля 2020

Ваш сервер mlflow-tracking-server должен иметь тип ClusterIP , а не LoadBalancer .

Оба модуля находятся в одном кластере Kubernetes, поэтому нет смысла использовать LoadBalancer Тип сервиса.

Для некоторых частей вашего приложения (для Например, веб-интерфейсы) вы можете разместить Сервис на внешнем IP-адресе, который находится за пределами вашего кластера. Сервисные типы Kubernetes позволяют вам указать, какой сервис вы хотите. По умолчанию используется ClusterIP.

Введите значения и их поведение:

  • ClusterIP : Предоставляет службу для внутреннего IP-адреса кластера. Выбор этого значения делает Сервис доступным только из кластера. Это тип службы по умолчанию.

  • NodePort : Предоставляет Сервис для каждого IP-адреса узла в порту c (NodePort). A> ClusterIP Service, к которому направляется служба NodePort, создается автоматически. Вы сможете связаться со службой NodePort из-за пределов кластера, запросив:.

  • LoadBalancer : Предоставление сервиса извне с использованием балансировщика нагрузки облачного провайдера. Службы NodePort и ClusterIP, к которым создаются внешние маршруты балансировки нагрузки, создаются автоматически.
  • ExternalName : сопоставляет Сервис с содержимым поля externalName (например, foo.bar.example.com), возвращая запись CNAME со своим значением. Никакое проксирование не установлено.

kubernetes.io

...