【问题标题】:Angular black page behind nginx and kubernetesnginx 和 kubernetes 背后的 Angular 黑页
【发布时间】:2020-09-03 16:13:58
【问题描述】:

我正在尝试使用 minikube 在 Kubernetes 上部署我的微服务应用程序。我有一个角前端服务和两个后端服务,我使用这个配置来午餐部署和服务

apiVersion: apps/v1
kind: Deployment
metadata:
  name: searchservice
  labels:
    app: searchservice
spec:
  selector:
    matchLabels:
      app: searchservice
  template:
    metadata:
      labels:
        app: searchservice
    spec:
      containers:
      - name: searchservice
        image: ayoubdali/searchservice:0.1.9-SNAPSHOT
        ports:
        - containerPort: 8070
---
apiVersion: v1
kind: Service
metadata:
  name: searchservice
spec:
  type: NodePort
  selector:
    app: searchservice
  ports:
  - protocol: TCP
   # Port accessible inside cluster
    port: 8070
   # Port to forward to inside the pod
    targetPort: 8070
    nodePort: 31000

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: searchappfront
  labels:
    app: searchappfront
spec:
  selector:
    matchLabels:
      app: searchappfront
  template:
    metadata:
      labels:
        app: searchappfront
    spec:
      containers:
      - name: searchappfront
        image: ayoubdali/searchappfront:0.6.5
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: searchappfront
spec:
  type: NodePort
  selector:
    app: searchappfront
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
    nodePort: 80

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: subscriberservice
  labels:
    app: subscriberservice
spec:
  selector:
    matchLabels:
      app: subscriberservice
  template:
    metadata:
      labels:
        app: subscriberservice
    spec:
      containers:
      - name: subscriberservice
        image: ayoubdali/subscriber-service:0.1.0-SNAPSHOT 
        ports:
        - containerPort: 8090
---
apiVersion: v1
kind: Service
metadata:
  name: subscriberservice
spec:
  type: NodePort
  selector:
    app: subscriberservice
  ports:
  - protocol: TCP
    port: 8090
    #targetPort: 80
    nodePort: 31102

以及入口服务的配置

 apiVersion: networking.k8s.io/v1beta1 # for versions before 1.14 use extensions/v1beta1
 kind: Ingress
 metadata:
   name: ingress
   annotations:
     nginx.ingress.kubernetes.io/rewrite-target: /$1
 spec:
   rules:
   - host: app.info
     http:
       paths:
       - path: /
         backend:
           serviceName: searchappfront
           servicePort: 80
       - path: /api
         backend:
           serviceName: subscriberservice
           servicePort: 8090    

但是当我打开 app.info/ 时,我得到了一个带有 javascript 错误的空白页面,例如

Failed to load module script: The server responded with a non-JavaScript MIME type of "text/html". Strict MIME type checking is enforced for module scripts per HTML spec.

我尝试使用 docker compose 部署应用程序,它工作正常。

【问题讨论】:

  • 你的api是否需要接收前缀为/api/的请求?你能给我一个正确的请求和响应示例吗?
  • 是的,subscriberservice 接收所有前缀为 /api/* 的请求,就像这个 /api/test/all 一样。当我将subscriberservice 设置为nodePort 时,我使用Postman 成功接收了数据,但是当我使用入口时,我得到了404 not found。对于\,它指向 Angular 应用程序,但我收到一个带有 js 文件加载错误的空白页面

标签: angular kubernetes minikube nginx-ingress


【解决方案1】:

当您启用rewrite-target 时,它将创建一个捕获组并将其发送到相应的服务。

如果您将捕获组设置为$1,则根/ 之后的所有内容都将被丢弃,并将请求转发到根path

  • 为了转发完整的请求,删除 rewrite-target,您的 Ingress 应该是这样的:
apiVersion: networking.k8s.io/v1beta1
 kind: Ingress
 metadata:
   name: ingress
   annotations:
     kubernetes.io/ingress.class: nginx
 spec:
   rules:
   - host: app.info
     http:
       paths:
       - path: /
         backend:
           serviceName: searchappfront
           servicePort: 80
       - path: /api
         backend:
           serviceName: subscriberservice
           servicePort: 8090    

示例:

  • 我已经部署了两个 echo-apps 来响应请求,我已经抑制了输出以显示路径和在后台处理它的 pod。

    • echo1-app 正在模拟 searchappfront
    • echo2-app 正在模拟 subscriberservice
  • 这是我正在使用的入口:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: echo-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  rules:
    - host: app.info
      http:
        paths:
          - path: /
            backend:
              serviceName: echo1-svc
              servicePort: 80
          - path: /api
            backend:
              serviceName: echo2-svc
              servicePort: 80
  • 现在让我们测试一下命令:
$ kubectl get ingress
NAME           HOSTS      ADDRESS        PORTS   AGE
echo-ingress   app.info   35.188.7.149   80      73m

$ kubectl get pods
NAME                            READY   STATUS    RESTARTS   AGE
echo1-deploy-764d5df7cf-2wx4m   1/1     Running   0          74m
echo2-deploy-7bcb8f8d5f-xlknt   1/1     Running   0          74m

$ tail -n 1 /etc/hosts
35.188.7.149 app.info

$ curl app.info
{"path": "/",
  "os": {"hostname": "echo1-deploy-764d5df7cf-2wx4m"}}

$ curl app.info/foo/bar
{"path": "/foo/bar",
  "os": {"hostname": "echo1-deploy-764d5df7cf-2wx4m"}}

$ curl app.info/api
{"path": "/api",
  "os": {"hostname": "echo2-deploy-7bcb8f8d5f-xlknt"}}

$ curl app.info/api/foo
{"path": "/api/foo",
  "os": {"hostname": "echo2-deploy-7bcb8f8d5f-xlknt"}}

$ curl app.info/api/foo/bar
{"path": "/api/foo/bar",
  "os": {"hostname": "echo2-deploy-7bcb8f8d5f-xlknt"}}

总结一下:

  • app.info/ 的请求将作为 / 发送到 echo1-app
  • app.info/foo/bar 的请求将作为 /foo/bar 发送到 echo1-app
  • app.info/api 的请求将作为 /api 发送到 echo2-app
  • app.info/api/foo/bar 的请求将作为 /api/foo/bar 发送到 echo2-app

关于您的环境的注意事项:

  • 我知道您正在使用NodePort 来测试访问,但如果您希望关闭该访问,您可以将服务设置为ClusterIP,因为它将是处理传入流量的 Ingress 作业。

  • Nodeport端口范围默认为30000-32767。

    • searchappfront 已将其设置为 80,这将被忽略并赋予正确的端口。

如果您有任何问题,请在 cmets 中告诉我。

【讨论】:

    猜你喜欢
    • 2022-06-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2020-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多