從軟體工程師角度聊聊 Kubernetes

2023-09-08 12:00:42

作為軟體工程師,我們應該熟悉 K8s,儘管它有點像 DevOps,但它能讓我們更好地瞭解幕後發生的事情,讓我們與部署工作更密切相關,更有責任感。本文將從軟體工程師的角度探討 Kubernetes (K8s),我們將介紹其動機、原理和核心元件,助力於開發者們提升 Kubernetes 的專業知識水平,能更有信心地擁抱這項前沿技術!
 

背景

在談論 Kubernetes 之前,首先讓我們瞭解一下什麼是容器
 

當我們考慮一個這樣的場景時,容器的概念就會變得很清晰:在開發人員完成滿足特定需求的程式碼編寫後,下一步就是將其打包並無縫安裝到另一臺主機上,確保我們的客戶可以輕鬆安裝並享受其優勢。那如何打包並安裝到另一臺主機上?通常,我們有很多依賴項,如二進位制程式碼、依賴庫和不同的作業系統,我們需要將它們全部打成一個包,即所謂的 "容器"。
 

換句話說,我們可以將程式碼與所有依賴項一起裝入容器,然後在遠端機器上輕鬆執行,或者用工程術語來說,"部署我們的服務"
 

部署挑戰

既然我們知道我們的服務是使用容器運輸的,那麼就會出現這些主要問題:

  • 如何才能知道我們的容器服務不會崩潰?我們希望確保如果一個容器宕機,另一個容器將啟動。

  • 怎樣確保這個容器有足夠的資源執行?也許它佔用的資源比實際需要的還要多。

  • 如何管理版本部署,這意味著當我們升級程式碼時,可以在不停機的情況下完成?我們希望確保服務的高可用性。

  • 如何讓我們的容器相互對話?

  • 當我們的請求增加或減少時,如何進行擴充套件或縮減?
     

在採用 K8s 之前,AppsFlyer 曾遇到過這些問題,而作為一家擁有強大平臺團隊的公司,我們通過內部實施解決了這些問題。例如,為了管理服務的生命週期,我們建立了一個名為"Medic"的流程,通過不斷向健康檢查 API 傳送 GET 請求,確保我們的服務始終正常執行。
 

另一個例子是,我們的大多數服務都是通過一個 docker 容器和用於部署與管理服務的內部工具("Santa")部署在一個 ec2 範例上的。這不會與任何其他服務共用,否則就會浪費資源、時間,更重要的是,還會浪費金錢。
 

K8s 解決方案

從上文可以瞭解到,Kubernetes 的實施是為了解決我提到的挑戰。
 

Kubernetes 的定義是:「這是一個用於自動化部署、擴充套件和管理容器化應用程式的開源系統。」換句話說,Kubernetes 為我們提供了一個容器編排系統,用於妥善管理我們的叢集,讓我們可以部署、管理資源並擴充套件應用。K8s 將我們的容器包裹起來,為我們掌舵。
 

以下就是我們從使用 K8s 和解決上述挑戰中獲得的一些好處:

  • 崩潰時容器的自行修復——Kubernetes 提供了一種健康檢查機制。這意味著不再需要實現檢查 API 來對我們的服務進行取樣。

  • 應用容器的自動分發和排程為我們提供了節點資源的高效利用。通過與多個應用程式共用節點範例,明智、高效地利用資源。

  • 自動推出和回滾,無需停機

  • 服務發現和負載平衡可幫助容器相互通訊

  • 水平擴充套件可確保開發人員在低負載或高負載的情況下同時使用應用程式,從而提高應用程式的效能。
     

總之,Kubernetes 是大規模管理容器化應用程式的最佳解決方案。憑藉其強大的元件和自動化功能,Kubernetes 簡化了應用程式生命週期的部署、擴充套件和管理。與直接在一個 EC2 範例上使用 Docker 相比,Kubernetes 可以節省時間和精力,併為管理生產中的應用程式提供基本功能。
 

最重要的是,Kubernetes 能為公司節省資金。通過自動管理基礎設施,Kubernetes 減少了對人工干預和內部工具的需求,如上所述,這可以節省大量運營成本。此外,Kubernetes 還可以幫助優化資源利用率,使在相同硬體上執行更多應用程式成為可能,從而節省成本。
 

每位開發人員都應瞭解的 K8s 基本元件


 

Kubernetes 的核心元件分為兩大類:控制平面元件和節點。讓我們來看看這些高階元件:
 

API 伺服器

API 伺服器是控制平面的核心元件,負責公開 Kubernetes API 並處理 API 請求。它是叢集中其他元件(如 kubectl 命令列工具或 Kubernetes 面板)與叢集互動的主要方式。
 

排程器

排程器負責根據可用資源以及指定的限制和規則,將 pod 排程到叢集中的節點上。它可確保以最大限度提高資源利用率和減少資源爭用的方式將 pod 放置在節點上。
 

控制管理器

控制管理器是在控制平面上執行的程序,負責管理叢集的狀態並確保其符合所需的狀態。它由多個不同的控制器組成,每個控制器負責叢集管理的特定方面,例如部署控制器,它負責管理叢集中應用程式的部署。
 

雲控制管理器

雲控制管理器是在雲平臺上執行 Kubernetes 時使用的特殊元件。它負責將 Kubernetes 控制平面與雲提供商的 API 整合,允許叢集使用雲的特定功能和資源。
 

etcd

etcd 是一個分散式鍵值儲存,用於儲存 Kubernetes 叢集的設定資料,包括叢集的當前狀態和期望狀態。它用於儲存需要在叢集中所有節點間持久化的資料,如叢集中 pod、服務和其他物件的資訊。
 

Kubelet

Kubelet 是執行在叢集中每個節點上的守護行程,負責管理該節點上的 pod。Kubelet 負責啟動和停止 pod、監控 pod 的健康狀況並在必要時重新啟動 pod 等任務。它與 Kubernetes 控制平面通訊,以接收關於執行哪些 pod 以及如何管理它們的指令,還與容器執行時(如 Docker)通訊,以實際執行容器。
 

Kube-proxy

Kube-proxy 是一個在叢集中每個節點上執行的守護行程,負責為叢集實施虛擬網路基礎設施。Kube-proxy 使用網路程式設計技術,根據叢集網路設定中定義的規則,將網路流量轉發到適當的 pod 或服務。Kube-proxy 執行的一些主要任務包括負載平衡、服務發現和網路策略執行。
 

總結

作為開發人員,全面瞭解我們所遇到的技術至關重要,無論這些技術是與我們的直接職責直接相關,還是由單獨的 DevOps 團隊管理,本文將作為一個完美的起點,推動您深入瞭解 K8s 的世界。
 

K8s 擁有陡峭的學習曲線,對於開發人員太過笨重。基於平臺工程理念構建的全新一代應用管理平臺 Walrus 將分離研發和運維的關注點,通過提供靈活強大的應用和環境部署管理能力、可遮蔽基礎設施的上層抽象,使研發人員能夠在無需瞭解底層技術細節的前提下自助構建、部署和執行應用程式,減輕開發人員的認知負擔。藉助 Walrus 將雲原生的能力和最佳實踐擴充套件到非容器化環境,並支援任意應用形態統一編排部署,降低使用基礎設施的複雜度,為研發和運維團隊提供易用、一致的應用管理和部署體驗,進而構建無縫共同作業的軟體交付流程。複製下方專案連結至瀏覽器,即刻試用 Walrus。
 

開源地址:github.com/seal-io/walrus
 

參考連結
https://medium.com/appsflyerengineering/hi-developer-meet-kubernetes-8652bdc210d9