從軟件工程師角度聊聊 Kubernetes

作為軟件工程師,我們應(yīng)該熟悉 K8s,盡管它有點像 DevOps,但它能讓我們更好地了解幕后發(fā)生的事情,讓我們與部署工作更密切相關(guān),更有責任感。本文將從軟件工程師的角度探討 Kubernetes (K8s),我們將介紹其動機、原理和核心組件,助力于開發(fā)者們提升 Kubernetes 的專業(yè)知識水平,能更有信心地擁抱這項前沿技術(shù)!
?
背景
在談?wù)?Kubernetes 之前,首先讓我們了解一下什么是容器。
?
當我們考慮一個這樣的場景時,容器的概念就會變得很清晰:在開發(fā)人員完成滿足特定需求的代碼編寫后,下一步就是將其打包并無縫安裝到另一臺主機上,確保我們的客戶可以輕松安裝并享受其優(yōu)勢。那如何打包并安裝到另一臺主機上?通常,我們有很多依賴項,如二進制代碼、依賴庫和不同的操作系統(tǒng),我們需要將它們?nèi)看虺梢粋€包,即所謂的 "容器"。
?
換句話說,我們可以將代碼與所有依賴項一起裝入容器,然后在遠程機器上輕松運行,或者用工程術(shù)語來說,"部署我們的服務(wù)"。
?
部署挑戰(zhàn)
既然我們知道我們的服務(wù)是使用容器運輸?shù)?,那么就會出現(xiàn)這些主要問題:
如何才能知道我們的容器服務(wù)不會崩潰?我們希望確保如果一個容器宕機,另一個容器將啟動。
怎樣確保這個容器有足夠的資源運行?也許它占用的資源比實際需要的還要多。
如何管理版本部署,這意味著當我們升級代碼時,可以在不停機的情況下完成?我們希望確保服務(wù)的高可用性。
如何讓我們的容器相互對話?
當我們的請求增加或減少時,如何進行擴展或縮減?
?
在采用 K8s 之前,AppsFlyer 曾遇到過這些問題,而作為一家擁有強大平臺團隊的公司,我們通過內(nèi)部實施解決了這些問題。例如,為了管理服務(wù)的生命周期,我們創(chuàng)建了一個名為"Medic"的流程,通過不斷向健康檢查 API 發(fā)送 GET 請求,確保我們的服務(wù)始終正常運行。
?
另一個例子是,我們的大多數(shù)服務(wù)都是通過一個?docker 容器和用于部署與管理服務(wù)的內(nèi)部工具("Santa")部署在一個 ec2 實例上的。這不會與任何其他服務(wù)共享,否則就會浪費資源、時間,更重要的是,還會浪費金錢。
?
K8s 解決方案
從上文可以了解到,Kubernetes 的實施是為了解決我提到的挑戰(zhàn)。
?
Kubernetes 的定義是:“這是一個用于自動化部署、擴展和管理容器化應(yīng)用程序的開源系統(tǒng)?!睋Q句話說,Kubernetes 為我們提供了一個容器編排系統(tǒng),用于妥善管理我們的集群,讓我們可以部署、管理資源并擴展應(yīng)用。K8s 將我們的容器包裹起來,為我們掌舵。
?
以下就是我們從使用 K8s 和解決上述挑戰(zhàn)中獲得的一些好處:
崩潰時容器的自行修復——Kubernetes 提供了一種健康檢查機制。這意味著不再需要實現(xiàn)檢查 API 來對我們的服務(wù)進行采樣。
應(yīng)用容器的自動分發(fā)和調(diào)度為我們提供了節(jié)點資源的高效利用。通過與多個應(yīng)用程序共享節(jié)點實例,明智、高效地利用資源。

自動推出和回滾,無需停機。
服務(wù)發(fā)現(xiàn)和負載平衡可幫助容器相互通信。
水平擴展可確保開發(fā)人員在低負載或高負載的情況下同時使用應(yīng)用程序,從而提高應(yīng)用程序的性能。
?
總之,Kubernetes 是大規(guī)模管理容器化應(yīng)用程序的最佳解決方案。憑借其強大的組件和自動化功能,Kubernetes 簡化了應(yīng)用程序生命周期的部署、擴展和管理。與直接在一個 EC2 實例上使用 Docker 相比,Kubernetes 可以節(jié)省時間和精力,并為管理生產(chǎn)中的應(yīng)用程序提供基本功能。
?
最重要的是,Kubernetes 能為公司節(jié)省資金。通過自動管理基礎(chǔ)設(shè)施,Kubernetes 減少了對人工干預和內(nèi)部工具的需求,如上所述,這可以節(jié)省大量運營成本。此外,Kubernetes 還可以幫助優(yōu)化資源利用率,使在相同硬件上運行更多應(yīng)用程序成為可能,從而節(jié)省成本。
?
每位開發(fā)人員都應(yīng)了解的 K8s 基本組件

Kubernetes 的核心組件分為兩大類:控制平面組件和節(jié)點。讓我們來看看這些高級組件:
?
API 服務(wù)器
API 服務(wù)器是控制平面的核心組件,負責公開 Kubernetes API 并處理 API 請求。它是集群中其他組件(如 kubectl 命令行工具或 Kubernetes 面板)與集群交互的主要方式。
?
調(diào)度器
調(diào)度器負責根據(jù)可用資源以及指定的限制和規(guī)則,將 pod 調(diào)度到集群中的節(jié)點上。它可確保以最大限度提高資源利用率和減少資源爭用的方式將 pod 放置在節(jié)點上。
?
控制管理器
控制管理器是在控制平面上運行的進程,負責管理集群的狀態(tài)并確保其符合所需的狀態(tài)。它由多個不同的控制器組成,每個控制器負責集群管理的特定方面,例如部署控制器,它負責管理集群中應(yīng)用程序的部署。
?
云控制管理器
云控制管理器是在云平臺上運行 Kubernetes 時使用的特殊組件。它負責將 Kubernetes 控制平面與云提供商的 API 集成,允許集群使用云的特定功能和資源。
?
etcd
etcd 是一個分布式鍵值存儲,用于存儲 Kubernetes 集群的配置數(shù)據(jù),包括集群的當前狀態(tài)和期望狀態(tài)。它用于存儲需要在集群中所有節(jié)點間持久化的數(shù)據(jù),如集群中 pod、服務(wù)和其他對象的信息。
?
Kubelet
Kubelet 是運行在集群中每個節(jié)點上的守護進程,負責管理該節(jié)點上的 pod。Kubelet 負責啟動和停止 pod、監(jiān)控 pod 的健康狀況并在必要時重新啟動 pod 等任務(wù)。它與 Kubernetes 控制平面通信,以接收關(guān)于運行哪些 pod 以及如何管理它們的指令,還與容器運行時(如 Docker)通信,以實際執(zhí)行容器。
?
Kube-proxy
Kube-proxy 是一個在集群中每個節(jié)點上運行的守護進程,負責為集群實施虛擬網(wǎng)絡(luò)基礎(chǔ)設(shè)施。Kube-proxy 使用網(wǎng)絡(luò)編程技術(shù),根據(jù)集群網(wǎng)絡(luò)配置中定義的規(guī)則,將網(wǎng)絡(luò)流量轉(zhuǎn)發(fā)到適當?shù)?pod 或服務(wù)。Kube-proxy 執(zhí)行的一些主要任務(wù)包括負載平衡、服務(wù)發(fā)現(xiàn)和網(wǎng)絡(luò)策略執(zhí)行。
?
總結(jié)
作為開發(fā)人員,全面了解我們所遇到的技術(shù)至關(guān)重要,無論這些技術(shù)是與我們的直接職責直接相關(guān),還是由單獨的 DevOps 團隊管理,本文將作為一個完美的起點,推動您深入了解 K8s 的世界。
?
K8s 擁有陡峭的學習曲線,對于開發(fā)人員太過笨重。基于平臺工程理念構(gòu)建的全新一代應(yīng)用管理平臺 Walrus 將分離研發(fā)和運維的關(guān)注點,通過提供靈活強大的應(yīng)用和環(huán)境部署管理能力、可屏蔽基礎(chǔ)設(shè)施的上層抽象,使研發(fā)人員能夠在無需了解底層技術(shù)細節(jié)的前提下自助構(gòu)建、部署和運行應(yīng)用程序,減輕開發(fā)人員的認知負擔。借助 Walrus 將云原生的能力和最佳實踐擴展到非容器化環(huán)境,并支持任意應(yīng)用形態(tài)統(tǒng)一編排部署,降低使用基礎(chǔ)設(shè)施的復雜度,為研發(fā)和運維團隊提供易用、一致的應(yīng)用管理和部署體驗,進而構(gòu)建無縫協(xié)作的軟件交付流程。復制下方項目鏈接至瀏覽器,即刻試用 Walrus。
?
開源地址:github.com/seal-io/walrus
?
參考鏈接:
https://medium.com/appsflyerengineering/hi-developer-meet-kubernetes-8652bdc210d9