Kubernetes MLflow服务吊舱连接

Kubernetes MLflow服务吊舱连接,kubernetes,kubernetes-service,mlflow,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"

我已经在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'))
ConnectionError:HTTPConnectionPool(host='mlflow-tracking-server.default.svc.cluster.local',port=5000):url:/api/2.0/mlflow/runs/get超过最大重试次数?(由NewConnectionError(“:无法建立新连接:[Errno 111]连接被拒绝”)引起)
我在yaml和docker中部署mlflow吊舱的方式如下所示:

亚马尔:

---
apiVersion:apps/v1
种类:部署
元数据:
名称:mlflow跟踪服务器
名称空间:默认值
规格:
选择器:
火柴标签:
应用程序:mlflow跟踪服务器
副本:1份
模板:
元数据:
标签:
应用程序:mlflow跟踪服务器
规格:
容器:
-名称:mlflow跟踪服务器
图片:
端口:
-集装箱港口:5000
环境:
-名称:AWS_MLFLOW_桶
价值:
-名称:AWS\u访问\u密钥\u ID
价值来源:
secretKeyRef:
姓名:aws secret
密钥:AWS\u访问密钥\u ID
-名称:AWS\u密码\u访问\u密钥
价值来源:
secretKeyRef:
姓名:aws secret
密钥:AWS\u机密\u访问\u密钥
---
版本:v1
种类:服务
元数据:
名称:mlflow跟踪服务器
名称空间:默认值
标签:
应用程序:mlflow跟踪服务器
注释:
service.beta.kubernetes.io/aws-load-balancer-type:nlb
规格:
外部流量策略:本地
类型:负载平衡器
选择器:
应用程序:mlflow跟踪服务器
端口:
-名称:http
港口:5000
targetPort:http
dockerfile调用执行mlflow server命令的脚本:
mlflow server——默认工件根${AWS\u mlflow\u BUCKET}——主机0.0.0——端口5000
,但我无法连接到使用该mlflow pod创建的服务


我已尝试使用跟踪uri
http://mlflow-tracking-server.default.svc.cluster.local:5000
,我已经尝试使用EXTERNAL-IP:5000服务,但我尝试的一切都无法使用该服务连接和登录。在将我的mlflow服务器pod部署到kubernetes群集时,我是否遗漏了什么?

您的mlflow跟踪服务器服务应该是ClusterIP类型,而不是LoadBalancer

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

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

类型值及其行为是:

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

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

  • 负载平衡器:公开服务 外部使用云提供商的负载平衡器。节点端口和 外部负载平衡器路由到的ClusterIP服务 自动创建
  • 外部名称:将服务映射到内容 通过返回 CNAME记录及其值。未设置任何类型的代理


因此,为了简化这一点,您无法从jupyterhub pod访问mlflow uri。我在这里要做的是检查jupyterhub吊舱的代理。如果在NO_PROXY中没有.svc,则必须添加它。一个详细的原因是,您正在访问内部.svc mlflow url,就好像它位于开放的internet上一样。但实际上,您的mlflow uri只能在集群内部访问。如果adding.svc对任何代理都不起作用,我们可以更深入地了解这一点。检查代理的方法是使用“kubectl get po$JHPODNAME-n$JHNamespace-o yaml”

为运行Juniper笔记本的pod共享kubernetes清单。你能这么做吗?我没有jupyter笔记本的最新清单。我需要从中寻找什么?它是如何部署的?作为pod或部署?如果您知道名称和命名空间,
kubectl get-pod%pod\u name%-n%pod\u namespace%-o json
应该返回清单。您可以为跟踪服务器共享整个Dockerfile吗?如果没有它,很难重现这个问题。我也这么认为,所以我用ClusterIP类型重新创建了服务,但当我试图在集群中的一个pod上从jupyter笔记本测试它时,仍然会遇到相同的错误。好的。可能存在未侦听端口(5000)的问题
targetPort:http
也是可疑的。@JMV12,你能按照Paul的建议检查你的
targetPort
,并将其更改为容器侦听的端口吗?@JMV12你解决了这个问题吗?根本原因是什么?老实说,我不确定。我拆下装有mlflow和我的jupyternotebook的吊舱,再次旋转,它们现在可以工作了。
---
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