【发布时间】:2022-01-11 18:11:39
【问题描述】:
我已经使用Kompose 将以下 docker-compose 转换为 Kubernetes:
---
version: '3'
services:
freqtrade:
image: mllamaza/mycoolimg:latest
restart: unless-stopped
container_name: mycoolimg
volumes:
- "./user_data:/freqtrade/user_data"
ports:
- "8080:8080"
command: >
start
--logfile /data/logs/records.log
如果我在它上面运行docker-compose up -d,它工作得非常好。但是,在 Kubernetes 下运行等价物时,Pod 无法进行任何外部 HTTP/S 调用并抛出此错误:
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='mywebsite.com', port=443): Max retries exceeded with url: /my/cool/url/ (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x7f95197d2a30>: Failed to establish a new connection: [Errno -3] Temporary failure in name resolution'))
另外,图片还有一个前端网页,可以从http://0.0.0.0:8080访问。
我使用 Minikube,their documentation 保持不变:
LoadBalancer 类型的服务可以通过
minikube tunnel公开 命令。它必须在单独的终端窗口中运行以保持 LoadBalancer 正在运行。
这正是我所做的,该命令没有显示错误:
❯ minikube tunnel
[sudo] password for mllamaza:
Status:
machine: minikube
pid: 1513359
route: 10.96.0.0/12 -> 192.168.49.2
minikube: Running
services: []
errors:
minikube: no errors
router: no errors
load balancer emulator: no errors
但是,如您所见,pod 失败了,因为它无法访问外部 IP(我检查了日志),并且 service/mycoolimg 没有按照文档中所示配置外部 IP:
❯ k get all
NAME READY STATUS RESTARTS AGE
pod/mycoolimg-868cdd75bf-krgp6 0/1 CrashLoopBackOff 2 (15s ago) 47s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/mycoolimg ClusterIP 10.105.7.210 <none> 8080/TCP 47s
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2d13h
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/mycoolimg 0/1 1 0 47s
NAME DESIRED CURRENT READY AGE
replicaset.apps/mycoolimg-868cdd75bf 1 1 0 47s
我错过了什么?这是 Kompose 转换问题和 Minikube 特定配置,还是我错过了一些 Kubernetes 步骤?
这是服务输出:
apiVersion: v1
kind: Service
metadata:
annotations:
kompose.cmd: kompose convert --volumes hostPath -o ./deployment
kompose.version: 1.26.0 (40646f47)
creationTimestamp: null
labels:
io.kompose.service: mycoolimg
name: mycoolimg
spec:
ports:
- name: "8080"
port: 8080
targetPort: 8080
selector:
io.kompose.service: mycoolimg
status:
loadBalancer: {}
这是部署:
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
kompose.cmd: kompose convert --volumes hostPath -o ./deployment
kompose.version: 1.26.0 (40646f47)
creationTimestamp: null
labels:
io.kompose.service: mycoolimg
name: mycoolimg
spec:
replicas: 1
selector:
matchLabels:
io.kompose.service: mycoolimg
strategy:
type: Recreate
template:
metadata:
annotations:
kompose.cmd: kompose convert --volumes hostPath -o ./deployment
kompose.version: 1.26.0 (40646f47)
creationTimestamp: null
labels:
io.kompose.service: mycoolimg
spec:
containers:
- args:
- start
- --logfile
- /data/logs/records.log
image: mllamaza/mycoolimg:latest
name: mycoolimg
ports:
- containerPort: 8080
resources: {}
volumeMounts:
- mountPath: /data
name: mycoolimg-hostpath0
restartPolicy: Always
volumes:
- hostPath:
path: /udata
name: mycoolimg-hostpath0
status: {}
【问题讨论】:
-
LoadBalancer 服务和“外部 IP”字段仅用于接受 inbound 连接;您不需要这些就可以从集群中进行调用。 (另外,“外部 IP”永远不会在 minikube 中设置。)如果您只是按原样运行应用程序并尝试调用,会发生什么?
-
感谢您的回复。另外,请注意,该 pod 还包含一个前端网页,可以通过 0.0.0.0:8080 访问(我已经编辑了帖子),因此,我认为 LoadBalancer 在这种情况下是有意义的。无论如何,我试图省略服务创建,但错误仍然存在:pod 无法进行任何外部 HTTP/S 调用。
-
您得到的实际错误是什么?是否有任何与此相关的特定应用程序代码?您显示的诊断结果表明 Pod 没有启动(Pod 本身处于 CrashLoopBackOff 状态,部署已准备好 0/1 副本),我会尝试在担心服务细节之前对其进行调试。
-
我已将该信息添加到问题中,但恐怕它与问题没有直接关系,因为使用 docker-compose 进行部署按预期工作,但是在使用 Kubernetes 时,它无法连接到任何外部 IP。
标签: docker kubernetes minikube kompose