暴露hello-minikube服务无法找到端口。

7

我可以创建容器:

$ kubectl run hello-minikube --image=gcr.io/google_containers/echoserver:1.4 --port=
deployment "hello-minikube" created

我现在正在尝试暴露一个服务:

$ kubectl expose deployment hello-minikube --type=NodePort
error: couldn't find port via --port flag or introspection

即使我删除它,它仍会自动回来:
$ kubectl delete pod hello-minikube-2138963058-2szl7
pod "hello-minikube-2138963058-2szl7" deleted
[stephane@stephane-ThinkPad-X201 ~]
$ kubectl get pods
NAME                              READY     STATUS    RESTARTS   AGE
hello-minikube-2138963058-nhh1q   1/1       Running   0          3m

这是Pod:
$ kubectl get pods
NAME                              READY     STATUS    RESTARTS   AGE
hello-minikube-2138963058-2szl7   1/1       Running   0          16m

并且它的描述:

$ kubectl describe pod hello-minikube-2138963058-2szl7
Name:       hello-minikube-2138963058-2szl7
Namespace:  default
Node:       minikube/192.168.42.196
Start Time: Thu, 14 Sep 2017 23:20:03 +0200
Labels:     pod-template-hash=2138963058
        run=hello-minikube
Annotations:    kubernetes.io/created-by={"kind":"SerializedReference","apiVersion":"v1","reference":{"kind":"ReplicaSet","namespace":"default","name":"hello-minikube-2138963058","uid":"2b37ca13-9968-11e7-a720-525400...
Status:     Running
IP:     172.17.0.3
Created By: ReplicaSet/hello-minikube-2138963058
Controlled By:  ReplicaSet/hello-minikube-2138963058
Containers:
  hello-minikube:
    Container ID:   docker://5e4ba407d8869e6e843ec3d7876e953147cc01104e980c7febfea218808ab379
    Image:      gcr.io/google_containers/echoserver:1.4
    Image ID:       docker-pullable://gcr.io/google_containers/echoserver@sha256:5d99aa1120524c801bc8c1a7077e8f5ec122ba16b6dda1a5d3826057f67b9bcb
    Port:       <none>
    State:      Running
      Started:      Thu, 14 Sep 2017 23:20:05 +0200
    Ready:      True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-t8qx7 (ro)
Conditions:
  Type      Status
  Initialized   True 
  Ready     True 
  PodScheduled  True 
Volumes:
  default-token-t8qx7:
    Type:   Secret (a volume populated by a Secret)
    SecretName: default-token-t8qx7
    Optional:   false
QoS Class:  BestEffort
Node-Selectors: <none>
Tolerations:    <none>
Events:
  FirstSeen LastSeen    Count   From            SubObjectPath           Type        Reason          Message
  --------- --------    -----   ----            -------------           --------    ------          -------
  17m       17m     1   default-scheduler                   Normal      Scheduled       Successfully assigned hello-minikube-2138963058-2szl7 to minikube
  17m       17m     1   kubelet, minikube                   Normal      SuccessfulMountVolume   MountVolume.SetUp succeeded for volume "default-token-t8qx7" 
  17m       17m     1   kubelet, minikube   spec.containers{hello-minikube} Normal      Pulled          Container image "gcr.io/google_containers/echoserver:1.4" already present on machine
  17m       17m     1   kubelet, minikube   spec.containers{hello-minikube} Normal      Created         Created container
  17m       17m     1   kubelet, minikube   spec.containers{hello-minikube} Normal      Started         Started container

在Linux上运行minikube主机上的所有内容。
2个回答

8
您之所以遇到此错误,是因为您没有从命令 kubectl run hello-minikube --image=gcr.io/google_containers/echoserver:1.4 --port= 设置容器端口,因此暴露命令不知道将哪个容器端口映射到节点端口,从而出现错误。
您需要按照以下方式设置确切的容器端口:kubectl run hello-minikube --image=gcr.io/google_containers/echoserver:1.4 --port=80,假设 80 是端口号,然后再次运行暴露命令。
请看下面逐步重现您的错误并进行修复的步骤。
C:\Users\innocent.anigbo\.minikube>kubectl run hello-kube --image=gcr.io/google_
containers/echoserver:1.4 --port=
deployment "hello-kube" created

C:\Users\innocent.anigbo\.minikube>kubectl get pods
NAME                             READY     STATUS    RESTARTS   AGE
hello-kube-1448409582-c9sm5      1/1       Running   0          1m
hello-minikube-938614450-417hj   1/1       Running   1          8d
hello-nginx-3322088713-c4rp4     1/1       Running   0          6m

C:\Users\innocent.anigbo\.minikube>kubectl get deployment
NAME             DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
hello-kube       1         1         1            1           2m
hello-minikube   1         1         1            1           8d
hello-nginx      1         1         1            1           7m

C:\Users\innocent.anigbo\.minikube>kubectl get service
NAME          CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
hello-nginx   10.0.0.136   <nodes>       80:32155/TCP   4m
kubernetes    10.0.0.1     <none>        443/TCP        20d

C:\Users\innocent.anigbo\.minikube>kubectl expose deployment hello-kube --type=N
odePort
error: couldn't find port via --port flag or introspection
See 'kubectl expose -h' for help and examples.

C:\Users\innocent.anigbo\.minikube>kubectl delete deployment hello-kube
deployment "hello-kube" deleted

C:\Users\innocent.anigbo\.minikube>kubectl get pods
NAME                             READY     STATUS    RESTARTS   AGE
hello-minikube-938614450-417hj   1/1       Running   1          8d
hello-nginx-3322088713-c4rp4     1/1       Running   0          11m

C:\Users\innocent.anigbo\.minikube>kubectl run hello-kube --image=gcr.io/google_
containers/echoserver:1.4 --port=80
deployment "hello-kube" created

C:\Users\innocent.anigbo\.minikube>kubectl get pods
NAME                             READY     STATUS    RESTARTS   AGE
hello-kube-2715294448-0rxf2      1/1       Running   0          3s
hello-minikube-938614450-417hj   1/1       Running   1          8d
hello-nginx-3322088713-c4rp4     1/1       Running   0          11m

C:\Users\innocent.anigbo\.minikube>kubectl expose deployment hello-kube --type=N
odePort
service "hello-kube" exposed

C:\Users\innocent.anigbo\.minikube>kubectl get service
NAME          CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
hello-kube    10.0.0.137   <nodes>       80:30004/TCP   3s
hello-nginx   10.0.0.136   <nodes>       80:32155/TCP   9m
kubernetes    10.0.0.1     <none>        443/TCP        20d

我可以暴露服务 kubectl run hello-minikube --image=gcr.io/google_containers/echoserver:1.4 --port=82kubectl expose deployment hello-minikube --type=NodePort,它显示了服务 $ kubectl get services NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE hello-minikube 10.0.0.81 <nodes> 82:32515/TCP 4h,但尝试连接失败 $ curl $(minikube service hello-minikube --url) curl: (7) Failed to connect to 192.168.42.196 port 32515: Connection refused - Stephane
但是,如果我使用端口82而不是端口8080,它就能正常工作。我以为我可以在这里选择自己的端口。这不是这样吗? - Stephane
1
不,你不能使用自己的端口或任何随机端口。这必须是容器监听流量的端口,就像在图像“echoserver:1.4”中一样。您将从记录图像的库中获取此端口号。8080仅起作用,因为您有幸猜对了正确的端口。下次最好您只需从图像文档中检查这一点,以使这更容易。 - Innocent Anigbo

2

您的 Pod 再次出现是因为 Deployment 为容器创建了一个副本集,如果当前 Pod 终止,则会创建一个新的 Pod。

运行以下命令以检查是否已部署副本集。

kubectl get rs

理想情况下,您应该删除整个部署

kubectl delete deployment <name>

作为一个 Kubernetes 新手,我对环境和 Pod 的了解不够,没能删除正确的那个。您的回答连同 Innocent Anigbo 上面的那个解决了我的问题。 - Stephane

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接