揭開 Kubernetes 的神祕面紗
Kubernetes 是一款生產級的開源系統,用於容器化應用程式的自動部署、擴充套件和管理。本文關於使用 Kubernetes 來管理容器。
“容器”已成為最新的流行語之一。但是,這個詞到底意味著什麼呢?說起“容器”,人們通常會把它和 Docker 聯絡起來,Docker 是一個被定義為軟體的標準化單元容器。該容器將軟體和執行軟體所需的環境封裝到一個易於交付的單元中。
容器是一個軟體的標準單元,用它來打包程式碼及其所有依賴項,這樣應用程式就可以從一個計算環境到另一個計算環境快速可靠地執行。容器通過建立類似於 ISO 映象的方式來實現此目的。容器映象是一個輕量級的、獨立的、可執行的軟體包,其中包含執行應用程式所需的所有資訊,包括程式碼、執行時、系統工具、系統庫和設定。
容器映象在執行時變成容器,對於 Docker 容器,映象在 Docker 引擎上執行時變成容器。容器將軟體與環境隔離開來,確保不同環境下的例項,都可以正常執行。
什麼是容器管理?
容器管理是組織、新增或替換大量軟體容器的過程。容器管理使用軟體來自動化建立、部署和擴充套件容器。這一過程就需要容器編排,容器編排是一個自動對基於容器的應用程式進行部署、管理、擴充套件、聯網和提供可用性的工具。
Kubernetes
Kubernetes 是一個可移植的、可擴充套件的開源平臺,用於管理容器化的工作負載和服務,它有助於配置和自動化。它最初由 Google 開發,擁有一個龐大且快速增長的生態系統。Kubernetes 的服務、技術支援和工具得到廣泛應用。
Google 在 2014 年開源了 Kubernetes 專案。Kubernetes 建立在 Google 十五年大規模執行生產工作負載的經驗基礎上,並結合了社群中最好的想法和實踐以及宣告式句法的使用。
下面列出了與Kubernetes生態系統相關的一些常用術語。
Pod:Pod 是 Kubernetes 應用程式的基本執行單元,是你建立或部署的 Kubernetes 物件模型中的最小和最簡單的單元。Pod 代表在 Kubernetes 叢集上執行的程式。
Pod 將執行中的容器、儲存、網路 IP(唯一)和控制容器應如何執行的命令封裝起來。它代表 Kubernetes 生態系統內的單個部署單元,代表一個應用程式的單個例項,該程式可能包含一個或多個緊密耦合並共享資源的容器。
Kubernetes 叢集中的 Pod 有兩種主要的使用方式。第一種是執行單個容器。即“一個容器一個 Pod”,這種方式是最常見的。第二種是執行多個需要一起工作的容器。
Pod 可能封裝一個由緊密關聯且需要共享資源的多個同位容器組成的應用程式。
副本集:副本集的目的是維護在任何給定時間執行的一組穩定的副本容器集。 副本集包含有關一個特定 Pod 應該執行多少個副本的資訊。為了建立多個 Pod 以匹配副本集條件,Kubernetes 使用 Pod 模板。副本集與其 Pod 的連結是通過後者的 metas.ownerReferences
欄位實現,該欄位指定哪個資源擁有當前物件。
服務:服務是一種抽象,用來公開一組 Pod 功能。使用 Kubernetes,你無需修改應用程式即可使用陌生服務發現機制。Kubernetes 給 Pod 提供了其自己的 IP 地址和一組 Pod 的單個 DNS 名稱,並且可以在它們之間負載平衡。
服務解決的一個主要問題是 Web 應用程式前端和後端的整合。由於 Kubernetes 將幕後的 IP 地址提供給 Pod,因此當 Pod 被殺死並復活時,IP 地址會更改。這給給定的後端 IP 地址連線到相應的前端 IP 地址帶來一個大問題。服務通過在 Pod 上提供抽象來解決此問題,類似於負載均衡器。
卷: Kubernetes 卷具有明確的生命週期,與圍繞它的 Pod 相同。 因此,卷超過了 Pod 中執行的任何容器的壽命,並且在容器重新啟動後保留了資料。當然,當 Pod 不存在時,該卷也將不再存在。也許比這更重要的是 Kubernetes 支援多種型別的卷,並且 Pod 可以同時使用任意數量的卷。
卷的核心只是一個目錄,其中可能包含一些資料,Pod 中的容器可以訪問該目錄。該目錄是如何產生的,它後端基於什麼儲存介質,其中的資料內容是什麼,這些都由使用的特定卷型別來決定的。
為什麼選擇 Kubernetes?
容器是捆綁和執行應用程式的好方法。在生產環境中,你需要管理執行應用程式的容器,並確保沒有停機時間。例如,如果一個容器發生故障,則需要啟動另一個容器。如果由系統自動實現這一操作,豈不是更好? Kubernetes 就是來解決這個問題的!Kubernetes 提供了一個框架來彈性執行分散式系統。該框架負責擴充套件需求、故障轉移、部署模式等。例如,Kubernetes 可以輕鬆管理系統的金絲雀部署。
Kubernetes 為使用者提供了:
- 服務發現和負載平衡
- 儲存編排
- 自動退出和回退
- 自動打包
- 自我修復
- 祕密配置管理
Kubernetes 可以做什麼?
在本文中,我們將會看到一些從頭構建 Web 應用程式時如何使用 Kubernetes 的程式碼示例。我們將在 Python 中使用 Flask 建立一個簡單的後端伺服器。
對於那些想從頭開始構建 Web 應用程式的人,有一些前提條件,即:
- 對 Docker、Docker 容器和 Docker 映象的基本瞭解。可以訪問這裡快速瞭解。
- 系統中應該安裝 Docker。
- 系統中應該安裝 Kubernetes,有關如何在本地計算機上安裝的說明,請訪問這裡。
現在,建立一個目錄,如下程式碼片段所示:
mkdir flask-kubernetes/app && cd flask-kubernetes/app
接下來,在 flask-kubernetes/app
目錄中,建立一個名為 main.py
的檔案,如下面的程式碼片段所示:
touch main.py
在新建立的 main.py
檔案中,貼上下面程式碼:
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello from Kubernetes!"
if __name__ == "__main__":
app.run(host='0.0.0.0')
使用下面命令在本地安裝 Flask:
pip install Flask==0.10.1
Flask 安裝後,執行下面的命令:
python app.py
應該在本地 5000 埠執行 Flask 伺服器,這是 Flask 應用程式的預設埠,並且你可以在 http://localhost:5000 上看到輸出 “Hello from Kubernetes!”。伺服器在本地執行之後,我們建立一個供 Kubernetes 使用的 Docker 映象。建立一個名為 Dockerfile
的檔案,並將以下程式碼片段貼上到其中:
FROM python:3.7
RUN mkdir /app
WORKDIR /app
ADD . /app/
RUN pip install -r requirements.txt
EXPOSE 5000
CMD ["python", "/app/main.py"]
Dockerfile
檔案的說明如下:
- Docker 將從 DockerHub 獲取 Python 3.7 映象。
- 將在映象中建立一個應用程式目錄。
- 它將一個
/app
目錄設定為工作目錄。 - 將內容從主機中的應用程式目錄複製到映象應用程式目錄。
- 釋出埠 5000。
- 最後,它執行命令,啟動 Flask 伺服器。
接下來,我們將使用以下命令建立 Docker 映象:
docker build -f Dockerfile -t flask-kubernetes:latest .
建立 Docker 映象後,我們可以使用以下命令在本地執行該映象進行測試:
docker run -p 5001:5000 flask-kubernetes
通過執行容器在本地完成測試之後,我們需要在 Kubernetes 中部署它。我們將首先使用 kubectl
命令驗證 Kubernetes 是否正在執行。如果沒有報錯,則說明它正在工作。如果有報錯,請參考該資訊。
接下來,我們建立一個部署檔案。這是一個 Yaml 檔案,其中包含有關 Kubernetes 的說明,該說明涉及如何以宣告性的方式建立 Pod 和服務。因為我們有 Flask Web 應用程式,我們將建立一個 deployment.yaml
檔案,並在其中包含 Pod 和服務宣告。
建立一個名為 deployment.yaml
的檔案並向其中新增以下內容,然後儲存:
apiVersion: v1
kind: Service
metadata:
name: flask-kubernetes -service
spec:
selector:
app: flask-kubernetes
ports:
- protocol: "TCP"
port: 6000
targetPort: 5000
type: LoadBalancer
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: flask-kubernetes
spec:
replicas: 4
template:
metadata:
labels:
app: flask-kubernetes
spec:
containers:
- name: flask-kubernetes
image: flask-kubernetes:latest
imagePullPolicy: Never
ports:
- containerPort: 5000
使用以下命令將 yaml 檔案傳送到 Kubernetes:
kubectl apply -f deployment.yaml
如果執行以下命令,你會看到 Pod 正在執行:
kubectl get pods
現在,導航至 http://localhost:6000,你應該會看到 “Hello from Kubernetes!”訊息。成功了! 該應用程式現在正在 Kubernetes 中執行!
Kubernetes 做不了什麼?
Kubernetes 不是一個傳統的,包羅永珍的 PaaS(平臺即服務)系統。 由於 Kubernetes 執行在容器級別而非硬體級別,因此它提供了 PaaS 產品共有的一些普遍適用功能,如部署、擴充套件、負載平衡、日誌記錄和監控。Kubernetes 為開發人員平臺提供了構建塊,但在重要的地方保留了使用者的選擇和靈活性。
- Kubernetes 不限制所支援的應用程式的型別。如果應用程式可以在容器中執行,那麼它應該可以在 Kubernetes 上更好地執行。
- 它不部署和構建原始碼。
- 它不決定日誌記錄、監視或警報解決方案。
- 它不提供或不要求配置語言/系統。它提供了一個宣告式的 API 供所有人使用。
- 它不提供或不採用任何全面的機器配置、維護、管理或自我修復系統。
via: https://opensourceforu.com/2019/11/demystifying-kubernetes/
作者:Abhinav Nath Gupta 選題:lujun9972 譯者:Morisun029 校對:wxy
訂閱“Linux 中國”官方小程式來檢視
相關文章
- 揭開“QUIC”的神祕面紗UI
- 『MySQL』揭開索引神祕面紗MySql索引
- 揭開redux,react-redux的神祕面紗ReduxReact
- 揭開Future的神祕面紗——任務取消
- 揭開單體應用程式的神祕面紗
- 揭開java記憶體模型的神祕面紗Java記憶體模型
- 揭開Future的神祕面紗——結果獲取
- 揭開Future的神祕面紗——任務執行
- 揭開NoahV智慧運維前端框架的神祕面紗運維前端框架
- 揭開DRF序列化技術的神祕面紗
- 揭開React中server-side rending的神祕面紗ReactServerIDE
- 揭開JS無埋點技術的神祕面紗JS
- 從一個Demo開始,揭開Netty的神祕面紗Netty
- 揭開C++移動與複製的神祕面紗C++
- 揭開雲原生資料管理的神祕面紗:操作層級
- 是時候揭開混合雲架構的神祕面紗了!架構
- 揭開Redux神祕面紗:手寫一個min-ReduxRedux
- 從病毒到免疫, “科學地”揭開新冠病毒的神祕面紗
- 一文帶你深扒ClassLoader核心,揭開它的神祕面紗!
- 專訪七牛何李石:揭開佈道師的神祕面紗
- 圖文並茂|為你揭開微服務架構的“神祕面紗”!微服務架構
- 揭開神祕面紗,如何組織一次分散式壓測分散式
- 揭開“散爆新品”神祕面紗,今冬育碧或成最大贏家
- 悄悄掀起 WebAssembly 的神祕面紗Web
- 毫不留情地揭開 ArrayList 和 LinkedList 之間的神祕面紗
- 揭開ThreadLocal的面紗thread
- 效能再提升70%?大咖前瞻帶你揭開.NET6的神祕面紗!
- 從理論到實施,帶你揭開管理駕駛艙的神祕面紗
- 《吃透MQ系列》之扒開Kafka的神祕面紗MQKafka
- 揭開“信創”的神秘面紗
- 萬丈高樓平地起,撥開技術神祕的面紗
- 揭開 Hyperledger Cacti 專案的面紗
- 揭開OKR (Objectives and Key Results) 的面紗OKRObject
- 揭開Kotlin協程的神秘面紗Kotlin
- 揭開周獲 18k star 開源專案的神祕面紗「GitHub 熱點速覽 v.22.28」Github
- 介面自動化測試是個啥?如何開始?什麼是框架?帶你揭開神祕面紗框架
- 揭開Java記憶體管理的面紗Java記憶體
- 揭開神秘面紗——深入淺出ThreadLocalthread