前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >构建高可用微服务架构:APISIX 网关与 K3S 集群的集成方案

构建高可用微服务架构:APISIX 网关与 K3S 集群的集成方案

原创
作者头像
行者深蓝
发布2024-03-18 23:30:25
1590
发布2024-03-18 23:30:25
举报

背景概述

随着微服务架构的日益流行,企业正面临着构建高可用、可扩展且安全的微服务系统的挑战。在这种背景下,本方案提出了一种基于 APISIX 网关和 K3S 集群的微服务部署策略。这种策略不仅提高了系统的可用性和伸缩性,还简化了服务的发现和路由管理。

在本方案中,我们使用 K3S 集群在三台虚拟机上独立部署 APISIX 网关,将其配置为专属的应用网关(Gateway Ingress)。这样做可以有效地处理外部流量,并将其路由到相应的微服务。此外,我们还在同样的 K3S 集群中部署了配置中心和服务注册中心(如 Consul、Etcd 或 Nacos),以便 APISIX 网关能够使用外部服务注册中心进行服务发现。

对于微服务的部署,我们选择了 Kubernetes (K8S) 集群作为承载环境,其中包括前端的 React 应用和后端的 Python/Go 微服务。这些微服务在启动时会向外部服务注册中心注册其服务实例,从而实现服务的自动发现和管理。

为了确保流量的正确路由,我们在 APISIX 网关中配置了路由规则,根据请求的路径或其他属性将流量路由到相应的微服务。同时,我们还利用了 APISIX 的动态路由功能来自动更新路由规则,以匹配服务注册中心中的服务实例更改。

此外,为了解决跨域请求的问题,我们在 APISIX 网关中配置了跨域资源共享(CORS)策略,以允许前端应用跨域访问后端微服务。

最后,为了监控系统的性能和记录日志,我们配置了一系列监控和日志记录工具,如 Prometheus、Grafana 和 ELK,以收集和分析 APISIX 网关、微服务和服务注册中心的性能和日志数据。

部署方案设计

  • 部署 APISIX 网关集群: 在三台虚拟机 (VM) 上部署 K3S 集群,专门用于运行 APISIX 网关。 在 K3S 集群中部署 APISIX 网关实例,并配置为专属应用网关(Gateway Ingress)。 部署配置中心和服务注册中心
  • 在同三台 VM 上的 K3S 集群中部署配置中心和服务注册中心(如 Consul、Etcd 或 Nacos)。
  • 配置 APISIX 网关以使用外部服务注册中心进行服务发现。
  • 部署应用和微服务,在 Kubernetes (K8S) 集群中部署前端 React 应用和后端微服务(Python、Go 等)。
  • 配置微服务以在启动时向外部服务注册中心注册其服务实例。
  • 配置流量路由 在 APISIX 网关中配置路由规则,根据请求的路径或其他属性将流量路由到相应的微服务。可以使用 APISIX 的动态路由功能来自动更新路由规则,以匹配服务注册中心中的服务实例更改。
  • 配置跨域请求处理,在 APISIX 网关中配置跨域资源共享(CORS)策略,以允许前端应用跨域访问后端微服务。 监控和日志记录
  • 配置监控和日志记录工具(如 Prometheus、Grafana、ELK 等)以收集和分析 APISIX 网关、微服务和服务注册中心的性能和日志数据。

注意事项:

  1. 确保所有组件之间的网络连通性,以便流量可以正确路由和服务可以成功注册。
  2. 考虑使用安全措施(如 TLS/SSL 加密、API 密钥、身份验证和授权机制)来保护网关、服务和通信。
  3. 根据需要配置高可用性和负载均衡,以确保服务的稳定性和可靠性。

通过这种设计,您可以实现一个分布式的微服务架构,其中 APISIX 网关负责流量路由和跨域请求处理,配置中心和服务注册中心负责微服务的配置管理和服务发现,而应用和微服务则部署在 K8S 集群中以提供业务逻辑。

配置 示例

  1. 使用 helm 和 k3s 部署 APISIX
  2. 使用 helm 和 k3s 部署 配置中心和服务注册中心( Consul Nacos )
  3. 使用github action 和 argocd 部署 前端 React 应用和后端微服务(Python、Go 等
  4. APISIX 网关 配置流量路由 以及配置跨域请求处理
  5. 监控和日志 使用 prometheus 和 loki 以及APM

下面是根据您的要求提供的详细配置示例:

使用 Helm 和 K3s 部署 APISIX

首先,确保已经安装了 Helm 和 K3s。然后,添加 APISIX 的 Helm 仓库:

代码语言:shell
复制
helm repo add apisix https://charts.apiseven.com
helm repo update
helm install apisix apisix/apisix --namespace ingress-apisix --create-namespace \
  --set gateway.type=NodePort \
  --set admin.allow.ipList="{0.0.0.0/0}"

使用 Helm 和 K3s 部署配置中心和服务注册中心(Consul、Nacos)

  1. 使用 Helm 部署 Consul, 添加 Consul 的 Helm 仓库并更新:
代码语言:shell
复制
Copy code
helm repo add hashicorp https://helm.releases.hashicorp.com
helm repo update
helm install consul hashicorp/consul --namespace consul --create-namespace --set global.name=consul
  1. 使用 Helm 部署 Nacos, 添加 Nacos 的 Helm 仓库并更新:
代码语言:shell
复制
helm repo add nacos https://nacos-group.github.io/nacos-k8s
helm repo update
helm install nacos nacos/nacos --namespace nacos --create-namespace \
  --set replicaCount=1 \
  --set persistence.enabled=false

使用 GitHub Actions 和 Argo CD 部署前端 React 应用和后端微服务(Python、Go 等)

在 GitHub Actions 工作流中添加部署步骤,例如:

代码语言:yaml
复制
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Set up Kubectl
        uses: azure/setup-kubectl@v1
      - name: Set up Argo CD
        uses: argoproj/setup-argocd@v1
      - name: Deploy to Argo CD
        run: |
          argocd login $ARGOCD_SERVER --username $ARGOCD_USERNAME --password $ARGOCD_PASSWORD
          argocd app create my-app --repo $REPO_URL --path $APP_PATH --dest-server $K8S_CLUSTER --dest-namespace $NAMESPACE
          argocd app sync my-app
    env:
      ARGOCD_SERVER: ${{ secrets.ARGOCD_SERVER }}
      ARGOCD_USERNAME: ${{ secrets.ARGOCD_USERNAME }}
      ARGOCD_PASSWORD: ${{ secrets.ARGOCD_PASSWORD }}
      REPO_URL: ${{ secrets.REPO_URL }}
      APP_PATH: ${{ secrets.APP_PATH }}
      K8S_CLUSTER: ${{ secrets.K8S_CLUSTER }}
      NAMESPACE: ${{ secrets.NAMESPACE }}

在 Argo CD 中配置应用程序以自动同步 GitHub 仓库中的更改。

APISIX 网关配置流量路由以及配置跨域请求处理

配置路由规则示例:

代码语言:yaml
复制
apiVersion: apisix.apache.org/v2beta3
kind: ApisixRoute
metadata:
  name: httpbin-route
  namespace: default
spec:
  http:
  - name: rule1
    match:
      hosts:
      - "example.com"
      paths:
      - "/get"
    backend:
      serviceName: httpbin
      servicePort: 80

配置跨域请求处理示例:

代码语言:yaml
复制
Copy code
apiVersion: apisix.apache.org/v2beta3
kind: ApisixRoute
metadata:
  name: cors-route
  namespace: default
spec:
  http:
  - name: rule1
    match:
      hosts:
      - "example.com"
      paths:
      - "/cors"
    backend:
      serviceName: httpbin
      servicePort: 80
    plugins:
    - name: cors
      enable: true
      config:
        allow_origins: "*"
        allow_methods: "GET,POST,PUT,DELETE,OPTIONS"
        allow_headers: "DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization"

监控和日志使用 Prometheus 和 Loki 以及 APM

使用 Helm 部署 Prometheus:

代码语言:shell
复制
Copy code
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install prometheus prometheus-community/prometheus --namespace monitoring --create-namespace

使用 Helm 部署 Loki:

代码语言:shell
复制
Copy code
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
helm install loki grafana/loki-stack --namespace logging --create-namespace

配置 APISIX 以使用 APM 工具(如 SkyWalking)进行性能监控,具体配置根据所选 APM 工具而定。

请注意,这些示例仅作为参考,您可能需要根据您的具体需求和环境进行调整。

React 应用 (Hello World 示例)

创建一个新的 React 应用:

代码语言:shell
复制
Copy code
npx create-react-app react-hello-world
cd react-hello-world

修改 src/App.js 文件:

代码语言:javascript
复制
Copy code
import React from 'react';

function App() {
  return (
    <div className="App">
      <header className="App-header">
        <p>Hello World from React!</p>
      </header>
    </div>
  );
}
export default App;

Python 微服务 (Flask 示例)

创建一个新的 Python 文件 app.py:

代码语言:python
复制
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
    return 'Hello World from Python Flask!'
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

安装 Flask 并运行应用:

代码语言:shell
复制
pip install Flask
python app.py

Go 微服务 (Hello World 示例)

创建一个新的 Go 文件 main.go:

代码语言:go
复制
Copy code
package main

import (
    "fmt"
    "net/http"
)
func helloWorld(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello World from Go!")
}
func main() {
    http.HandleFunc("/", helloWorld)
    http.ListenAndServe(":8080", nil)
}

运行 Go 应用:

代码语言:shell
复制
Copy code
go run main.go

这些示例分别展示了如何在 React、Python Flask 和 Go 中创建一个简单的 Hello World 应用。您可以根据需要进行扩展和修改以适应您的项目需求。

以下是一个完整的示例,包括 React 应用和后端微服务(Python Flask 和 Go)的 Hello World 示例,以及相应的 Dockerfile,如何注册到配置中心和服务注册中心,以及使用 IaC(基础设施即代码)和 Ansible 进行配置管理的方法。

React 应用 (Hello World 示例)

代码语言:shell
复制
App.js:
javascript
Copy code
import React from 'react';
function App() {
  return (
    <div className="App">
      <header className="App-header">
        <p>Hello World from React!</p>
      </header>
    </div>
  );
}

export default App;
代码语言:shell
复制
Dockerfile
Copy code
FROM node:14
WORKDIR /app
COPY package.json ./
RUN npm install
COPY . .
CMD ["npm", "start"]

Python Flask 微服务 (Hello World 示例)

代码语言:shell
复制
app.py:
python
Copy code
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello World from Python Flask!'
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)
Dockerfile:
Dockerfile
Copy code
FROM python:3.8
WORKDIR /app
COPY requirements.txt ./
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "app.py"]

Go 微服务 (Hello World 示例)

代码语言:shell
复制
main.go:
go
Copy code
package main

import (
    "fmt"
    "net/http"
)

func helloWorld(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello World from Go!")
}

func main() {
    http.HandleFunc("/", helloWorld)
    http.ListenAndServe(":8080", nil)
}
代码语言:shell
复制
Dockerfile:
Dockerfile
Copy code
FROM golang:1.15
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN go build -o main .
CMD ["./main"]

注册到配置中心和服务注册中心

对于 Consul,可以使用 Consul 的 HTTP API 注册服务。例如,在 Flask 应用中,可以使用 requests 库在启动时向 Consul 注册服务:

代码语言:python
复制
Copy code
import requests
import json

def register_service_with_consul():
    service = {
        "ID": "flask-service",
        "Name": "flask-service",
        "Tags": ["flask", "web"],
        "Address": "localhost",
        "Port": 5000,
        "Check": {
            "HTTP": "http://localhost:5000/health",
            "Interval": "10s"
        }
    }
    headers = {'Content-Type': 'application/json'}
    response = requests.put('http://localhost:8500/v1/agent/service/register',
                            data=json.dumps(service),
                            headers=headers)
    if response.status_code == 200:
        print("Successfully registered service with Consul")
    else:
        print("Failed to register service with Consul")

if __name__ == '__main__':
    register_service_with_consul()
    app.run(host='0.0.0.0', port=5000)

部署、上线、监控、发布

使用 Ansible playbook 进行配置管理和自动化部署。以下是一个简单的 Ansible playbook 示例,用于部署 Flask 应用:

代码语言:yaml
复制
- hosts: flask_servers
  tasks:
    - name: Build Docker image
      command: docker build -t flask-app .
      args:
        chdir: /path/to/flask/app

    - name: Run Docker container
      command: docker run -d -p 5000:5000 --name flask-container flask-app

使用 IaC 工具(如 Terraform)管理基础设施。以下是一个简单的 Terraform 配置示例,用于创建一个 AWS EC2 实例:

代码语言:hcl
复制
Copy code
provider "aws" {
  region = "us-west-2"
}

resource "aws_instance" "flask_server" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t2.micro"
  tags = {
    Name = "FlaskServer"
  }
}

使用 Prometheus 和 Grafana 进行监控和日志记录。可以配置 Prometheus 以抓取 Flask 应用的指标,并使用 Grafana 创建仪表板以可视化这些指标。

请注意,这些示例仅作为参考,您可能需要根据您的具体需求和环境进行调整。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景概述
  • 部署方案设计
    • 配置 示例
      • 使用 Helm 和 K3s 部署 APISIX
    • 使用 Helm 和 K3s 部署配置中心和服务注册中心(Consul、Nacos)
    相关产品与服务
    微服务引擎 TSE
    微服务引擎(Tencent Cloud Service Engine)提供开箱即用的云上全场景微服务解决方案。支持开源增强的云原生注册配置中心(Zookeeper、Nacos 和 Apollo),北极星网格(腾讯自研并开源的 PolarisMesh)、云原生 API 网关(Kong)以及微服务应用托管的弹性微服务平台。微服务引擎完全兼容开源版本的使用方式,在功能、可用性和可运维性等多个方面进行增强。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档