Kubernetes MLflow服务Pod连接

时间:2020-04-21 18:54:46

标签: kubernetes kubernetes-service mlflow

我已经在kubernetes集群中的Pod上部署了一个mlflow版本。我可以移植到mlflow ui,现在尝试对其进行测试。为此,我要在同一群集中另一个Pod上运行的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'))

我在Yaml和docker中显示了我部署mlflow pod的方式:

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服务器命令mlflow server --default-artifact-root ${AWS_MLFLOW_BUCKET} --host 0.0.0.0 --port 5000的脚本时,我无法连接到使用该mlflow pod创建的服务。

我已经尝试使用跟踪uri http://mlflow-tracking-server.default.svc.cluster.local:5000,已经尝试使用服务EXTERNAL-IP:5000,但是我尝试的所有内容都无法使用该服务进行连接和登录。在将mlflow服务器Pod部署到kubernetes集群时,我有什么想念的吗?

2 个答案:

答案 0 :(得分:2)

您的 mlflow-tracking-server 服务应具有 ClusterIP 类型,而不是 LoadBalancer 类型。

两个Pod都在同一个Kubernetes集群中,因此,没有理由使用 LoadBalancer 服务类型。

对于应用程序的某些部分(例如,前端),您可能希望将服务公开到群集外部的外部IP地址上。 Kubernetes ServiceTypes允许您指定所需的服务类型。默认值为ClusterIP。

类型值及其行为为:

  • ClusterIP :在群集内部IP上公开服务。选择这个 值使得只能从群集内访问服务。这个 是默认的ServiceType。

  • NodePort :在静态端口(NodePort)上的每个节点IP上公开服务。 NodePort服务路由到的> ClusterIP服务会自动创建。您将能够通过以下方式从集群外部与NodePort服务联系: 要求:。

  • LoadBalancer :公开服务 在外部使用云提供商的负载均衡器。 NodePort和 外部负载均衡器路由到的ClusterIP服务是 自动创建。
  • 外部名称:将服务映射到内容 通过返回一个的外部名称字段(例如foo.bar.example.com) CNAME记录及其值。没有设置任何代理。

kubernetes.io

答案 1 :(得分:0)

因此,为了简化起见,您无法从jupyterhub pod访问mlflow uri。我在这里要做的是检查jupyterhub pod的代理。如果NO_PROXY中没有.svc,则必须添加它。一个详细的原因是您正在访问内部.svc mlflow URL,就像它在开放的Internet上一样。但是实际上您的mlflow uri仅可在集群内部访问。如果添加.svc不适用于没有代理无效的功能,我们可以对此进行更深入的研究。检查代理的方法是采用“ kubectl get po $ JHPODNAME -n $ JHNamespace -o yaml”