使用 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 中,因为在集群中找不到它。
注:
- 前端部署在集群外
local
集群中的 API 将具有与 ECS
相同的 URL,这样前端 env
就不必被修改。
- 即使
Minikube
集群部署在本地,仍然是虚拟机
我认为如果您 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
,您需要干预您的配置。
您可以使用:
CoreDNS plugin
调用了 Alternate
Plugin Alternate is able to selectively forward the query to another upstream server, depending the error result provided by the initial resolver
- 某种带有
health-check
的 LoadBalancer
或 proxy
并像 this example 中那样请求重试
我正在使用 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 中,因为在集群中找不到它。
注:
- 前端部署在集群外
local
集群中的 API 将具有与ECS
相同的 URL,这样前端env
就不必被修改。- 即使
Minikube
集群部署在本地,仍然是虚拟机
我认为如果您 Ingress 有两个主机解决方案,那将是更通用的解决方案。这样您就不需要任何基础架构更改(只需对名称进行一些调整)。
在此解决方案中,您需要:
- 使用
$ minikube addons enable ingress
在 - 创建
LoadBalancer
到云环境服务 - 在云环境和 Minikube 中有 2 个部署。
- 为
$ minikube ip
地址添加/etc/hosts
别名,如
Minikube
中启用 Ingress
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
,您需要干预您的配置。
您可以使用:
CoreDNS plugin
调用了 Alternate
Plugin Alternate is able to selectively forward the query to another upstream server, depending the error result provided by the initial resolver
- 某种带有
health-check
的LoadBalancer
或proxy
并像 this example 中那样请求重试