原文作者:李同剛
原文連結:
https://developer.aliyun.com/article/740135?spm=a2c6h.13262185.0.0.2df36171oLnf2Z更多雲原生技術資訊可關注
阿裡巴巴雲原生技術圈閱讀本篇需要具備 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 通路。
- 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:
2、打包 Docker 鏡像
3、上傳鏡像到阿裡雲鏡像伺服器
4、使用 kubectl apply 指令部署服務
總結
本篇介紹了網關部署以及可能遇到的坑。
“ 阿裡巴巴雲原生 關注微服務、Serverless、容器、Service Mesh 等技術領域、聚焦雲原生流行技術趨勢、雲原生大規模的落地實踐,做最懂雲原生開發者的技術圈。”