1. 程式人生 > 其它 >Kubernetes04 - 從容器到雲原生

Kubernetes04 - 從容器到雲原生

容器到雲原生的路線:
容器 -> Kubernetes -> 微服務 ->雲原生 -> 服務網格 -> 使用場景 -> 開源。

為什麼使用K8S

下面這張圖是K8s的架構圖,顯示了元件間的CNI,CRI,OCI等,這些將Kubernetes 與某款具體產品解耦,給使用者最大的定製程度,使得 Kubernetes 有機會成為跨雲的真正的雲原生應用的作業系統。

雲原生的核心目標


雲已經可以為我們提供穩定可以唾手可得的基礎設施,但是業務上雲成了一個難題,Kubernetes 的出現與其說是從最初的容器編排解決方案,倒不如說是為了解決應用上雲(即雲原生應用)這個難題。

包括微服務和 FaaS/Serverless 架構,都可以作為雲原生應用的架構。

但就 2017 年為止,Kubernetes 的主要使用場景也主要作為應用開發測試環境、CI/CD 和執行 Web 應用這幾個領域
另外基於 Kubernetes 的構建 PaaS 平臺和 Serverless 也處於爆發的準備的階段,如下圖中 Gartner 的報告中所示:

2017 年時各大公有云如 Google GKE、微軟 Azure ACS、亞馬遜 EKS(2018 年上線)、VMware、Pivotal(後被VMware 收購)、騰訊雲、阿里雲等都提供了 Kubernetes 服務。

微服務

下圖列出了微服務所需關心的主題,圖片來自RedHat Developers。

微服務帶給我們很多開發和部署上的靈活性和技術多樣性,但是也增加了服務呼叫的開銷、分散式系統管理、除錯與服務治理方面的難題。

當前最成熟最完整的微服務框架可以說非 Spring 莫屬,而 Spring 又僅限於 Java 語言開發,其架構本身又跟 Kubernetes 存在很多重合的部分,如何探索將 Kubernetes 作為微服務架構平臺就成為一個熱點話題。

就拿微服務中最基礎的服務註冊發現功能來說,其方式分為客戶端服務發現和服務端服務發現兩種,Java 應用中常用的方式是使用 Eureka 和 Ribbon 做服務註冊發現和負載均衡,這屬於客戶端服務發現,而在 Kubernetes 中則可以使用 DNS、Service 和 Ingress 來實現,不需要修改應用程式碼,直接從網路層面來實現。

微服務中的2種服務發現方式

服務網格

Kubernetes 中的應用將作為微服務執行,但是 Kubernetes 本身並沒有給出微服務治理的解決方案,比如服務的限流、熔斷、良好的灰度釋出支援等。

Service Mesh 可以用來做什麼

  • Traffic Management:API 閘道器
  • Observability:服務呼叫和效能分析
  • Policy Enforcment:控制服務訪問策略
  • Service Identity and Security:安全保護

Service Mesh 的特點

  • 專用的基礎設施層
  • 輕量級高效能網路代理
  • 提供安全的、快速的、可靠地服務間通訊
  • 擴充套件 kubernetes 的應用負載均衡機制,實現灰度釋出
  • 完全解耦於應用,應用可以無感知,加速應用的微服務和雲原生轉型

都有哪些Service Mesh

使用 Service Mesh 將可以有效的治理 Kubernetes 中執行的服務,當前開源的流行的 Service Mesh 有:

  • Linkerd:由最早提出 Service Mesh 的公司 Buoyant 開源,創始人來自 Twitter
  • Envoy:由 Lyft 開源,可以在 Istio 中使用 Sidecar 模式執行以作為資料平面,也可以基於它來構建自己的服務網格
  • Istio:由 Google、IBM、Lyft 聯合開發並開源

Istio VS Linkerd

Linkerd 和 Istio 是最早開源的 Service Mesh,它們都支援 Kubernetes,下面是它們之間的一些特性對比。

Feature Istio Linkerd
部署架構 Envoy/Sidecar DaemonSets
易用性 複雜 簡單
支援平臺 Kubernetes Kubernetes/Mesos/Istio/Local
是否已有生產部署

Istio 的元件複雜,可以分別部署在 Kubernetes 叢集中,但是作為核心路由元件 Envoy 是以 Sidecar 形式與應用執行在同一個 Pod 中的,所有進入該 Pod 中的流量都需要先經過 Envoy。

Linker 的部署十分簡單,本身就是一個映象,使用 Kubernetes 的 DaemonSet 方式在每個 node 節點上執行。

使用場景

GitOps

我們知道 Kubernetes 中的所有應用的部署都是基於YAML檔案的,這實際上就是一種 Infrastructure as code,完全可以通過 Git 來管控基礎設施和部署環境的變更。

大資料

Spark 現在已經非官方支援了基於 Kubernetes 的原生排程,其具有以下特點:

  • Kubernetes 原生排程:與 yarn、mesos 同級
  • 資源隔離,粒度更細:以 namespace 來劃分使用者
  • 監控的變革:單次任務資源計量
  • 日誌的變革:pod 的日誌收集
特性 Yarn Kubernetes
佇列 queue namespace
例項 ExcutorContainer Executor Pod
網路 host plugin
異構 no yes
安全 RBAC ACL

下圖是在 Kubernetes 上執行三種排程方式的 spark 的單個節點的應用部分對比:

從上圖中可以看到在 Kubernetes 上使用 YARN 排程、standalone 排程和 Kubernetes 原生排程的方式,每個 node 節點上的 Pod 內的 Spark Executor 分佈,毫無疑問,使用 Kubernetes 原生排程的 Spark 任務才是最節省資源的。

開源


對於一個初次接觸 Kubernetes 的人來說,看到這樣一個龐大的架構選型時會望而生畏,但是 Kubernetes 的開源社群幫助了我們很多。