簡體   English   中英

如何從 Kubernetes pod 進行 HTTP/S 外部調用?

[英]How to make HTTP/S external calls from Kubernetes pods?

我使用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命令公開。 它必須在單獨的終端 window 中運行,以保持 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 步驟?

這是服務 output:

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 處理入口點和命令的方式,也許入口點作為命令傳遞給 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我得到以下 output:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM