如何从Kubernetes pod进行HTTP/S外部调用



我已经使用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,他们的文档保持不变:

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(我检查了日志(,并且服务/mycolimg没有配置外部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

我错过了什么?这是Komspose转换问题和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: {}

您应该关注的第一件事是pod上的CrashLoopBackOff错误,这表明容器中发生了一些事情,导致pod崩溃,您可以在这里找到一篇关于如何调试此错误1的非常好的文章。

根据提供的信息和代码,问题似乎出在应用程序本身;更准确地说,Docker和Kubernetes处理入口点和命令的方式,可能入口点是作为命令传递给Kubernete的,反之亦然?

在通过复制您的环境但使用不同的映像并取出启动命令成功运行pod后得出了这个结论:

---
version: '3'
services:
freqtrade:
image: expressjs
restart: unless-stopped
container_name: mycoolimg
volumes:
- "./user_data:/freqtrade/user_data"
ports:
- "8080:8080"
#    command: >
#      start
#      --logfile /data/logs/records.log

使用kompose通过命令kompose convert --volumes hostPath转换为kubernetes,我得到以下输出:

WARN Restart policy 'unless-stopped' in service freqtrade is not supported, convert it to 'always' 
INFO Kubernetes file "freqtrade-service.yaml" created 
INFO Kubernetes file "freqtrade-deployment.yaml" created 

使用命令kubectl apply -f freqtrade-deployment.yaml应用部署,我可以看到吊舱正在运行:

NAME                         READY   STATUS    RESTARTS      AGE
freqtrade-86cd7d4469-dkhmw   1/1     Running   0             7s

注意:根据您在minikube 2中推送/拉取图像的方法,您可能需要在容器规范下添加imagePullPolicy: Never

spec:
containers:
- image: expressjs
imagePullPolicy: Never
name: mycoolimg
ports:
- containerPort: 8080

最新更新