【问题标题】:Unable to access Spring Boot microservice exposed via nginx ingress controller on Kubernetes cluster running on AWS无法访问在 AWS 上运行的 Kubernetes 集群上通过 nginx 入口控制器公开的 Spring Boot 微服务
【发布时间】:2018-07-23 13:08:32
【问题描述】:

我已经按照本演练使用 kube-up.sh 脚本在 AWS 上启动了一个 3 节点 Kubernetes 集群(版本:1.5.8):

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

我能够成功访问集群并查看 UI。 kubectl cluster-info 命令的输出:

我写了一个简单的 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/

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

网址crud.qdatalabs.com/healthz 正在给出 200 OK 响应

当我尝试使用 URL crud.qdatalabs.com/service1/addcustomer?name=starman 访问微服务时

我收到了 WhiteLabel 错误页面:

我认为我犯了一些配置错误,但无法解决。请帮助我任何方向。我很乐意提供更多细节。谢谢。

【问题讨论】:

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


    【解决方案1】:

    正如我在Setting up a Kuberentes cluster with HTTP Load balancing ingress for RStudio and Shiny results in error pages 中所说,您最可能遇到的问题是,当您使用此入口时,您附加的 URI 与直接访问( /service1/ vs / )不同,因此您的应用程序丢失并且没有该 uri 的内容。

    使用 Nginx Ingress Controller,您可以使用 ingress.kubernetes.io/rewrite-target: / 注释来​​缓解这种情况,并确保即使入口路径中有子文件夹也可以访问 /。

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

    【讨论】:

    • 嗨 Radek,非常感谢您的回复。我添加了一个 echo-server 部署和服务来迎合 / 路径。当我点击 URL crud.qdatalabs.com 时,我得到了回显服务器响应。但是我仍然无法访问我的服务。我将 ingress.kubernetes.io/rewrite-target: / 注释添加到我的 Ingress 资源中,但我仍然收到相同的错误页面。我在配置路径时是否犯了任何错误?
    • 不确定您使用的是什么入口控制器/您的集群是如何配置的。最新的 nginx 控制器使用 nginx.ingress.kubernetes.io/rewrite-target: / 注释 github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/… 所以也许这就是它不适合你的原因。
    • 嘿 Radek,你是对的。我在添加注释时打错了!我的服务现在可以访问了。非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2021-09-27
    • 2018-10-29
    • 2021-09-23
    • 2023-02-01
    • 2019-07-26
    • 2020-05-19
    • 2021-01-30
    • 1970-01-01
    相关资源
    最近更新 更多