#Microservice# 微服务API网关的设计与实现(5) 容器部署

#Microservice# 微服务API网关的设计与实现(5) 容器部署

本文主要介绍微服务API网关容器部署,分为三个方面:

  • Golang 交叉编译
  • Docker 镜像构建
  • Kubernetes 容器编排

目录 Table of Contents


Golang交叉编译

  • Golang 支持交叉编译,即在当前的操作系统和体系架构上生成指定的操作系统和体系架构的可执行程序。微服务API网关预先采取 Golang 交叉编译出于两点考虑:一是提前在开发环境中编译程序比之后在镜像构建中编译程序的速度要更加快;二是开发环境和部署环境的操作系统不同,可执行的二进制文件必须经过交叉编译才能正常运行
1
2
3
4
5
6
7
8
9
10
11
# take giotto-gateway-core as an example
# https://github.com/LotteWong/giotto-gateway-core/blob/main/ci/docker/cross_compile.sh

# set go env
export GO111MODULE=auto
export GOPROXY=https://goproxy.io,direct
go mod tidy

# build binary executable
mkdir -p ./bin
GOOS=linux GOARCH=amd64 go build -o ./bin/giotto_gateway_core
  • 先设置 Golang 打开 Go Module 模式并下载程序的模块依赖,再定义目标的操作系统和体系架构开始交叉编译。

Docker镜像构建

  • Docker 是一个通过管理 Linux 容器来实现应用环境隔离的开源容器引擎,它提供了一整套完备且易用的容器管理接口。微服务API网关的管理模块和核心模块两个微服务将使用 Docker 构建镜像,实现更快的程序部署和更低的计算开销
1
2
3
4
5
6
7
8
9
10
# take giotto-gateway-core as an example
# https://github.com/LotteWong/giotto-gateway-core/blob/main/ci/docker/Dockerfile

FROM golang
MAINTAINER LotteWong <lottewong21@gmail.com>

WORKDIR /go/src/app
COPY . .

CMD ./bin/giotto_gateway_core -config ./configs/prod/
  • 先拉取基础镜像 golang,再定义容器内的工作目录为 /go/src/app,接着将主机的源文件拷贝进容器中,最后命令行启动微服务。
1
2
3
4
5
6
# take giotto-gateway-core as an example
# https://github.com/LotteWong/giotto-gateway-core/blob/main/ci/docker/cross_compile.sh

# build docker images
commit=`git rev-parse --short HEAD`
docker build -f ./ci/docker/Dockerfile -t giotto-gateway-core:$commit .
  • 先读取 Git 版本管理库中最新的 commit id 作为镜像的 tag,以便更好地标识和管理镜像,再使用 docker build 命令,传入参数构建镜像。

Kubernetes容器编排

  • Kubernetes 是具备良好的自动化部署、扩展、调度和编排能力的开源容器管理平台,能够帮助有效地降低容器运维成本,提高服务集群管理效率。微服务API网关的管理模块和核心模块两个微服务将使用 Kubernetes 部署和编排容器,以提高系统的扩展性和可靠性

微服务API网关基于Kubernetes的部署图

  • 对于核心模块而言,1个核心模块 Pod 管理1个核心模块 Container生命周期,总共部署3个 Pod 实现核心模块功能的高可用;对于管理模块而言,1个管理模块 Pod 管理1个管理模块 Container生命周期,由于到达管理模块的流量相对较小,总共部署1个 Pod 提供服务。创建 Deployment 用于对 Pod 进行弹性伸缩和负载均衡,创建 Service 用于对 Pod 进行端口映射以实现外部网络的访问
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# take giotto-gateway-core as an example
# https://github.com/LotteWong/giotto-gateway-core/blob/main/ci/k8s/core.yaml

# deploy config
apiVersion: apps/v1
kind: Deployment
metadata:
name: giotto-gateway-core
spec:
replicas: 3
selector:
matchLabels:
name: giotto-gateway-core
template:
metadata:
labels:
name: giotto-gateway-core
spec:
containers:
- name: giotto-gateway-core
image: giotto-gateway-core:d1785da
imagePullPolicy: Never
ports:
- containerPort: 80
- containerPort: 443
  • Kubernetes Deployment 配置定义了 Pod 的副本数量、元数据、容器镜像和容器端口映射关系等,用于对微服务容器进行部署运行、弹性伸缩和负载均衡。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# take giotto-gateway-core as an example
# https://github.com/LotteWong/giotto-gateway-core/blob/main/ci/k8s/core.yaml

# service config
apiVersion: v1
kind: Service
metadata:
name: giotto-gateway-core
spec:
ports:
- port: 80
name: "http-proxy"
targetPort: 80
protocol: TCP
nodePort: 30080
- port: 443
name: "https-proxy"
targetPort: 443
protocol: TCP
nodePort: 30443
type: NodePort
selector:
name: giotto-gateway-core
  • Kubernetes Service 配置定义了元数据和对外端口映射关系等,用于建立外部网络访问 Kubernetes 节点内容器的通信桥梁。
1
2
3
4
5
# take giotto-gateway-core as an example
# https://github.com/LotteWong/giotto-gateway-core/blob/main/ci/k8s/apply_yaml.sh

# k8s apply yaml to create deploy and service
kubectl create -f ./ci/k8s/core.yaml
  • 使用 kubectl create 命令,传入配置文件路径创建 DeploymentService

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×