无法访问在AWS上运行的Kubernetes集群上通过nginx入口控制器公开的Spring Boot微服务

时间:2018-02-13 08:08:28

标签: amazon-web-services spring-boot nginx kubernetes kubernetes-ingress

我在本演练之后使用kube-up.sh脚本在AWS上创建了一个3节点Kubernetes集群(版本:1.5.8):

https://ryaneschinger.com/blog/building-a-kubernetes-cluster-on-aws/

我能够成功访问群集并查看用户界面。输出kubectl cluster-info命令:

enter image description here

我写了一个简单的Spring Boot微服务:

@RestController
public class AddCustomerController {

    private static final String template = "Customer %s is added.";

    @RequestMapping("/addcustomer")
    public Message addcustomer(@RequestParam(value="name") String name) {

        //Retrieve the hostname of the "node"/"container"
        String hostname = null;
        try {
            hostname = InetAddress.getLocalHost().getHostName();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }

        return new Message(ThreadLocalRandom.current().nextLong(),
                            String.format(template, name),
                            hostname);
    }
}

并在Gradle构建之后将其打包在Docker容器中,并且能够在本地成功使用它。我已将图像推送到DockerHub。

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD build/libs/*.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

现在我使用Helm Charts将此应用程序部署到Kubernetes。

部署描述符:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: add-customer-deployment
spec:
  replicas: 3
  template:
    metadata:
      name: add-customer-microservice
      labels:
        app: add-customer
    spec:
      containers:
      - image: {{ .Values.dockerHubUsername }}/add-customer-microservice:latest
        name: add-customer-microservice
        imagePullPolicy: Always
        ports:
        - containerPort: 8080

服务描述符:

apiVersion: v1
kind: Service
metadata:
  name: add-customer-service
spec:
  selector:
    app: add-customer
  ports:
    - port: 1000
      protocol: TCP
      targetPort: 8080
      name: access-port
  type: NodePort

我对其他3个类似的Spring Boot微服务采用了相同的程序。

入口描述符:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: quantiphi-poc-ingress-dns
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  rules:
    - host: crud.qdatalabs.com
      http:
        paths:
        - path: /service1
          backend:
            serviceName: add-customer-service
            servicePort: 1000
        - path: /service1/*
          backend:
            serviceName: add-customer-service
            servicePort: 1000
        - path: /service2
          backend: 
            serviceName: get-customer-service
            servicePort: 2000
        - path: /service2/*
          backend:
            serviceName: get-customer-service
            servicePort: 2000
        - path: /service3
          backend: 
            serviceName: update-customer-service
            servicePort: 3000
        - path: /service3/*
          backend:
            serviceName: update-customer-service
            servicePort: 3000
        - path: /service4
          backend: 
            serviceName: delete-customer-service
            servicePort: 4000
        - path: /service4/*
          backend:
            serviceName: delete-customer-service
            servicePort: 4000

首先,我使用Helm Charts在我的集群上安装nginx控制器:

helm install --name my-release stable/nginx-ingress

然后我使用以下方式安装我的图表:

helm install folder-conataining-helm-chart/

然后我将crud.qdatalabs.com(类型A)的别名从Route53指向由Ingress资源产生的ELB。

网址crud.qdatalabs.com/healthz 给出200 OK回复

当我尝试使用网址crud.qdatalabs.com/service1/addcustomer?name=starman

访问微服务时

我使用WhiteLabel错误页面处理:

enter image description here

我认为我已经犯了一些配置错误,但不能指责它。请帮助我任何方向。我很乐意提供更多细节。谢谢。

1 个答案:

答案 0 :(得分:1)

正如我在Setting up a Kuberentes cluster with HTTP Load balancing ingress for RStudio and Shiny results in error pages中所述,最有可能的问题是当你使用此入口时,你附加的URI与直接accesc(/ service1 / vs /)不同,所以你的应用程序丢失了对于那个uri没有任何内容。

使用Nginx Ingress Controller,您可以使用ingress.kubernetes.io/rewrite-target:/ annotation来缓解此问题,并确保即使在入口路径中有子文件夹时也可以访问/。

因此,您需要使用正确的重写注释或支持您在服务中的入口中使用的路径。