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

问题描述 投票:6回答:4

我正在尝试使用Kubernetes运行我的应用程序我已经从名为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时,我无法在那里看到我的应用程序,我没有得到任何错误,但我不会出现什么问题!

编辑

我必须使用以下方法创建部署:

`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

没有定义端点。我想这是问题所在?我该如何建立终点?

docker proxy kubernetes kubectl
4个回答
4
投票

您的服务规范针对所有pod,其标签为“app = kubectl-test-189010”,您的pod的规范没有。

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

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

您的服务也接受端口8000上的连接,然后将其转发到pod上的端口8000(targetPort)。但pod侦听端口8080(containerPort)。因此,应将其中一个更改为匹配另一个 - targetPort或containerPort。

您可以在此处阅读有关在Kubernetes中配置服务的更多信息:https://kubernetes.io/docs/concepts/services-networking/service/


2
投票

对于初学者,请确保您知道自己想要完成的任务。你说servicedeployment,但你的文件是指服务和Pod。

部署是一个对象,它将创建ReplicaSet并对其进行扩展,以便在集群中启动特定的一组底层Pod。从Deployments元数据中获取,它们将具有一些标签。这些标签是Service将匹配(labels&selectors)的选择器。我确实假设您确实想要使用部署,以利用诸如滚动更新之类的东西(在很多情况下通常非常难以更新Pod,并且您最终会删除并手动重新创建它)或缩放。

有了这个假设,你需要部署(如果你真的想采用“手动”的方式,那就是Pod),这就像下面的那样

metadata:
  labels:
    app: myappname

其次是具有选择器defined的服务

selector:
  app: myappname

这应该足以让你有一个工作的设置,你应该看到你的服务现在将有活动的端点(假设您的pod已启动并处于Ready状态。

此外,如果您想在标签中包含版本,那么您可以。使用服务定位特定的pod版本,或者将其用于pod亲缘关系等其他原因,你应该将它分成两个标签,如

metadata:
  labels:
    app: myappname
    ver: v12

2
投票

我能够修复它,我不得不更改dokcerfile并做了一些调整,然后我的deployment.yaml文件也必须稍微更改一下,主要是在我的service.yaml中添加正确的名称和端口号,以及最后我的webpack配置已经改变了!


2
投票

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

我还建议使用Deployment而不是Pod。使用kubectl创建部署时,使用部署将自动创建所需的ReplicaSet和Pod。

我不确定你想要的NodePort是什么,但如果你想在端口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

© www.soinside.com 2019 - 2024. All rights reserved.