天天看點

探讨基于阿裡雲容器技術架構(二)網關部署拓撲圖資源準備避坑指南主要操作總結

原文作者:李同剛

原文連結:

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 等技術領域、聚焦雲原生流行技術趨勢、雲原生大規模的落地實踐,做最懂雲原生開發者的技術圈。”