首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法访问在AWS上运行的Kubernetes集群上通过nginx入口控制器公开的Spring Boot微服务

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

Stack Overflow用户
提问于 2018-02-13 16:08:28
回答 1查看 3.1K关注 0票数 2

我已经使用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微服务:

代码语言:javascript
复制
@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。

代码语言:javascript
复制
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。

部署描述符:

代码语言:javascript
复制
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

服务描述符:

代码语言:javascript
复制
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微服务,我也遵循了相同的过程。

入口描述符:

代码语言:javascript
复制
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控制器:

代码语言:javascript
复制
helm install --name my-release stable/nginx-ingress

然后我使用以下命令安装我的图表:

代码语言:javascript
复制
helm install folder-conataining-helm-chart/

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

URL crud.qdatalabs.com/healthz给出了200 OK响应

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

我收到了WhiteLabel错误页:

我想我做了一些配置错误,但我不能确定它。请在任何方向上帮助我。我很乐意提供更多细节。谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-13 16:26:16

正如我在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: /注解来缓解此问题,并确保即使在入口路径中有一个子文件夹也可以访问/。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48762138

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档