Kubernetes 是一款生產(chǎn)級(jí)的開源系統(tǒng),用于容器化應(yīng)用程序的自動(dòng)部署、擴(kuò)展和管理。本文關(guān)于使用 Kubernetes 來管理容器。-- Abhinav Nath Gupta(作者)
“容器”已成為最新的流行語之一。但是,這個(gè)詞到底意味著什么呢?說起“容器”,人們通常會(huì)把它和 Docker 聯(lián)系起來,Docker 是一個(gè)被定義為軟件的標(biāo)準(zhǔn)化單元容器。該容器將軟件和運(yùn)行軟件所需的環(huán)境封裝到一個(gè)易于交付的單元中。
容器是一個(gè)軟件的標(biāo)準(zhǔn)單元,用它來打包代碼及其所有依賴項(xiàng),這樣應(yīng)用程序就可以從一個(gè)計(jì)算環(huán)境到另一個(gè)計(jì)算環(huán)境快速可靠地運(yùn)行。容器通過創(chuàng)建類似于 ISO 鏡像的方式來實(shí)現(xiàn)此目的。容器鏡像是一個(gè)輕量級(jí)的、獨(dú)立的、可執(zhí)行的軟件包,其中包含運(yùn)行應(yīng)用程序所需的所有信息,包括代碼、運(yùn)行時(shí)、系統(tǒng)工具、系統(tǒng)庫(kù)和設(shè)置。
容器鏡像在運(yùn)行時(shí)變成容器,對(duì)于 Docker 容器,鏡像在 Docker 引擎上運(yùn)行時(shí)變成容器。容器將軟件與環(huán)境隔離開來,確保不同環(huán)境下的實(shí)例,都可以正常運(yùn)行。
什么是容器管理?
容器管理是組織、添加或替換大量軟件容器的過程。容器管理使用軟件來自動(dòng)化創(chuàng)建、部署和擴(kuò)展容器。這一過程就需要容器編排,容器編排是一個(gè)自動(dòng)對(duì)基于容器的應(yīng)用程序進(jìn)行部署、管理、擴(kuò)展、聯(lián)網(wǎng)和提供可用性的工具。
Kubernetes
Kubernetes 是一個(gè)可移植的、可擴(kuò)展的開源平臺(tái),用于管理容器化的工作負(fù)載和服務(wù),它有助于配置和自動(dòng)化。它最初由 google 開發(fā),擁有一個(gè)龐大且快速增長(zhǎng)的生態(tài)系統(tǒng)。Kubernetes 的服務(wù)、技術(shù)支持和工具得到廣泛應(yīng)用。
Google 在 2014 年開源了 Kubernetes 項(xiàng)目。Kubernetes 建立在 Google 十五年大規(guī)模運(yùn)行生產(chǎn)工作負(fù)載的經(jīng)驗(yàn)基礎(chǔ)上,并結(jié)合了社區(qū)中最好的想法和實(shí)踐以及聲明式句法的使用。
下面列出了與Kubernetes生態(tài)系統(tǒng)相關(guān)的一些常用術(shù)語。
Pod:Pod 是 Kubernetes 應(yīng)用程序的基本執(zhí)行單元,是你創(chuàng)建或部署的 Kubernetes 對(duì)象模型中的最小和最簡(jiǎn)單的單元。Pod 代表在 Kubernetes 集群上運(yùn)行的進(jìn)程。
Pod 將運(yùn)行中的容器、存儲(chǔ)、網(wǎng)絡(luò) IP(唯一)和控制容器應(yīng)如何運(yùn)行的命令封裝起來。它代表 Kubernetes 生態(tài)系統(tǒng)內(nèi)的單個(gè)部署單元,代表一個(gè)應(yīng)用程序的單個(gè)實(shí)例,該程序可能包含一個(gè)或多個(gè)緊密耦合并共享資源的容器。
Kubernetes 集群中的 Pod 有兩種主要的使用方式。第一種是運(yùn)行單個(gè)容器。即“一個(gè)容器一個(gè) Pod”,這種方式是最常見的。第二種是運(yùn)行多個(gè)需要一起工作的容器。
Pod 可能封裝一個(gè)由緊密關(guān)聯(lián)且需要共享資源的多個(gè)同位容器組成的應(yīng)用程序。
副本集(ReplicaSet):副本集的目的是維護(hù)在任何給定時(shí)間運(yùn)行的一組穩(wěn)定的副本容器集。 副本集包含有關(guān)一個(gè)特定 Pod 應(yīng)該運(yùn)行多少個(gè)副本的信息。為了創(chuàng)建多個(gè) Pod 以匹配副本集條件,Kubernetes 使用 Pod 模板。副本集與其 Pod 的鏈接是通過后者的 metas.ownerReferences 字段實(shí)現(xiàn),該字段指定哪個(gè)資源擁有當(dāng)前對(duì)象。
服務(wù)(Services):服務(wù)是一種抽象,用來公開一組 Pod 功能。使用 Kubernetes,你無需修改應(yīng)用程序即可使用陌生服務(wù)發(fā)現(xiàn)機(jī)制。Kubernetes 給 Pod 提供了其自己的 IP 地址和一組 Pod 的單個(gè) DNS 名稱,并且可以在它們之間負(fù)載平衡。
服務(wù)解決的一個(gè)主要問題是 Web 應(yīng)用程序前端和后端的集成。由于 Kubernetes 將幕后的 IP 地址提供給 Pod,因此當(dāng) Pod 被殺死并復(fù)活時(shí),IP 地址會(huì)更改。這給給定的后端 IP 地址連接到相應(yīng)的前端 IP 地址帶來一個(gè)大問題。服務(wù)通過在 Pod 上提供抽象來解決此問題,類似于負(fù)載均衡器。
卷(Volumes): Kubernetes 卷具有明確的生命周期,與圍繞它的 Pod 相同。 因此,卷超過了 Pod 中運(yùn)行的任何容器的壽命,并且在容器重新啟動(dòng)后保留了數(shù)據(jù)。當(dāng)然,當(dāng) Pod 不存在時(shí),該卷也將不再存在。也許比這更重要的是 Kubernetes 支持多種類型的卷,并且 Pod 可以同時(shí)使用任意數(shù)量的卷。
卷的核心只是一個(gè)目錄,其中可能包含一些數(shù)據(jù),Pod 中的容器可以訪問該目錄。該目錄是如何產(chǎn)生的,它后端基于什么存儲(chǔ)介質(zhì),其中的數(shù)據(jù)內(nèi)容是什么,這些都由使用的特定卷類型來決定的。
為什么選擇 Kubernetes?
容器是捆綁和運(yùn)行應(yīng)用程序的好方法。在生產(chǎn)環(huán)境中,你需要管理運(yùn)行應(yīng)用程序的容器,并確保沒有停機(jī)時(shí)間。例如,如果一個(gè)容器發(fā)生故障,則需要啟動(dòng)另一個(gè)容器。如果由系統(tǒng)自動(dòng)實(shí)現(xiàn)這一操作,豈不是更好? Kubernetes 就是來解決這個(gè)問題的!Kubernetes 提供了一個(gè)框架來彈性運(yùn)行分布式系統(tǒng)。該框架負(fù)責(zé)擴(kuò)展需求、故障轉(zhuǎn)移、部署模式等。例如,Kubernetes 可以輕松管理系統(tǒng)的金絲雀部署。
Kubernetes 為用戶提供了:
- 服務(wù)發(fā)現(xiàn)和負(fù)載平衡
- 存儲(chǔ)編排
- 自動(dòng)退出和回退
- 自動(dòng)打包
- 自我修復(fù)
- 秘密配置管理
Kubernetes 可以做什么?
在本文中,我們將會(huì)看到一些從頭構(gòu)建 Web 應(yīng)用程序時(shí)如何使用 Kubernetes 的代碼示例。我們將在 Python 中使用 Flask 創(chuàng)建一個(gè)簡(jiǎn)單的后端服務(wù)器。
對(duì)于那些想從頭開始構(gòu)建 Web 應(yīng)用程序的人,有一些前提條件,即:
- 對(duì) Docker、Docker 容器和 Docker 鏡像的基本了解。可以訪問 這里 快速了解。
- 系統(tǒng)中應(yīng)該安裝 Docker。
- 系統(tǒng)中應(yīng)該安裝 Kubernetes,有關(guān)如何在本地計(jì)算機(jī)上安裝的說明,請(qǐng)?jiān)L問 這里 。
現(xiàn)在,創(chuàng)建一個(gè)目錄,如下代碼片段所示:
mkdir flask-kubernetes/App && cd flask-kubernetes/app
接下來,在 flask-kubernetes/app 目錄中,創(chuàng)建一個(gè)名為 main.py 的文件,如下面的代碼片段所示:
touch main.py
在新創(chuàng)建的 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 安裝后,執(zhí)行下面的命令:
python app.py
應(yīng)該在本地 5000 端口運(yùn)行 Flask 服務(wù)器,這是 Flask 應(yīng)用程序的默認(rèn)端口,并且你可以在 http://localhost:5000 上看到輸出 “Hello from Kubernetes!”。服務(wù)器在本地運(yùn)行之后,我們創(chuàng)建一個(gè)供 Kubernetes 使用的 Docker 鏡像。創(chuàng)建一個(gè)名為 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 鏡像。
- 將在鏡像中創(chuàng)建一個(gè)應(yīng)用程序目錄。
- 它將一個(gè) /app 目錄設(shè)置為工作目錄。
- 將內(nèi)容從主機(jī)中的應(yīng)用程序目錄復(fù)制到鏡像應(yīng)用程序目錄。
- 發(fā)布端口 5000。
- 最后,它運(yùn)行命令,啟動(dòng) Flask 服務(wù)器。
接下來,我們將使用以下命令創(chuàng)建 Docker 鏡像:
docker build -f Dockerfile -t flask-kubernetes:latest .
創(chuàng)建 Docker 鏡像后,我們可以使用以下命令在本地運(yùn)行該鏡像進(jìn)行測(cè)試:
docker run -p 5001:5000 flask-kubernetes
通過運(yùn)行容器在本地完成測(cè)試之后,我們需要在 Kubernetes 中部署它。我們將首先使用 kubectl 命令驗(yàn)證 Kubernetes 是否正在運(yùn)行。如果沒有報(bào)錯(cuò),則說明它正在工作。如果有報(bào)錯(cuò),請(qǐng)參考 該信息 。
接下來,我們創(chuàng)建一個(gè)部署文件。這是一個(gè) Yaml 文件,其中包含有關(guān) Kubernetes 的說明,該說明涉及如何以聲明性的方式創(chuàng)建 Pod 和服務(wù)。因?yàn)槲覀冇?Flask Web 應(yīng)用程序,我們將創(chuàng)建一個(gè) deployment.yaml 文件,并在其中包含 Pod 和服務(wù)聲明。
創(chuàng)建一個(gè)名為 deployment.yaml 的文件并向其中添加以下內(nèi)容,然后保存:
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 文件發(fā)送到 Kubernetes:
kubectl apply -f deployment.yaml
如果執(zhí)行以下命令,你會(huì)看到 Pod 正在運(yùn)行:
kubectl get pods
現(xiàn)在,導(dǎo)航至 http://localhost:6000,你應(yīng)該會(huì)看到 “Hello from Kubernetes!”消息。成功了! 該應(yīng)用程序現(xiàn)在正在 Kubernetes 中運(yùn)行!
Kubernetes 做不了什么?
Kubernetes 不是一個(gè)傳統(tǒng)的,包羅萬象的 PaaS(平臺(tái)即服務(wù))系統(tǒng)。 由于 Kubernetes 運(yùn)行在容器級(jí)別而非硬件級(jí)別,因此它提供了 PaaS 產(chǎn)品共有的一些普遍適用功能,如部署、擴(kuò)展、負(fù)載平衡、日志記錄和監(jiān)控。Kubernetes 為開發(fā)人員平臺(tái)提供了構(gòu)建塊,但在重要的地方保留了用戶的選擇和靈活性。
- Kubernetes 不限制所支持的應(yīng)用程序的類型。如果應(yīng)用程序可以在容器中運(yùn)行,那么它應(yīng)該可以在 Kubernetes 上更好地運(yùn)行。
- 它不部署和構(gòu)建源代碼。
- 它不決定日志記錄、監(jiān)視或警報(bào)解決方案。
- 它不提供或不要求配置語言/系統(tǒng)。它提供了一個(gè)聲明式的 API 供所有人使用。
- 它不提供或不采用任何全面的機(jī)器配置、維護(hù)、管理或自我修復(fù)系統(tǒng)。
via: https://opensourceforu.com/2019/11/demystifying-kubernetes/
作者: Abhinav Nath Gupta 選題: lujun9972 譯者: Morisun029 校對(duì): wxy
本文由 LCTT 原創(chuàng)編譯, linux中國(guó) 榮譽(yù)推出