我已经在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集群时,我有什么想念的吗?
答案 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记录及其值。没有设置任何代理。
答案 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”