Kubernetes MLflow服务吊舱连接
我已经在kubernetes集群的一个pod中部署了一个mlflow构建。我能够向前移植到mlflow ui,现在我正在尝试测试它。为此,我在同一集群中另一个pod上运行的jupyter笔记本上运行以下测试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"
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