阅读本篇需要具备 Kubernetes 知识和 kubectl 工具基本使用。
上一篇介绍了整体架构图,接下来的文章我们围绕架构图部署应用,本篇我们主要介绍网关的部署方式以、所需要的资源介绍以及可能会遇到的坑,不会对细节进行过多的描述,比如如何打包 docker 镜像等,因为我们不打算写一个从零开始的长而冗余的教程,浪费各位宝贵的阅读时间。部署中遇到问题直接在文章中评论,我会回复。
网关
代码简单主要起到说明作用,所以不做代码讲解了。源码托管在GitHub:https://github.com/Tony-Hangzhou/mvp-samples。
网关职责是封装内部服务,对外提供统一API访问,当然也可以加入鉴权和授权的职责。所以网关的网络通讯要求是既要提供给Kubernetes外部访问的入口,又要把请求路由到内部服务(相当于反向代理)。
ZuulApplication.java
@EnableZuulProxy
@SpringBootApplication
public class ZuulApplication {public static void main(String[] args) { SpringApplication.run(ZuulApplication.class, args); }
}
application.yml
spring:
application:name: api-gateway
zuul:
routes:user-service: path: /users/** url: http://localhost:8081 strip-prefix: false order-service: path: /orders/** url: http://localhost:8082 strip-prefix: false
management:
endpoints:web: exposure: include: routes
部署拓扑图
根据前篇介绍的架构图,我们的应用部署图如下,应用部分由网关(Zuul)、Foo、Bar组成。部署所需要的资源阿里云Kubernetes集群、阿里云SLB以及阿里云镜像托管Docker镜像。
资源准备
阿里云 Kubernetes
申请一个阿里云 Kubernetes 集群,Master 节点默认3个,Node 节点至少一个。
SLB
Kubernetes 暴露 Service 给外部访问有多种方式,我们这里选择 LoadBalancer 方式。阿里云 Kubernetes 支持阿里云 SLB 作为 LoadBalancer,而且支持阿里云内网和外网 SLB 。
- 外网
service.beta.kubernetes.io/alicloud-loadbalancer-address-type: internet
service.beta.kubernetes.io/alicloud-loadbalancer-id: ***
- 内网
service.beta.kubernetes.io/alicloud-loadbalancer-address-type: intranet
service.beta.kubernetes.io/alicloud-loadbalancer-id: ***
阿里云镜像
阿里云镜像为 Docker 镜像提供了托管服务,省掉自己搭建镜像服务器和维护的成本。
避坑指南
- Pod IP
原生 Kubernetes Pod IP 是内部IP,外部是无法访问的。阿里云 Kubernetes 通过 CNI 接口,自定义了网络部分的实现,他的 Pod IP 实际上是阿里云内网IP,Kubernetes 外部是可以访问的,但是熟悉 Kubernetes 同学知道这个 IP 随着Pod 被调度是回变化的,所以一定不要使用 Pod IP 直接访问,而是通过 Service 访问。 - SLB
Kubernetes 基于申明的方式部署服务,所以我们有一个 gateway-deploy.yaml,然后通过 kubectl 客户端做部署操作。尽可能使用命令 kubectl apply -f gateway-depoy.yaml 操作。避免使用 kubectl delete 和 kubectl create 组合操作,阿里云 SLB 会出现无法绑定到 NodePort 情况,从而造成通过 SLB 无法访问服务。 - namespace
避免 namespace 使用中短横线如:service-core。Kubernetes 内部服务使用 DNS 域名访问,如:foo.service-core,会出现通过该域名无法访问情况。去掉短横线或者通过 Service ClusterIP 即可访问,还有一种办法使用 foo.service-core.svc 或者全域名 foo.service-core.svc.cluster.local 也可访问。问题可能是 Kubernetes 短域名解析Bug,具体原因不明,请路过的高手指点一二。
主要操作
1、编写部署文件 gateway-deploy.yaml ,源代码见GitHub:https://github.com/Tony-Hangzhou/mvp-samples
2、打包 Docker 镜像
3、上传镜像到阿里云镜像服务器
4、使用 kubectl apply 命令部署服务
总结
本篇介绍了网关部署以及可能遇到的坑。