使用 Minikube 和 AWS ECS 搭建本地测试环境

Building a local testing environment using Minikube and AWS ECS

我正在使用 Kubernetes Minikube 集群构建本地测试环境。 “一些”后端 APIs 和数据库部署在集群内,每个 APIs 都有其专用的 URL 使用 ingress 创建。除此之外,我已经在 AWS ECS 中部署了“所有”后端 APIS,每个 APIs 都有一个 Route53 记录,并且前端已连接到“.env”文件中的这些 APIs。我想要实现的是,当我 运行 yarn start 在集群外的前端(React)上时,前端应该首先检查服务是否出现在本地 Minikube 集群中,如果在集群中找不到服务,它将连接到 AWS ECS 中的服务。有办法实现吗?

为了更好地说明,这是我的前端 .env 文件

SCHEDULE_API_URL = http://schedule.learning.com
DASHBOARD_API_URL = http://dashboard.learning.com

后端部署yaml

kind: Deployment
apiVersion: apps/v1
metadata:
  name: schedule
  labels:
    name: schedule
spec:
  replicas: 1
  selector:
    matchLabels:
      app: schedule
  template:
    metadata:
      labels:
        app: schedule
    spec:
      containers:
      - name: schedule
        image: <image_name>
        ports:
        - containerPort: 8080
        imagePullPolicy: Never
      restartPolicy: Always
---
kind: Service
apiVersion: v1
metadata:
  name: schedule-svc
  labels:
    app: schedule
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 8080
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
 name: schedule-ingress
 namespace: default
 annotations:
   kubernetes.io/ingress.class: "nginx"
   nginx.ingress.kubernetes.io/rewrite-target: /
   nginx.ingress.kubernetes.io/proxy-read-timeout: "12h"
   nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
 rules:
   - host: schedule.learning.com
     http:
       paths:
         - path: /
           pathType: Prefix
           backend:
             service:
               name: schedule-svc
               port:
                 number: 80

已部署在 AWS ECS 中的后端 API

SCHEDULE API  --> Route 53 Record: http://schedule.learning.com
DASHBOARD API  --> Route 53 Record: http://dashboard.learning.com

基于上面的例子,当我 运行 本地和集群外部的前端时,它将连接到 Schedule API http://schedule.learning.com in the local cluster, but connect to the dashboard API https://dashboard.learning.com 在 ECS 中,因为在集群中找不到它。

注:

我认为如果您 Ingress 有两个主机解决方案,那将是更通用的解决方案。这样您就不需要任何基础架构更改(只需对名称进行一些调整)。

在此解决方案中,您需要:

  • 使用 $ minikube addons enable ingress
  • Minikube 中启用 Ingress
  • 创建LoadBalancer到云环境服务
  • 在云环境和 Minikube 中有 2 个部署。
  • $ minikube ip 地址添加 /etc/hosts 别名,如
192.168.49.2 resource1.domain1.biz
192.168.49.2 resource2.domain2.biz
  • 有 2 个服务,一个指向 Minikube 中的部署,第二个应该没有 selector
  • 为指向 LoadBalancer IP 的第二个服务创建 Endpoint

配置

入口

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress
spec:
  rules:
  - host: resource1.domain1.biz
    http:
      paths:
      - path: /first
        backend:
          serviceName: first-deployment
          servicePort: 8080
  - host: resource2.domain2.biz
    http:
      paths:
      - path: /second
        backend:
          serviceName: my-svc
          servicePort: 8080

端点

apiVersion: v1
kind: Endpoints
metadata:
  name: my-svc
subsets:
  - addresses:
      - ip: 34.91.XX.27 
    ports:
      - port: 80

测试*

user@minikube-20:~$ curl -H "HOST: resource1.domain1.biz" http://192.168.49.2/first
Hello, world!
Version: 1.0.0
Hostname: first-deployment-5df6dc8d8b-mmx8c
user@minikube-20:~$ curl -H "HOST: resource2.domain2.biz" http://192.168.49.2/second
Hello, world!
Version: 1.0.0
Hostname: gke-deployment-85b75bf4f9-jgvhz

在这种情况下,您也可以尝试使用 ExternalName service

但是,如果您想实现您最初提到的目标,即创建 automatic failover,您需要干预您的配置。

您可以使用:

Plugin Alternate is able to selectively forward the query to another upstream server, depending the error result provided by the initial resolver

  • 某种带有 health-checkLoadBalancerproxy 并像 this example
  • 中那样请求重试