本文主要介绍微服务API网关 的容器部署 ,分为三个 方面:
Golang
交叉编译
Docker
镜像构建
Kubernetes
容器编排
目录 Table of Contents
Golang交叉编译
Golang
支持交叉编译,即在当前的操作系统和体系架构上生成指定的操作系统和体系架构的可执行程序。 微服务API网关预先采取 Golang
交叉编译出于两点考虑:一是提前在开发环境中编译程序比之后在镜像构建中编译程序的速度要更加快 ;二是开发环境和部署环境的操作系统不同,可执行的二进制文件必须经过交叉编译才能正常运行 。
1 2 3 4 5 6 7 8 9 10 11 export GO111MODULE=autoexport GOPROXY=https://goproxy.io,directgo mod tidy 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 FROM golangMAINTAINER 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 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
部署和编排容器,以提高系统的扩展性和可靠性 。
对于核心模块 而言,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 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 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 kubectl create -f ./ci/k8s/core.yaml
使用 kubectl create
命令,传入配置文件路径创建 Deployment
和 Service
。