揭開 Kubernetes 的神祕面紗

揭開 Kubernetes 的神秘面紗

Kubernetes 是一款生產級的開源系統,用於容器化應用程序的自動部署、擴展和管理。本文關於使用 Kubernetes 來管理容器。-- Abhinav Nath Gupta(作者)

“容器”已成為最新的流行語之一。但是,這個詞到底意味著什麼呢?說起“容器”,人們通常會把它和 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 可能封裝一個由緊密關聯且需要共享資源的多個同位容器組成的應用程序。

副本集(ReplicaSet):副本集的目的是維護在任何給定時間運行的一組穩定的副本容器集。 副本集包含有關一個特定 Pod 應該運行多少個副本的信息。為了創建多個 Pod 以匹配副本集條件,Kubernetes 使用 Pod 模板。副本集與其 Pod 的鏈接是通過後者的 metas.ownerReferences 字段實現,該字段指定哪個資源擁有當前對象。

服務(Services):服務是一種抽象,用來公開一組 Pod 功能。使用 Kubernetes,你無需修改應用程序即可使用陌生服務發現機制。Kubernetes 給 Pod 提供了其自己的 IP 地址和一組 Pod 的單個 DNS 名稱,並且可以在它們之間負載平衡。

服務解決的一個主要問題是 Web 應用程序前端和後端的集成。由於 Kubernetes 將幕後的 IP 地址提供給 Pod,因此當 Pod 被殺死並復活時,IP 地址會更改。這給給定的後端 IP 地址連接到相應的前端 IP 地址帶來一個大問題。服務通過在 Pod 上提供抽象來解決此問題,類似於負載均衡器。

卷(Volumes): Kubernetes 卷具有明確的生命週期,與圍繞它的 Pod 相同。 因此,卷超過了 Pod 中運行的任何容器的壽命,並且在容器重新啟動後保留了數據。當然,當 Pod 不存在時,該卷也將不再存在。也許比這更重要的是 Kubernetes 支持多種類型的卷,並且 Pod 可以同時使用任意數量的卷。

卷的核心只是一個目錄,其中可能包含一些數據,Pod 中的容器可以訪問該目錄。該目錄是如何產生的,它後端基於什麼存儲介質,其中的數據內容是什麼,這些都由使用的特定卷類型來決定的。

為什麼選擇 Kubernetes?

容器是捆綁和運行應用程序的好方法。在生產環境中,你需要管理運行應用程序的容器,並確保沒有停機時間。例如,如果一個容器發生故障,則需要啟動另一個容器。如果由系統自動實現這一操作,豈不是更好? Kubernetes 就是來解決這個問題的!Kubernetes 提供了一個框架來彈性運行分佈式系統。該框架負責擴展需求、故障轉移、部署模式等。例如,Kubernetes 可以輕鬆管理系統的金絲雀部署。

Kubernetes 為用戶提供了:

  1. 服務發現和負載平衡
  2. 存儲編排
  3. 自動退出和回退
  4. 自動打包
  5. 自我修復
  6. 秘密配置管理

Kubernetes 可以做什麼?

在本文中,我們將會看到一些從頭構建 Web 應用程序時如何使用 Kubernetes 的代碼示例。我們將在 Python 中使用 Flask 創建一個簡單的後端服務器。

對於那些想從頭開始構建 Web 應用程序的人,有一些前提條件,即:

  1. 對 Docker、Docker 容器和 Docker 鏡像的基本瞭解。可以訪問 這裡 快速瞭解。
  2. 系統中應該安裝 Docker。
  3. 系統中應該安裝 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 文件的說明如下:

  1. Docker 將從 DockerHub 獲取 Python 3.7 鏡像。
  2. 將在鏡像中創建一個應用程序目錄。
  3. 它將一個 /app 目錄設置為工作目錄。
  4. 將內容從主機中的應用程序目錄複製到鏡像應用程序目錄。
  5. 發佈端口 5000。
  6. 最後,它運行命令,啟動 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

本文由 LCTT 原創編譯, Linux中國 榮譽推出


分享到:


相關文章: