【问题标题】:How to make HTTP/S external calls from Kubernetes pods?如何从 Kubernetes pod 进行 HTTP/S 外部调用?
【发布时间】: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


【解决方案1】:

您首先应该查看的是 pod 上的 CrashLoopBackOff 错误,这表明该容器中正在发生的事情正在使您的 pod 崩溃,您可以在此处找到一篇非常好的文章,介绍如何调试这个错误1

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

通过复制您的环境但使用不同的映像并取出启动命令成功运行 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 应用部署,我可以看到 pod 正在运行:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-14
    • 1970-01-01
    • 1970-01-01
    • 2017-10-27
    • 2020-07-27
    相关资源
    最近更新 更多