如何在MicroK8s环境中通过Python API连接Minio Pod
问题:MicroK8s中Minio控制台可访问但Python API无法连接
环境信息
执行microk8s kubectl get all --all-namespaces的输出:
NAMESPACE NAME READY STATUS RESTARTS AGE minio-operator pod/minio-operator-67dcf6dd7c-vxccn 0/1 Pending 0 7d22h kube-system pod/calico-node-bpd4r 1/1 Running 4 (26m ago) 8d kube-system pod/dashboard-metrics-scraper-7bc864c59-t7k87 1/1 Running 4 (26m ago) 8d kube-system pod/hostpath-provisioner-69cd9ff5b8-x664l 1/1 Running 4 (26m ago) 7d22h kube-system pod/kubernetes-dashboard-dc96f9fc-4759w 1/1 Running 4 (26m ago) 8d minio-operator pod/console-66c4b79fbd-mw5s8 1/1 Running 3 (26m ago) 7d22h kube-system pod/calico-kube-controllers-79568db7f8-vg4q2 1/1 Running 4 (26m ago) 8d kube-system pod/coredns-6f5f9b5d74-fz7v8 1/1 Running 4 (26m ago) 8d kube-system pod/metrics-server-6f754f88d-r7lsj 1/1 Running 4 (26m ago) 8d minio-operator pod/minio-operator-67dcf6dd7c-8dnlq 1/1 Running 9 (25m ago) 7d22h minio-operator pod/microk8s-ss-0-0 1/1 Running 9 (25m ago) 7d22h NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE default service/kubernetes ClusterIP 10.152.183.1 <none> 443/TCP 11d kube-system service/kube-dns ClusterIP 10.152.183.10 <none> 53/UDP,53/TCP,9153/TCP 8d kube-system service/metrics-server ClusterIP 10.152.183.43 <none> 443/TCP 8d kube-system service/kubernetes-dashboard ClusterIP 10.152.183.232 <none> 443/TCP 8d kube-system service/dashboard-metrics-scraper ClusterIP 10.152.183.226 <none> 8000/TCP 8d minio-operator service/operator ClusterIP 10.152.183.48 <none> 4222/TCP,4221/TCP 7d22h minio-operator service/console ClusterIP 10.152.183.193 <none> 9090/TCP,9443/TCP 7d22h minio-operator service/minio ClusterIP 10.152.183.195 <none> 80/TCP 7d22h minio-operator service/microk8s-console ClusterIP 10.152.183.192 <none> 9090/TCP 7d22h minio-operator service/microk8s-hl ClusterIP None <none> 9000/TCP 7d22h NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE kube-system daemonset.apps/calico-node 1 1 1 1 1 kubernetes.io/os=linux 8d NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE kube-system deployment.apps/coredns 1/1 1 1 8d kube-system deployment.apps/dashboard-metrics-scraper 1/1 1 1 8d kube-system deployment.apps/kubernetes-dashboard 1/1 1 1 8d minio-operator deployment.apps/console 1/1 1 1 7d22h kube-system deployment.apps/hostpath-provisioner 1/1 1 1 7d22h kube-system deployment.apps/calico-kube-controllers 1/1 1 1 8d kube-system deployment.apps/metrics-server 1/1 1 1 8d minio-operator deployment.apps/minio-operator 1/2 2 1 7d22h NAMESPACE NAME DESIRED CURRENT READY AGE kube-system replicaset.apps/coredns-6f5f9b5d74 1 1 1 8d kube-system replicaset.apps/dashboard-metrics-scraper-7bc864c59 1 1 1 8d kube-system replicaset.apps/kubernetes-dashboard-dc96f9fc 1 1 1 8d minio-operator replicaset.apps/console-66c4b79fbd 1 1 1 7d22h kube-system replicaset.apps/hostpath-provisioner-69cd9ff5b8 1 1 1 7d22h kube-system replicaset.apps/calico-kube-controllers-79568db7f8 1 1 1 8d kube-system replicaset.apps/metrics-server-6f754f88d 1 1 1 8d minio-operator replicaset.apps/minio-operator-67dcf6dd7c 2 2 1 7d22h NAMESPACE NAME READY AGE minio-operator statefulset.apps/microk8s-ss-0 1/1 7d22h
尝试的Python代码
client = Minio("microk8s-ss-0-0", secure=False) try: objects = client.list_objects("bucket-1", prefix='/', recursive=True) for obj in objects: print(obj.bucket_name) except InvalidResponseError as err: print(err)
错误信息
MaxRetryError: HTTPConnectionPool(host='microk8s-ss-0-0', port=80): Max retries exceeded with url: /bucket-1?delimiter=&encoding-type=url&list-type=2&max-keys=1000&prefix=%2F (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f29041e1e40>: Failed to establish a new connection: [Errno -3] Temporary failure in name resolution'))
已尝试的方法
- 使用Pod名称
microk8s-ss-0-0连接 - 使用Minio Service的ClusterIP
10.152.183.195连接
解决方案
1. 区分代码运行环境
集群外部运行代码
ClusterIP仅能在Kubernetes集群内部访问,外部机器无法直接连接,这是解析失败的核心原因。两种解决方式:
- 修改Service为NodePort类型:
执行后获取分配的NodePort:microk8s kubectl patch service minio -n minio-operator -p '{"spec":{"type":"NodePort"}}'
代码中使用microk8s kubectl get service minio -n minio-operator集群节点IP:NodePort作为地址,示例:client = Minio("192.168.1.100:30000", secure=False) # 替换为你的节点IP和NodePort - 端口转发临时访问:
在集群节点执行命令,将Minio Service的80端口映射到本地9000端口:
代码中用microk8s kubectl port-forward service/minio -n minio-operator 9000:80localhost:9000连接:client = Minio("localhost:9000", secure=False)
集群内部运行代码
如果代码在集群内Pod中运行,直接用Service的DNS名称访问:
- 同命名空间:
minio:80 - 跨命名空间:
minio.minio-operator.svc.cluster.local:80
2. 添加Minio认证信息
你的代码缺少Access Key和Secret Key,Minio默认需要认证才能访问。补充认证信息的代码示例:
from minio import Minio from minio.error import InvalidResponseError # 替换为你的Minio Access Key和Secret Key client = Minio( "localhost:9000", # 根据环境替换为正确地址 access_key="YOUR_ACCESS_KEY", secret_key="YOUR_SECRET_KEY", secure=False ) try: objects = client.list_objects("bucket-1", prefix='/', recursive=True) for obj in objects: print(obj.bucket_name) except InvalidResponseError as err: print(err)
3. 确认端口映射正确性
从kubectl输出可见,Minio Service的80端口对应Pod的9000端口(StatefulSet的microk8s-hl服务暴露9000端口),确保连接时使用正确的端口。
内容的提问来源于stack exchange,提问作者Mark C
相关产品推荐
相关产品推荐

