docker - MLflow Kubernetes Pod 部署

标签 docker kubernetes mlflow

我正在尝试创建一个 kubernetes pod,它将运行 MLflow 跟踪器以将 mlflow 工件存储在指定的 s3 位置。以下是我尝试部署的内容

Dockerfile:

FROM python:3.7.0

RUN pip install mlflow==1.0.0
RUN pip install boto3
RUN pip install awscli --upgrade --user

ENV AWS_MLFLOW_BUCKET aws_mlflow_bucket
ENV AWS_ACCESS_KEY_ID aws_access_key_id
ENV AWS_SECRET_ACCESS_KEY aws_secret_access_key

COPY run.sh /

ENTRYPOINT ["/run.sh"]

# docker build -t seedjeffwan/mlflow-tracking-server:1.0.0 .
# 1.0.0 is current mlflow version

运行.sh:
#!/bin/sh

set -e

if [ -z $FILE_DIR ]; then
  echo >&2 "FILE_DIR must be set"
  exit 1
fi

if [ -z $AWS_MLFLOW_BUCKET ]; then
  echo >&2 "AWS_MLFLOW_BUCKET must be set"
  exit 1
fi

if [ -z $AWS_ACCESS_KEY_ID ]; then
  echo >&2 "AWS_ACCESS_KEY_ID must be set"
  exit 1
fi

if [ -z $AWS_SECRET_ACCESS_KEY ]; then
  echo >&2 "AWS_SECRET_ACCESS_KEY must be set"
  exit 1
fi

mkdir -p $FILE_DIR && mlflow server \
    --backend-store-uri $FILE_DIR \
    --default-artifact-root s3://${AWS_MLFLOW_BUCKET} \
    --host 0.0.0.0 \
    --port 5000

mlflow.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: seedim/mlflow-tracker-service:v1
        ports:
        - containerPort: 5000
        env:
        # FILE_DIR can not be mount dir, MLFLOW need a empty dir but mount dir has lost+found
        - name: FILE_DIR
          value: /mnt/mlflow/manifest
        - name: AWS_MLFLOW_BUCKET
          value: <aws_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
        volumeMounts:
        - mountPath: /mnt/mlflow
          name: mlflow-manifest-storage
      volumes:
        - name: mlflow-manifest-storage
          persistentVolumeClaim:
            claimName: mlflow-manifest-pvc

---
apiVersion: v1
kind: Service
metadata:
  name: mlflow-tracking-server
  namespace: default
  labels:
    app: mlflow-tracking-server
spec:
  ports:
  - port: 5000
    protocol: TCP
  selector:
    app: mlflow-tracking-server

---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: mlflow-manifest-pvc
  namespace: default
spec:
  storageClassName: gp2
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi

然后我正在构建 docker 镜像,将其保存到 minikube 环境,然后尝试在 kubernetes pod 上运行 docker 镜像。

当我尝试此操作时,我收到图像 pod 的 CrashLoopBackOff 错误,并且使用 yaml 创建的 pod 的“pod has unbound immediate PersistentVolumeClaims”。

我正在尝试关注此处的信息 (https://github.com/aws-samples/eks-kubeflow-workshop/blob/master/notebooks/07_Experiment_Tracking/07_02_MLFlow.ipynb)。

在这种情况下我做错了什么明显的事情吗?

谢谢

最佳答案

此处的问题与您的 minikube 集群未配置的持久卷声明有关。

您将需要决定切换到平台托管的 kubernetes 服务或坚持使用 minikube 并手动满足 Persistent Volume Claim 或
与替代解决方案。

最简单的选择是使用 helm mflow 安装图表,如 thisthis .

第一 Helm chart已列出要求:

Prerequisites

  • Kubernetes cluster 1.10+
  • Helm 2.8.0+
  • PV provisioner support in the underlying infrastructure.


就像在指南中一样,您遵循这个需要 PV 供应商支持。

因此,通过切换到 EKS,您很可能会更轻松地部署 mflow 并使用 s3 进行工件存储。

如果您希望继续使用 minikube,则需要修改您链接的指南中的 helm 图表值或 yaml 文件,以与您手动配置 PV 兼容。它可能还需要 s3 的权限配置。

第二 Helm chart具有以下限制/功能:

Known limitations of this Chart

I've created this Chart to use it in a production-ready environment in my company. We are using MLFlow with a Postgres backend store.

Therefore, the following capabilities have been left out of the Chart:

  • Using persistent volumes as a backend store.
  • Using other database engines like MySQL or SQLServer.


您可以尝试将其安装在 minikube 上。此设置将导致工件存储在远程数据库上。它仍然需要调整才能连接到 s3。

无论如何 minikube 仍然是一个轻量级的 kubernetes 发行版,主要针对学习,所以如果你坚持太久,你最终会遇到另一个限制。

希望能帮助到你。

关于docker - MLflow Kubernetes Pod 部署,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61089001/

相关文章:

docker - docker 是使应用程序跨平台的解决方案吗?

amazon-web-services - 如何从 kubernetes pod 中识别主机云提供商?

kubernetes - 如何使用 Terraform 在 AWS EKS 上为 kubernetes 设置 letencrypt 证书颁发者

python - 使用 MLflowClient 嵌套运行

python - 如何在 mlflow.start_run() 中获取当前的 run_id?

nginx - 如何在 mlFlow 服务器上运行身份验证?

docker - vmwarevsphere上的Windows docker

wordpress - 在 wordpress docker 中编辑默认的 .htaccess

python - 在 docker 容器上安装 rdiff

kubernetes - 如何将文件内容传递给Helm values.yaml