【问题标题】:Unable to curl to external IP无法卷曲到外部 IP
【发布时间】:2020-04-16 03:38:39
【问题描述】:

我无法 curl 到服务的外部 IP。我的 Kubernetes 集群部署在 GKE 上。

$ kubectl run kubia-container --image=australia/kubia_py --port=8080 --generator=run/v1
kubectl run --generator=run/v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
replicationcontroller/kubia-container created

$ kubectl get pods
NAME          READY  STATUS  RESTARTS  AGE
kubia-container-6b2cs  1/1   Running  0     25s

$ kubectl expose rc kubia-container --type=LoadBalancer --name kubia-http
service/kubia-http exposed

$ kubectl get pods,svc,rc
NAME            READY  STATUS  RESTARTS  AGE
pod/kubia-container-6b2cs  1/1   Running  0     93m

NAME         TYPE      CLUSTER-IP  EXTERNAL-IP  PORT(S)     AGE
service/kubernetes  ClusterIP   10.0.0.1   <none>     443/TCP     6h28m
service/kubia-http  LoadBalancer  10.0.4.238  35.188.42.26  8080:30030/TCP  91m

$ curl 35.188.42.26:8080
curl: (7) Failed to connect to 35.188.42.26 port 8080: Connection refused

【问题讨论】:

    标签: google-kubernetes-engine kubectl


    【解决方案1】:

    试试localhost:30030,这是暴露给主机的节点端口。

    如果这不起作用,则意味着您的容器没有在 8080 中侦听,您可以测试进入 pod 并 curl localhost:8080

    【讨论】:

      【解决方案2】:

      我已经尝试了很多方法来实现您想要的。我假设这张图片australia/kubia_py 是您的自定义图片。我认为您无法在文件nodeapp.py 中的此图像中卷曲此服务,您输入的条目如下:

      server = HTTPServer(('localhost', 8080), GetHandler) 
      print ("Starting server, use <Ctrl-C> to stop") 
      server.serve_forever()
      

      此外,如果您检查容器内的netstat,您会看到它正在侦听127.0.0.1:8080

      # netstat -plnt
      Active Internet connections (only servers)
      Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
      tcp        0      0 127.0.0.1:8080          0.0.0.0:*               LISTEN      1/python3
      

      我认为你应该指定0.0.0.0 来监听所有接口,而不是'localhost'。

      我发现只有一种方法可以实现此replicacontroller 应用程序的输出(我建议将来尝试使用deployments)是使用web-preview。为此,您需要 port-forward 您的 pod。

      $ kubectl get pods
      NAME                    READY   STATUS    RESTARTS   AGE
      kubia-container-95rrq   1/1     Running   0          44m
      user@cloudshell:~ (project-name)$ kubectl port-forward kubia-container-95rrq 8888:8080
      Forwarding from 127.0.0.1:8888 -> 8080
      Handling connection for 8888
      Handling connection for 8888
      

      端口8888 只是我选择的默认端口之一。菜单中有一些。

      并使用WebPreview(使用来自云外壳的按钮)。能够实现如下输出:

      CLIENT VALUES:
      client_address=('127.0.0.1', 46696) (127.0.0.1)
      command=GET
      path=/?authuser=0
      real path=/
      query=authuser=0
      request_version=HTTP/1.1
      
      SERVER VALUES:
      server_version=BaseHTTP/0.6
      sys_version=Python/3.6.9
      protocol_version=HTTP/1.0
      host_name=kubia-container-95rrq
      host_ip=10.44.1.26
      

      此外,如果您要公开replicacontrollerdeployment,请记住,如果您只设置--port=8080,它也会自动将--port-target 设置为8080。如果您使用kubectl expose 来使用标志--port=XX--target-port=xxxx,这是首选。

      如果您想检查kubia replicacontrollerservice,您可以使用this example,如下所示:

      $ kubectl apply -f kubia-rc-and-service-v1.yaml
      replicationcontroller/kubia-v1 created
      service/kubia created
      user@cloudshell:~ (your-project)$ kubectl get rc,svc
      NAME                                    DESIRED   CURRENT   READY   AGE
      replicationcontroller/kubia-v1          3         3         3       40s
      
      NAME                      TYPE           CLUSTER-IP    EXTERNAL-IP      PORT(S)          AGE
      service/kubernetes        ClusterIP      10.0.48.1     <none>           443/TCP          8h
      service/kubia             LoadBalancer   10.0.51.154   35.240.23.237    80:30785/TCP     40s
      $ curl 35.240.23.237:80
      This is v1 running in pod kubia-v1-zpj6s
      

      另一个公开服务和访问它的好例子你可以在Official GKE docs找到。

      【讨论】:

        猜你喜欢
        • 2010-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-13
        • 2012-04-09
        • 2014-04-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多