揭開 Kubernetes 的神秘面紗

2019-11-30 12:12:00

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 可能封裝一個由緊密關聯且需要共用資源的多個同位容器組成的應用程式。

副本集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 Flaskapp = 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 /appWORKDIR /appADD . /app/RUN pip install -r requirements.txt EXPOSE 5000CMD ["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: v1kind: Servicemetadata:  name: flask-kubernetes -servicespec:  selector:    app: flask-kubernetes  ports:  - protocol: "TCP"    port: 6000    targetPort: 5000  type: LoadBalancer---apiVersion: apps/v1kind: Deploymentmetadata:  name: flask-kubernetesspec:  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 供所有人使用。
  • 它不提供或不採用任何全面的機器設定、維護、管理或自我修復系統。