Kubernetes无法在给定的IP上看到我的应用程序

我正在尝试使用Kubernetes来运行我的应用程序我已经从文件中创build了一个名为deployment.yaml ,该文件名为service.yaml

这里是deployment.yaml的内容:

 apiVersion: v1 kind: Pod metadata: name: kubectl-test spec: containers: - name: kubectl-test image: gcr.io/[my-name]/node-app:0.0.1 imagePullPolicy: Always ports: - containerPort: 8080 hostPort: 8080 

这是我的services.yaml

 kind: Service apiVersion: v1 metadata: #Service name name: kubectl-test-node-app spec: selector: app: kubectl-test-189010 ports: - protocol: TCP port: 8000 targetPort: 8000 type: LoadBalancer 

当我运行命令kubectl get deployments ,我可以看到:

 NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE kubernetes-bootcamp 1 1 1 1 16m 

我可以看到我的服务使用kubectl get services ,我可以看到:

 NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubectl-test-node-app LoadBalancer 10.59.242.211 35.195.2.76 8000:31592/TCP 8m kubernetes ClusterIP 10.59.240.1 <none> 443/TCP 1d 

当我尝试访问EXTERNAL-IP:8000我不能在那里看到我的应用程序,我没有得到任何错误,但我什么都没有出错!

编辑

我不得不创build部署使用:

 `kubectl run kubernetes-bootcamp --image=[image-name] --port=8080` 

但不是用这个命令

 `kubectl create -f deployment.yaml` 

这是关系到端口: 8000:31592/TCP

 kubectl get pods kubectl-test 1/1 Running 0 4h kubernetes-bootcamp-1654181842-czwqg 1/1 Running 0 3h 

编辑

运行命令kubectl describe services kubectl-test-node-app返回:

 Name: kubectl-test-node-app Namespace: default Labels: <none> Annotations: <none> Selector: app=kubectl-test-189010 Type: LoadBalancer IP: 10.59.242.211 LoadBalancer Ingress: 35.195.2.76 Port: <unset> 8000/TCP TargetPort: 8000/TCP NodePort: <unset> 31592/TCP Endpoints: <none> Session Affinity: None External Traffic Policy: Cluster Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal CreatingLoadBalancer 58m service-controller Creating load balancer Normal CreatedLoadBalancer 57m service-controller Created load balancer 

没有定义端点。 我猜这是问题? 我如何build立终点?

您的服务规范将所有标签为“app = kubectl-test-189010”的pod作为您的pod规范所没有的标签。

您需要更新pod的元数据,以便与服务规范中的select器匹配:

  metadata: name: kubectl-test app: kubectl-test-189010 

您的服务也接受端口8000上的连接,然后将其转发到端口上的端口8000(targetPort)。 但是pod在端口8080(containerPort)上监听。 所以他们中的一个应该改为匹配另一个targetPort或containerPort。

您可以在这里阅读更多关于在Kubernetes中configuration服务的信息: https ://kubernetes.io/docs/concepts/services-networking/service/

正如@Leonid Talalaev所说的,您的pod和服务中的select器不同步。 此外,看看输出kubectl get services ,您的应用程序暴露在群集之外的NodePort 31592.您是否尝试使用此端口访问应用程序?

我也build议使用部署,而不是Pod。 使用部署将在您使用kubectl创build部署时自动创build所需的ReplicaSet和Pod(s)。

我不确定你想要的NodePort是什么,但是如果你想在32000端口的集群之外公开你的应用程序(例如),你可以使用下面的configuration。 那么你应该可以通过http://<CLUSTER_IP>:32000/访问你的应用http://<CLUSTER_IP>:32000/

 # deployment.yml apiVersion: extensions/v1beta1 kind: Deployment metadata: name: kubectl-test labels: app: kubectl-test spec: replicas: 3 strategy: {} template: metadata: labels: app: kubectl-test spec: containers: - image: gcr.io/[my-name]/node-app:0.0.1 name: kubectl-test ports: - containerPort: 8080 resources: {} restartPolicy: Always status: {} # service.yml kind: Service metadata: name: kubectl-test-node-app labels: app: kubectl-test spec: ports: - protocol: TCP name: "8080" port: 8080 targetPort: 8080 nodePort: 32000 selector: app: kubectl-test type: LoadBalancer sessionAffinity: None externalTrafficPolicy: Cluster status: loadBalancer: {} 

kubectl create -f deployment.yml
kubectl create -f service.yml

对于初学者,确保你知道你想要完成什么。 你说servicedeployment ,但你的文件引用服务和Pod。

部署是一个对象,它将创buildReplicaSets并对其进行扩展,以便在集群中启动一组特定的基础Pod。 从部署元数据获取,他们将有一些标签。 这些标签是什么服务将匹配它的select器( 标签和select器 )。 我假设你确实想要使用部署,来利用诸如滚动更新之类的东西(在很多情况下很难更新Pod,最后你会删除并重新创build它)或缩放。

有了这个假设,你需要部署(或Pod,如果你真的想去“手动”的方式),这有点像folowing

 metadata: labels: app: myappname 

接着是具有类似地定义的select器的服务

 selector: app: myappname 

这应该足够让你有一个工作设置,你应该看到你的服务现在将有活跃的terminal(假设你的豆荚启动,并在Ready状态。

另外,如果你想在你的标签中包含版本,那么你可以。 针对特定的pod版本与服务,或者也可以用于其他原因,如pod亲和力,你应该把它分成两个标签,如

 metadata: labels: app: myappname ver: v12 

我能够修复它,我不得不改变dokcerfile并做了一些调整,然后我的部署.yaml文件也必须改变一点,主要是添加正确的名称和端口号,并在我的service.yaml相同,最后我的webpackconfiguration已经改变了!