入口资源无法访问公开的服务

时间:2018-06-26 13:37:05

标签: kubernetes kubernetes-ingress

嗨,我目前正在尝试使用Google kubernetes引擎部署我的应用程序。我将前端和后端服务公开为NodePort,创建了一个名为“ ip”的全局静态IP地址。我创建了一个入口资源。 在添加路径规则之前,入口资源工作正常。

这是我的入口资源

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress
  annotations:
    kubernetes.io/ingress.global-static-ip-name: ip
  labels:
    app: myapp
    part: ingress
spec:
 rules:
  - http:
      paths:
      - path: /*
        backend:
          serviceName: backapp
          servicePort: 9000
      - path: /front/*
        backend:
          serviceName: frontapp
          servicePort: 3000

这是我的服务 返回:

apiVersion:v1     种类:服务     元数据:

  labels:
    app: myapp
    part: back
  name: backapp
  namespace: default
spec:
  clusterIP: 10.*.*.*
  externalTrafficPolicy: Cluster
  ports:
  - nodePort: 30646
    port: 9000
    protocol: TCP
    targetPort: 9000
  selector:
    app:  myapp
    part: back
  sessionAffinity: None
  type: NodePort

前:

apiVersion: v1
kind: Service
metadata:
  labels:
    app: myapp
    part: front
  name: frontapp
  namespace: default
spec:
  clusterIP: 10.*.*.*
  externalTrafficPolicy: Cluster
  ports:
  - nodePort: 31609
    port: 3000
    protocol: TCP
    targetPort: 3000
  selector:
     app: myapp
     part: front
  sessionAffinity: None
  type: NodePort

每次我尝试去 http://external-ingress-ip/front

  

http://external-ingress-ip/front/home

     

http://external-ingress-ip/users

     

http://external-ingress-ip/ ...

我只得到default backend - 404

所以我的问题是:我的配置有什么问题,添加路径时发生了什么变化?

1 个答案:

答案 0 :(得分:0)

Kubernetes NodePort服务是将外部流量直接获取到您的服务的最基本方法。

顾名思义,

NodePort会在所有节点(VM)上打开特定端口,  发送到该端口并转发到服务。

返回您的问题。 尝试使用该配置。它更加清晰,仅包含必需的选项。

请记住,两种服务的ingress.global-static-ip-nametargetPort与您Pods端口的值相同。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress
  annotations:
    kubernetes.io/ingress.global-static-ip-name: $IP # Reserved IP address
  labels:
    app: myapp
    part: ingress
spec:
 rules:
  - http:
      paths:
      - path: /*
        backend:
          serviceName: backapp
          servicePort: 9000
      - path: /front/*
        backend:
          serviceName: frontapp
          servicePort: 3000`

此外,还需要定义单独的服务来处理传入流量:

 apiVersion: v1
 kind: Service
 metadata:
   labels:
     app: myapp
     part: back
   name: backapp
   namespace: default
 spec:
   ports:
   - port: 9000
     protocol: TCP
     targetPort: 9000 # Port on the pod with 'back' application
   selector:
     app: myapp
     part: back
   type: NodePort

以及前端服务的第二种配置:

apiVersion: v1
kind: Service
metadata:
  labels:
    app: myapp
    part: front
  name: frontapp
  namespace: default
spec:
  ports:
  - port: 3000
    protocol: TCP
    targetPort: 3000 # Port on the pod with 'front' application
  selector:
     app: myapp
     part: front
  type: NodePort

如果新配置不能正常运行,请写上详细说明。

(我要对Anton Kostenko表示感谢,谢谢您的帮助,并使配置文件能够正常工作)