簡體   English   中英

無法訪問在 AWS 上運行的 Kubernetes 集群上通過 nginx 入口控制器公開的 Spring Boot 微服務

[英]Unable to access Spring Boot microservice exposed via nginx ingress controller on Kubernetes cluster running on AWS

按照本演練,我使用 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/

然后我將 rud.qdatalabs.com(A 類)的別名從 Route53 指向由 Ingress 資源產生的 ELB。

URL crud.qdatalabs.com/healthz給出 200 OK 響應

當我嘗試使用 URL crud.qdatalabs.com/service1/addcustomer?name=starman訪問微服務時

我接受了 WhiteLabel 錯誤頁面的處理:

在此處輸入圖片說明

我想我犯了一些配置錯誤,但無法解決。 請幫助我任何方向。 我很樂意提供更多細節。 謝謝你。

正如我在為 RStudio 和 Shiny 設置帶有 HTTP 負載平衡入口的 Kuberentes 集群中所述,導致錯誤頁面,您遇到的最可能的問題是,當您使用此入口時,您附加的 URI 與直接訪問(/service1)不同/ vs / ) 所以你的應用程序丟失並且沒有該 uri 的內容。

使用 Nginx 入口控制器,您可以使用 ingress.kubernetes.io/rewrite-target:/ 注釋來​​緩解這種情況,並確保即使在入口路徑中有子文件夾時也可以訪問 /。

因此,您要么需要使用正確的重寫注釋,要么支持您在服務內部的入口中使用的路徑。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM