一、什么是容器編排?
容器技術(shù)的核心概念是容器、鏡像、倉庫,使用這三大基本要素我們就可以輕松地完成應(yīng)用的打包、分發(fā)工作,實(shí)現(xiàn)“一次開發(fā),到處運(yùn)行”的夢想。
不過,當(dāng)我們熟練地掌握了容器技術(shù),信心滿滿地要在服務(wù)器集群里大規(guī)模實(shí)施的時(shí)候,卻會(huì)發(fā)現(xiàn)容器技術(shù)的創(chuàng)新只是解決了運(yùn)維部署工作中一個(gè)很小的問題。現(xiàn)實(shí)生產(chǎn)環(huán)境的復(fù)雜程度實(shí)在是太高了,除了最基本的安裝,還會(huì)有各式各樣的需求,比如服務(wù)發(fā)現(xiàn)、負(fù)載均衡、狀態(tài)監(jiān)控、健康檢查、擴(kuò)容縮容、應(yīng)用遷移、高可用等等。
雖然容器技術(shù)開啟了云原生時(shí)代,但它也只走出了一小步,再繼續(xù)前進(jìn)就無能為力了,因?yàn)檫@已經(jīng)不再是隔離一兩個(gè)進(jìn)程的普通問題,而是要隔離數(shù)不清的進(jìn)程,還有它們之間互相通信、互相協(xié)作的超級(jí)問題,困難程度可以說是指數(shù)級(jí)別的上升。
這些容器之上的管理、調(diào)度工作,就是這些年最流行的詞匯:“容器編排”(Container Orchestration)。
容器編排這個(gè)詞聽起來好像挺高大上,但如果你理解了之后就會(huì)發(fā)現(xiàn)其實(shí)也并不神秘。像我們在上次課里使用 Docker 部署 WordPress 網(wǎng)站的時(shí)候,把 Nginx、WordPress、MariaDB 這三個(gè)容器理清次序、配好 IP 地址去運(yùn)行,就是最初級(jí)的一種“容器編排”,只不過這是純手工操作,比較原始、粗糙。
面對單機(jī)上的幾個(gè)容器,“人肉”編排調(diào)度還可以應(yīng)付,但如果規(guī)模上到幾百臺(tái)服務(wù)器、成千上萬的容器,處理它們之間的復(fù)雜聯(lián)系就必須要依靠計(jì)算機(jī)了,而目前計(jì)算機(jī)用來調(diào)度管理的“事實(shí)標(biāo)準(zhǔn)”,就是我們主角:Kubernetes。
二、什么是 Kubernetes
簡單來說,Kubernetes 就是一個(gè)生產(chǎn)級(jí)別的容器編排平臺(tái)和集群管理系統(tǒng),不僅能夠創(chuàng)建、調(diào)度容器,還能夠監(jiān)控、管理服務(wù)器,它凝聚了 Google 等大公司和開源社區(qū)的集體智慧,從而讓中小型公司也可以具備輕松運(yùn)維海量計(jì)算節(jié)點(diǎn)——也就是“云計(jì)算”的能力。
三、什么是 minikube
快速搭建Kubernetes 環(huán)境的工具(官網(wǎng)) 點(diǎn)我 >_< !
它是一個(gè)“迷你”版本的 Kubernetes,自從 2016 年發(fā)布以來一直在積極地開發(fā)維護(hù),緊跟 Kubernetes 的版本更新,同時(shí)也兼容較舊的版本(最多只到之前的 6 個(gè)小版本)。minikube 最大特點(diǎn)就是“小而美”,可執(zhí)行文件僅有不到 100MB,運(yùn)行鏡像也不過 1GB,但就在這么小的空間里卻集成了 Kubernetes 的絕大多數(shù)功能特性,不僅有核心的容器編排功能,還有豐富的插件,例如 Dashboard、GPU、Ingress、Istio、Kong、Registry 等等,綜合來看非常完善。
四、如何搭建 minikube 環(huán)境
minikube 支持 Mac、Windows、Linux 這三種主流平臺(tái),你可以在它的官網(wǎng)(https://minikube.sigs.k8s.io/docs/start/)找到詳細(xì)的安裝說明,當(dāng)然在我這里就只用虛擬機(jī)里的 Linux 了。
minikube 不包含在系統(tǒng)自帶的 apt/yum 軟件倉庫里,我們只能自己去網(wǎng)上找安裝包。不過因?yàn)樗怯?Go 語言開發(fā)的,整體就是一個(gè)二進(jìn)制文件,沒有多余的依賴,所以安裝過程也非常簡單,只需要用 curl 或者 wget 下載就行。
注意:這里我下載v1.25.2版本的minikube 支持的k8s版本,支持的 Kubernetes 版本是 1.23.3,如果想要安裝最新版本可以直接用releases版本 支持1.26版本的k8s
1.下載minikube并安裝
# 根據(jù)服務(wù)器的架構(gòu)選擇對應(yīng)的二進(jìn)制包
# Intel x86_64
curl -Lo minikube https://storage.googleapis.com/minikube/v1.25.2/latest/minikube-linux-amd64
sudo install minikube /usr/local/bin/
# 最新版本
# Intel x86_64
curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube /usr/local/bin/
2.檢測minikube是否正常安裝
安裝完成之后,你可以執(zhí)行命令 minikube version,看看它的版本號(hào),驗(yàn)證是否安裝成功:
[root@k8s-minkube ~]# minikube version
minikube version: v1.25.2
commit: 362d5fdc0a3dbee389b3d3f1034e8023e72bd3a7
3.k8s命令客戶端工具-kubectl
minikube 只能夠搭建 Kubernetes 環(huán)境,要操作 Kubernetes,還需要另一個(gè)專門的客戶端工具“kubectl”。
kubectl 它是一個(gè)命令行工具,作用也比較類似,同樣是與 Kubernetes 后臺(tái)服務(wù)通信,把我們的命令轉(zhuǎn)發(fā)給 Kubernetes,實(shí)現(xiàn)容器和集群的管理功能。
kubectl 是一個(gè)與 Kubernetes、minikube 彼此獨(dú)立的項(xiàng)目,所以不包含在 minikube 里,但 minikube 提供了安裝它的簡化方式,你只需執(zhí)行下面的這條命令:
# minikube kubectl
它就會(huì)把與當(dāng)前 Kubernetes 版本匹配的 kubectl 下載下來,存放在內(nèi)部目錄(例如 .minikube/cache/linux/amd64/v1.23.3),然后我們就可以使用它來對 Kubernetes“發(fā)號(hào)施令”了。
所以,在 minikube 環(huán)境里,我們會(huì)用到兩個(gè)客戶端:minikube 管理 Kubernetes 集群環(huán)境,kubectl 操作實(shí)際的 Kubernetes 功能,和 Docker 比起來有點(diǎn)復(fù)雜。
我畫了一個(gè)簡單的 minikube 環(huán)境示意圖,方便理解它們的關(guān)系。
4.實(shí)際驗(yàn)證 minikube 環(huán)境
前面的工作都做完之后,我們就可以在本機(jī)上運(yùn)行 minikube,創(chuàng)建 Kubernetes 實(shí)驗(yàn)環(huán)境了。
注意:使用命令 minikube start 會(huì)從 Docker Hub 上拉取鏡像,以當(dāng)前最新版本的 Kubernetes 啟動(dòng)集群。不過為了保證實(shí)驗(yàn)環(huán)境的一致性,我們可以在后面再加上一個(gè)參數(shù) --kubernetes-version,明確指定要使用 Kubernetes 版本。
這里我使用“1.23.3”,啟動(dòng)命令就是:解釋:--force 默認(rèn)不允許用root安裝,這個(gè)參數(shù)的意思是強(qiáng)制用root安裝
--image-mirror-country='cn' 切換國內(nèi)源,默認(rèn)是拉取國外官方鏡像可能會(huì)下載不下來,所以切換到國內(nèi)
[root@k8s-minkube ~]# minikube start --image-mirror-country='cn' --kubernetes-version=v1.23.3 --force
如果想安裝最新版本,新版本的k8s使用的是containerd作為容器,需要執(zhí)行以下操作
minikube start --driver=docker --container-runtime=containerd --image-mirror-country='cn' --force
注意的是:新版本依賴的容器版本肯能會(huì)很高,版本參考建議,也可以去官網(wǎng):
docker:23.0.1
minikube:1.29.0
kubectl:1.26.1
我這里已經(jīng)提前下載過了
4.1 查看集群狀態(tài)
# 查看當(dāng)前節(jié)點(diǎn),因?yàn)閱螜C(jī)所以只要一個(gè)節(jié)點(diǎn)
[root@k8s-minkube ~]# minikube node list
minikube 192.168.49.2
# 查看集群組件狀態(tài)
[root@k8s-minkube ~]# minikube status
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured
可以看到 Kubernetes 集群里現(xiàn)在只有一個(gè)節(jié)點(diǎn),名字就叫“minikube”,類型是“Control Plane”,里面有 host、kubelet、apiserver 三個(gè)服務(wù),IP 地址是 192.168.49.2。
你還可以用命令 minikube ssh 登錄到這個(gè)節(jié)點(diǎn)上,雖然它是虛擬的,但用起來和實(shí)機(jī)也沒什么區(qū)別:
[root@k8s-minkube ~]# minikube ssh
Last login: Sun Mar 19 12:21:24 2023 from 192.168.49.1
docker@minikube:~$
5.操作k8s集群
有了集群,接下來就可以使用 kubectl 來操作一下,初步體會(huì) Kubernetes 這個(gè)容器編排系統(tǒng),最簡單的命令當(dāng)然就是查看版本:
kubectl version
注意: 不過這條命令還不能直接用,因?yàn)槭褂?minikube 自帶的 kubectl 有一點(diǎn)形式上的限制,要在前面加上 minikube 的前綴,后面再有個(gè) --,像這樣:
minikube kubectl -- version
為了避免這個(gè)不大不小的麻煩,我建議你使用 Linux 的“alias”功能,為它創(chuàng)建一個(gè)別名,寫到當(dāng)前用戶目錄下的 .bashrc 里,也就是這樣:
echo "alias kubectl='minikube kubectl --'" >> $HOME/.bashrc
加載k8s命令自動(dòng)補(bǔ)全功能
source <(kubectl completion bash)
操作完后就可以直接使用kubectl 操作了
[root@k8s-minkube ~]# kubectl version --short
Client Version: v1.23.3
Server Version: v1.23.3
[root@k8s-minkube ~]# kubectl version --client
Client Version: version.Info{Major:"1", Minor:"23", GitVersion:"v1.23.3", GitCommit:"816c97ab8cff8a1c72eccca1026f7820e93e0d25", GitTreeState:"clean", BuildDate:"2022-01-25T21:25:17Z", GoVersion:"go1.17.6", Compiler:"gc", Platform:"linux/amd64"}
6.在k8s運(yùn)行nginx應(yīng)用
注意:需要用 --image 指定鏡像,然后 Kubernetes 會(huì)自動(dòng)拉取并運(yùn)行
kubectl run ngx --image=nginx:alpine
這里涉及 Kubernetes 里的一個(gè)非常重要的概念:Pod,你可以暫時(shí)把它理解成是“穿了馬甲”的容器,查看 Pod 列表需要使用命令 kubectl get pod,它的效果類似 docker ps:
[root@k8s-minkube ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
ngx 1/1 Running 0 8s
命令執(zhí)行之后可以看到,在 Kubernetes 集群里就有了一個(gè)名字叫 ngx 的 Pod 正在運(yùn)行,表示我們的這個(gè)單節(jié)點(diǎn) minikube 環(huán)境已經(jīng)搭建成功。
擴(kuò)展知識(shí):
1.1、如何理解容器編排?
先拆成兩個(gè)部分,什么是容器?什么是編排?以前,程序運(yùn)行在物理機(jī)或虛擬機(jī)中。容器,是現(xiàn)代程序的運(yùn)行方式。編排就是部署、管理應(yīng)用程序的系統(tǒng),能動(dòng)態(tài)地響應(yīng)變化,例如以下部分功能。
- 回滾
- 滾動(dòng)升級(jí)
- 故障自愈
- 自動(dòng)擴(kuò)縮容
自動(dòng)完成以上所有任務(wù)。需要人工最初進(jìn)行一些配置,就可以一勞永逸。回顧一下,什么是容器編排,運(yùn)行容器形式的應(yīng)用程序,這些應(yīng)用程序的構(gòu)建方式,使它們能夠?qū)崿F(xiàn)回滾、滾動(dòng)升級(jí)、故障自愈、自動(dòng)擴(kuò)縮容等。
1.2、如何理解 Kubernetes?
舉一個(gè)例子,寄、收快遞的過程。發(fā)件人將貨物按照快遞公司的標(biāo)準(zhǔn)打包,提供基本信息(收貨地址等),然后交給快遞小哥。其他事情,無需發(fā)件人操心了,例如快遞用什么交通工具運(yùn)輸、司機(jī)走哪條高速等等。快遞公司同時(shí)提供物流查詢、截?cái)嗫爝f等服務(wù)。重點(diǎn)在于,快遞公司僅需要發(fā)件人提供基本信息。Kubernetes 也是類似的,將應(yīng)用程序打包成容器,聲明運(yùn)行方式,交給 Kubernetes 即可,同時(shí)它提供了豐富的工具和 API 來控制、觀測運(yùn)行在平臺(tái)之上的應(yīng)用程序。
1.3 容器編排應(yīng)該能夠解決什么問題?
屏蔽底層的復(fù)雜性。文章來源:http://www.zghlxwxcb.cn/news/detail-788483.html
2、Kubernetes 和 Docker 之間有什么區(qū)別?
Docker 應(yīng)用打包、測試、交付。Kubernetes 基于 Docker 的產(chǎn)物,進(jìn)行編排、運(yùn)行。例如現(xiàn)在有 1 個(gè)集群,3 個(gè)節(jié)點(diǎn)。這些節(jié)點(diǎn),都以 Docker 作為容器運(yùn)行時(shí),Docker 是更偏向底層的技術(shù)。Kubernetes 更偏向上層的技術(shù) ,它實(shí)現(xiàn)了對容器運(yùn)行時(shí)的抽象,抽象的目的是兼容底層容器運(yùn)行時(shí)(容器進(jìn)行時(shí)技術(shù)不僅有 Docker,還有 containerd、kata 等,無論哪種容器運(yùn)行時(shí),Kubernetes 層面的操作都是一樣的)以及解耦,同時(shí)還提供了一套容器運(yùn)行時(shí)的標(biāo)準(zhǔn)。抽象的產(chǎn)物是容器運(yùn)行時(shí)接口 CRI。文章來源地址http://www.zghlxwxcb.cn/news/detail-788483.html
總結(jié)
- 容器技術(shù)只解決了應(yīng)用的打包、安裝問題,面對復(fù)雜的生產(chǎn)環(huán)境就束手無策了,解決之道就是容器編排,它能夠組織管理各個(gè)應(yīng)用容器之間的關(guān)系,讓它們順利地協(xié)同運(yùn)行。
- Kubernetes 源自 Google 內(nèi)部的 Borg 系統(tǒng),也是當(dāng)前容器編排領(lǐng)域的事實(shí)標(biāo)準(zhǔn)。minikube 可以在本機(jī)搭建 Kubernetes 環(huán)境,功能很完善,適合學(xué)習(xí)研究。
- 操作 Kubernetes 需要使用命令行工具 kubectl,只有通過它才能與 Kubernetes 集群交互。
- kubectl 的用法與 docker 類似,也可以拉取鏡像運(yùn)行,但操作的不是簡單的容器,而是 Pod。
到了這里,關(guān)于【k8s】搭建小巧完備的Kubernetes環(huán)境(minikube)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!