通过kubernetes nodeport我无法访问该应用程序

时间:2019-12-01 21:51:24

标签: docker kubernetes

我将服务配置为建立在8080端口上。

我的docker映像也在8080上。

我将 ReplicaSet 设置为这样的配置

apiVersion: apps/v1
kind: ReplicaSet
metadata:
 name: my-app-backend-rs
      spec:
       containers:
       - name: my-app-backend
         image: go-my-app-backend
         ports:
         - containerPort: 8080
         imagePullPolicy: Never

最后,我还在端口8080上使用以下配置创建类型为 NodePort 的服务:

apiVersion: v1
kind: Service
metadata:
 labels:
  app: my-app-backend-rs
 name: my-app-backend-svc-nodeport
spec:
 type: NodePort
 ports:
 - port: 8080
   protocol: TCP
   targetPort: 8080
 selector:
  app: my-app-backend

在我对NodePort进行描述之后,我看到我应该在地址http://127.0.0.1:31859上击打(例如curl http://127.0.0.1:31859/)到我的应用程序,但是我没有任何反应。

Type:                     NodePort
IP:                       10.110.250.176
Port:                     <unset>  8080/TCP
TargetPort:               8080/TCP
NodePort:                 <unset>  31859/TCP
Endpoints:                172.17.0.6:8080
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

我不明白什么,我做错了什么?谁能给我解释一下?

2 个答案:

答案 0 :(得分:1)

从您的输出中,我看到在端点下面创建了。因此似乎有一个Pod已准备好为该节点端口服务提供服务。因此,标签现在不是问题。

Endpoints:                172.17.0.6:8080

首先,使用kubectl exec -it podname sh(如果在该Pod容器中运行的映像上安装了curl)登录Pod,请首先确保您能够通过运行curl http://podhostname:8080命令访问该应用程序。如果没有将curl大使容器容器作为小车运行,请尝试从该容器访问http:// <>:8080并确保其正常工作。

请记住,如果您是从主节点运行此命令,则您不能以本地主机的身份访问nodeport服务,因为它将指向您的主节点。 您必须通过以下方法访问此服务。

<CLUSTERIP:PORT>---In you case:10.110.250.176:80
                      <1st node's IP>:31859
                      <2nd node's IP>:31859

答案 1 :(得分:1)

  

我尝试在kubectl exec -it podname sh之后使用curl

在这个示例中,在sh命令前的双破折号被遗漏了。 请注意,可以随时使用kubectl exec -h检查正确的语法,该语法应类似于:

kubectl exec (POD | TYPE/NAME) [-c CONTAINER] [flags] -- COMMAND [args...] [options]

如果每个吊舱只有一个容器,则可以简化为:

kubectl exec -it PODNAME -- COMMAND

不挑剔容器的警告是,如果该Pod上有多个容器,则将您连接到第一个容器:)

示例:kubectl exec -it pod/frontend-57gv5 -- curl localhost:80

  

我也尝试打10.110.250.176:80:31859,但这是不正确的。抱歉,但是我是网络方面的新手。

是的,这是不正确的,因为:port的值出现两次。在该示例中,需要点击10.110.250.176:80(因为10.110.250.176是“ Cluster_IP”)

  

在我对NodePort进行描述之后,我看到我应该在地址http://127.0.0.1:31859上击打(例如curl http://127.0.0.1:31859/)到我的应用程序,但是我没有任何反应。

这取决于您要在哪里运行该命令。

在这种情况下,不清楚您在ReplicaSet配置中输入了什么(如果Service selector ReplicaSet的< em> labels ),所以让我解释一下“该应该如何工作”。

假设我们有以下ReplicaSet(下面的示例是official documentation on topic的稍微修改后的版本):

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: frontend-rs
  labels:
    app: guestbook
    tier: frontend-meta
spec:
  # modify replicas according to your case
  replicas: 2
  selector:
    matchLabels:
      tier: frontend-label 
  template:
    metadata:
      labels:
        tier: frontend-label      ## shall match spec.selector.matchLabels.tier
    spec:
      containers:
      - name: php-redis
        image: gcr.io/google_samples/gb-frontend:v3

以及以下服务:

apiVersion: v1
kind: Service
metadata:
 labels:
  app: frontend
 name: frontend-svc-tier-nodeport
spec:
 type: NodePort
 ports:
 - port: 80
   protocol: TCP
   targetPort: 80
 selector:
   tier: frontend-label   ## shall match labels from ReplicaSet spec

我们可以创建ReplicaSet(RS)和服务。结果,我们将能够看到RS,窗格,服务和端点:

kubectl get rs -o wide
NAME          DESIRED   CURRENT   READY   AGE   CONTAINERS   IMAGES                                 SELECTOR
frontend-rs   2         2         2       10m   php-redis    gcr.io/google_samples/gb-frontend:v3   tier=frontend-label

kubectl get pods -o wide
NAME                    READY   STATUS    RESTARTS   AGE    IP           NODE                                            
frontend-rs-76sgd       1/1     Running   0          11m    10.12.0.31   gke-6v3n
frontend-rs-fxxq8       1/1     Running   0          11m    10.12.1.33   gke-m7z8 

kubectl get svc -o wide
NAME                         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                          AGE     SELECTOR
frontend-svc-tier-nodeport   NodePort    10.0.5.10    <none>        80:32113/TCP                     9m41s   tier=frontend-label

kubectl get ep -o wide
NAME                         ENDPOINTS                                                     AGE
frontend-svc-tier-nodeport   10.12.0.31:80,10.12.1.33:80                                   10m

kubectl describe svc/frontend-svc-tier-nodeport
Selector:                 tier=frontend-label
Type:                     NodePort
IP:                       10.0.5.10
Port:                     <unset>  80/TCP
TargetPort:               80/TCP
NodePort:                 <unset>  32113/TCP
Endpoints:                10.12.0.31:80,10.12.1.33:80

从我的示例中可以看到的重要一点是,已为我们创建的服务将端口设置为80:32113 / TCP。

这将使我们能够以几种不同的方式访问“ gb-frontend:v3”应用程序:

  • 从群集内部:curl 10.0.5.10:80
    (CLUSTER-IP:PORT)或curl frontend-svc-tier-nodeport:80
  • 来自外部网络(互联网):curl PUBLIC_IP:32113 这里PUBLIC_IP是您可以访问群集中的节点的IP。群集中的所有节点都在NodePort上侦听并根据服务的选择器转发请求。
  • 来自节点:curl localhost:32113

希望有帮助。