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

时间:2017-12-15 11:35:36

标签: docker proxy kubernetes kubectl

我正在尝试使用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

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

4 个答案:

答案 0 :(得分:4)

您的服务规范定位所有标签为&#34; app = kubectl-test-189010&#34;您的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/

答案 1 :(得分:2)

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

部署是一个对象,它将创建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 :(得分:2)

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

答案 3 :(得分:2)

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

我还建议使用部署而不是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