你應該會看到很多關於Kubernetes和Docker的訊息,以至於你可能想知道哪個更好。
事實上,沒有“更好”一說,因為它們所解決的問題是不一樣的。Docker就像飛機,而Kubernetes就像飛機場。就像你不可能說“我應該基於哪個去旅行——飛機或者飛機場?”,Docker和Kubernetes也是一樣的,你需要它們兩個。
在這篇文章中,我們將描述一個部署場景,講述容器和編排工具是如何幫助部署的,以及開發人員每天是如何使用它們。看完這篇文章,你將瞭解它們在一起的方式。
首先,我們從一個在每次部署中奮鬥的人的典型一天開始。然後,我會解釋這兩種技術如何提供幫助。為了更實際一點,我們虛構一個開發人員John Smith,John是一家為初創公司工作的開發人員,他負責將他的程式碼部署到實時環境中。
John有兩個應用程式:一個執行在.NET Core中,另一個執行在Node.js中。 每當新版本的語言、框架或庫出來時,他必須進行升級。問題是當他所安裝的東西不相容時,導致app不能正常工作,他需要安裝、解除安裝、更新或刪除,直到最終恢復執行。當他完成了這些事情,恢復了執行環境,然後需要在另一個環境再來一次時,問題就更大了,畢竟在短時間內需要記住所有的步驟是非常困難的。
一種解決方案是讓他使用虛擬機器(VM)。這樣,他可以隔離所有依賴項,並避免影響任何現有的應用程式及其依賴項。
雖然這個解決方案可以起到一定的作用,但不能擴充套件,為什麼?因為每當有所改變時,他必須做新的快照。然後他必須以某種方式組織這些虛擬機器快照的所有不同版本。他仍然需要將程式碼中的更改以及任何依賴部署到其他環境中。當然,他也可能在其他環境出現問題,然後修複它。但是如果是在生產環境時,事情就會變得危險。他必須與類生產環境一起工作來緩解部署並降低風險,這很難做到。
即使有自動化,部署也可能過於複雜。也許John甚至不得不花整整一個週末來做部署以及修複各種瑣碎的東西。
我們都希望部署可以像按下按鈕一樣簡單,這就是Docker和Kubernetes發揮作用的地方。
Docker是一家提供容器平臺的公司。容器是一種將軟體執行所需要的一切打包並隔離的方法。我說“隔離”的意思是因為容器可以從宿主機分配單獨的資源。這聽起來與虛擬機器非常相似[1],但不同之處在於容器更輕:它們不需要另一個作業系統來執行軟體。容器讓你變得更加敏捷,並構建安全且行動式應用程式,這樣可以讓你在完成良好的基礎架構時節省一些成本。
我知道這聽起來像是一本教科書的定義,所以讓我們實際看看John生活中的這一天是如何獲益的。
假設John決定開始他的容器之旅。他瞭解到Docker容器與基礎映象一起工作是執行應用程式的基礎。基礎映象及其所有依賴關係在名為“Dockerfile”的檔案中進行了描述。Dockerfile就像一篇食譜,你在Dockerfile中定義好執行應用程式所需要的基礎環境,而想要執行你的應用的任何人只需要透過Dockerfile就能構建一個相同的基礎環境。John從.NET Core應用程式開始,Dockerfile看起來像這樣:
FROM microsoft/aspnetcore-build:2.0 AS build-env
WORKDIR /app
# Copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore
# Copy everything else and build
COPY . ./
RUN dotnet publish -c Release -o out
# Build runtime image
FROM microsoft/aspnetcore:2.0
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "hello.dll"]
正如你所看到的,這就好像你在程式設計。唯一的區別是你只是定義所有的依賴關係,並宣告如何構建和執行應用程式。
John需要將該檔案放入原始碼的根目錄並執行以下命令:
docker build -t dotnetapp .
該命令將建立一個包含編譯程式碼及其所有依賴項的映象。他只需要做一次“構建”,因為這種方式是讓應用程式可移植到任何地方。所以,當他想執行應用程式時,只需要安裝Docker,然後執行以下命令:
docker run -d -p 80:80 dotnetapp
該命令將開始在主機的埠80上執行應用程式。無論他在哪裡執行此命令都無關緊要,只要埠80沒有被使用,應用程式就會工作。
John現在就可以將應用程式釋出到任何地方,因為他已經將應用程式打包在Docker容器中。
為什麼這種方式更好?因為John不必擔心忘記他在本地計算機或任何其他伺服器上安裝的內容。當團隊擴大時,新的開發人員可以迅速開始coding。當約翰的公司聘用一位運維人員時,新員工將知道容器中包含了什麼。如果他們想要升級框架或者依賴項,他們就可以做到,而不用擔心影響當前的工作。
使用Docker打包併發布你的應用程式,而不用擔心應用程式在本地進行測試後是否可以在其他地方使用。如果它在你的機器上能夠工作,它會在別人的機器上也能正常工作。
使用Kubernetes部署和擴充套件你的應用程式
完成了上面的事情,John現在只需要到他想要釋出應用程式的伺服器上啟動容器就好。比方說,在生產中,他有十臺伺服器來支援流量負載。他必須在所有伺服器上執行先前的命令。如果由於某種原因容器死亡,他必須去該伺服器執行命令以再次啟動它。
這聽起來不像是一種改進,對吧?這與虛擬機器沒有多大區別。當程式發生異常時,他仍然需要手動去再次啟動容器。他也可以自動執行該任務,但他需要考慮健康檢查和可用資源等事情。所以這就是Kubernetes需要解決的事情。
正如官網[2]所說,Kubernetes是一個開源系統,用於自動化容器化應用程式的部署、擴充套件和管理。相同作用的工具[3]有很多種,但Kubernetes是目前最流行的一種。Kubernetes執行容器編排,因此你不必編寫這些任務的指令碼。 這是將你的應用程式容器化後的下一步,以及你如何在生產中大規模執行容器。
Kubernetes將幫助你在任何地方以相同的方式部署應用程式。你只需要用宣告性語言說出你想如何執行容器即可。你將擁有一個負載均衡器,執行最少量的容器,並且只有在需要時才可以向上擴充套件或向下縮小。你將規模執行所需的一切,並且你將在同一個地方擁有這一切。不僅如此,感謝Minikube,你現在可以在本地執行自己的Kubernetes叢集,或者你可以使用Docker,因為Docker現在正式支援Kubernetes。
所以,回到John這邊,他可以定義他想要如何部署一個名為“dotnetapp”的應用程式。
我們來看“dotnetapp-deployment.yaml”檔案,其中John定義瞭如何在Kubernetes叢集中執行部署,包括在容器級別的所有依賴關係。在這種情況下,除了啟動dotnetapp外,它還使用容器啟動資料庫。以下就是該檔案:
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: dotnetapp
spec:
replicas: 3
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
minReadySeconds: 5
template:
metadata:
labels:
app: dotnetapp
spec:
containers:
- name: dotnetapp
image: johndoe/dotnetapp:1.0
ports:
- containerPort: 80
resources:
requests:
cpu: 250m
limits:
cpu: 500m
env:
- name: DB_ENDPOINT
value: "dotnetappdb"
---
apiVersion: v1
kind: Service
metadata:
name: dotnetapp
spec:
type: LoadBalancer
ports:
- port: 80
selector:
app: dotnetapp
John現在只需執行如下命令即可在本地或其他任何Kubernetes叢集中部署應用程式:
kubectl apply -f .\dotnetapp-deployment.yaml
該命令會建立所需的所有東西,或者如果已經有一個存在了,它將會更新現有應用程式。
John可以在這臺計算機或任何其他環境(包括生產環境)上執行完全相同的命令,並且在任何地方都能以相同的方式執行。不僅如此,Kubernetes根據你使用的yaml檔案中定義的不斷檢查你的部署狀態,如果一個Docker容器出現故障,Kubernetes會自動啟動一個新容器。John不再需要去每臺伺服器上啟動容器,編排軟體會為他處理這件事,並且它會一直在監控應用程式,以確保它始終按預期執行。
這就是你如何在大約五分鐘輕鬆完成一天的多次部署的方法。
現在你知道什麼是Docker和Kubernetes,而不僅僅只是瞭解概念。你也從一個實際的角度進行了瞭解。這兩種技術都使用宣告性語言來定義它們將如何執行和編排應用程式。
你將能夠提供更快速的交付,但更重要的是,你將以一致且可預測的方式進行交付。Docker容器將幫助你隔離和打包你的軟體及其所有依賴項。 Kubernetes將幫助你部署和協調你的容器。這可讓你專註於開發新功能並更快地修複錯誤。然後你會註意到,在某個時候,你的部署不再是一個大型工程。
最後,最重要的是要記住:當你將Docker和Kubernetes結合在一起時,每個人都會增加信心和生產力。
-
https://www.docker.com/what-container
-
https://kubernetes.io/
-
https://devops.com/characterizing-and-contrasting-container-orchestrators/
原文連結:https://dzone.com/articles/the-advantages-of-using-kubernetes-and-docker-toge
本次培訓內容包括:Docker基礎、容器技術、Docker映象、資料共享與持久化、Docker三駕馬車、Docker實踐、Kubernetes基礎、Pod基礎與進階、常用物件操作、服務發現、Helm、Kubernetes核心元件原理分析、Kubernetes服務質量保證、排程詳解與應用場景、網路、基於Kubernetes的CI/CD、基於Kubernetes的配置管理等,點選瞭解具體培訓內容。
長按二維碼向我轉賬
受蘋果公司新規定影響,微信 iOS 版的贊賞功能被關閉,可透過二維碼轉賬支援公眾號。