軟件測(cè)試 | K8S管理命令
接下來(lái)講解一下 K8S 的標(biāo)準(zhǔn)命令行 kubectl 的使用。 在 K8S 集群安裝的章節(jié)中已經(jīng)介紹了如何獲取 kubeconfig 文件并復(fù)制到對(duì)應(yīng)的位置。 這里要注意如果你希望讓某個(gè)用戶擁有操作 kubectl 的權(quán)限,就 需要將 kubeconfig 文件拷貝到該用戶的家目錄下。 否則該用戶是無(wú)法與 K8S 建立通信的。 講解 kubectl 命令之前需要先介紹一下 K8S 中對(duì)于資源的概念。 在 K8S 中一切皆資源, 之前介紹過(guò)的 POD 就是一種資源,同樣 job 也是一種資源。 你可以理解為在 K8S 中資源是用來(lái)描述容器的行為的, 所有的資源都是在某個(gè)維度控制如何運(yùn)行容器。 比如 POD 描述的是容器之間如何連接在一起, config map 是用來(lái)將外部的配置文件掛載到容器中為應(yīng)用程序提供配置管理的,后面要講解的 Service 是用來(lái) 接管容器網(wǎng)絡(luò)的,Role,RoleBinding 和 Service account 是用來(lái)控制容器的角色和權(quán)限的。 一切資源對(duì) 象都是為了提供更加強(qiáng)大的容器編排能力而誕生的,所以在 K8S 中一切皆資源--重要的事情需要重 復(fù)聲明一遍。 所以對(duì)于 kubectl 命令來(lái)說(shuō)它也就有了固定的模式。
比如需要查看當(dāng)前集群中所有節(jié)點(diǎn)的時(shí)候運(yùn)行的命令如下:
在這個(gè)命令中g(shù)et就是動(dòng)作而node就是資源。那再看另一個(gè)命令:
這個(gè)命令是刪除在名稱空間 test 中的一個(gè)名字叫 jenkins 的 POD。 你可以看到它依然遵循剛才的命令 模式。 delete 是刪除這個(gè)動(dòng)作而 POD 是資源對(duì)象,只不過(guò)這里需要指定額外的 options, 第一個(gè)是指 定 POD 的名字來(lái)表明到底要?jiǎng)h除哪一個(gè) POD。 -n 這個(gè)參數(shù)表明這個(gè) POD 是屬于哪個(gè)名稱空間的, 這里接觸到了 K8S 的另一個(gè)資源--名稱空間(namespace)。 名稱空間是 K8S 的一個(gè)邏輯概念,它 并不具備實(shí)體,你看不見(jiàn)摸不著,它主要的作用是為其他資源進(jìn)行分類(lèi)并方便管理。 可以把名稱空間類(lèi) 比為文件夾一樣的東西,而 K8S 中大部分的資源類(lèi)型都是一個(gè)個(gè)的文件,文件是放置到某個(gè)文件夾下 的。 這樣就擁有了更高維度的管理能力。 比如可以只查看某個(gè)名稱空間下的 POD。 比如 K8S 中所有 的關(guān)鍵服務(wù)都是放到 kube-system 這個(gè)名稱空間下的,一般這里面的 POD 直接影響著整個(gè)集群的運(yùn)行 狀態(tài)。 在集群出現(xiàn)故障的時(shí)候經(jīng)常會(huì)去看這個(gè)名稱空間下的 POD 是否都運(yùn)行正常。這個(gè)時(shí)候使用的命 令就是:
同時(shí)名稱空間也可以有更強(qiáng)的控制能力, 比如可以給某個(gè)名稱空間添加資源配額, 這又涉及到了 K8S 的資源管理模塊了。 在這里可以不用深入的了解,只需要知道可以為某個(gè)名稱空間申請(qǐng)?zhí)囟〝?shù)量的資源 (CPU, 內(nèi)存,GPU)這樣 K8S 會(huì)為這個(gè)名稱空間預(yù)留相應(yīng)數(shù)量的資源,保證這些資源不會(huì)被其他服務(wù) 搶占。 同時(shí)也可以限制某個(gè)名稱空間資源的最大用量, 這樣保證這個(gè)名稱空間內(nèi)的所有服務(wù)所使用的資源總量不超過(guò)某個(gè)值。 一般來(lái)說(shuō)這種資源配額的機(jī)制常常用來(lái)實(shí)現(xiàn)資源的管理和超賣(mài)能力。事實(shí)上只 有特定的一些資源類(lèi)型是可以不用放到名稱空間內(nèi)的, 比如 clusterrole,這是集群級(jí)別的角色對(duì)象,作 用域更大不限于某個(gè)名稱空間,所以不依附于某個(gè)名稱空間。而與之對(duì)應(yīng)的 role 就屬于某個(gè)名稱空間內(nèi) 生效的角色。回到當(dāng)才的命令上, 如果在命令行里增加一個(gè)額外的 options -o wide 你會(huì)發(fā)現(xiàn)不一樣的 效果。
可以看到增加了-o wide 后 輸出的信息變多了。 -o 也是一個(gè)常用的 options,代表著 output, 作用是 針對(duì)輸出的信息進(jìn)行格式化。 可以看到命令依然保持著 kubectl {動(dòng)作} {資源} {options}這個(gè)特定的模 式。所以 K8S 的命令行其實(shí)非常容易掌握, 只要理解了這樣一個(gè)模式就可以在不看任何文檔的情況下 完成大部分的日常工作,不論你面對(duì)的是哪種資源類(lèi)型。 幾個(gè)常用的動(dòng)作:
get:查詢某個(gè)資源列表。
delete:刪除某個(gè)資源。
edit:實(shí)時(shí)編輯某個(gè)資源的配置文件,這個(gè)動(dòng)作非常有用,用戶可以使用它動(dòng)態(tài)編輯一個(gè) POD 的配 置文件,它會(huì)為用戶提供一個(gè) vi 編輯窗口,當(dāng)你修改并保存后,k8s 會(huì)根據(jù)最新的配置更新這個(gè) POD
describe:查看某個(gè)資源對(duì)象的詳情。
logs: 查看某個(gè) POD 中的日志,專門(mén)針對(duì) POD,所以命令中可以不帶資源類(lèi)型。eg. kubectl logs -f {Pod 名稱} -c {容器名稱} 如果不使用-c 則會(huì)查看第一個(gè)容器的日志
exec: 讓某個(gè) POD 中的容器執(zhí)行特定的命令。 一般使用這個(gè)指定登錄到某個(gè)容器中。eg. kubectl exec -it {Pod 名稱} -c {容器名稱} bash t
aint: 給某個(gè) Node 增加或者刪除污點(diǎn)。 eg. kubectl taint nodes k8s?http://noderole.kubernetes.io/master:NoSchedule
create -f:根據(jù)某個(gè)配置文件創(chuàng)建資源對(duì)象。 eg. kubectl create -f {文件路徑}
apply -f: 根據(jù)某個(gè)配置文件更新資源對(duì)象。 eg. kubectl apply -f {文件路徑}
delete -f: 根據(jù)某個(gè)配置文件刪除資源對(duì)象。 eg. kubectl delete -f {文件路徑}
上面列舉的命令基本上可以滿足在工作中 99%的場(chǎng)景了,其他還有類(lèi)似 label,cp 等等,不過(guò)都不太常 用所以我就不詳細(xì)介紹了。這里強(qiáng)調(diào)一下 kubectl create/apply/delete -f {文件路徑} 這個(gè)命令。 它不再是操作某個(gè)資源對(duì)象的而是操作某一組保存在 yaml 或 json 格式的文件下的多個(gè)資源的。 這也是日常最常用的創(chuàng)建和刪除資源的方式,一般習(xí)慣把所有的配置都保存在這樣的一個(gè)或多個(gè)文件里 并對(duì)他們進(jìn)行管理。比如在之前的章節(jié)里提到的定時(shí)任務(wù):
把上述配置文件保存為一個(gè) yaml 文件,然后運(yùn)行 kubectl create -f {文件路徑} , 這樣就可以立 刻創(chuàng)建出這個(gè) CronJob 了。 而如果修改了這個(gè)配置文件后比如修改了這個(gè)定時(shí)任務(wù)的 cron 表達(dá)式,希 望他在別的時(shí)間點(diǎn)觸發(fā)任務(wù),那么也只需要運(yùn)行 kubectl apply -f {文件路徑} 即可。 K8S 會(huì)為自 動(dòng)的對(duì)比當(dāng)前資源和更新的請(qǐng)求之間在配置上不同的地方并進(jìn)行更新。 這是 K8S 聲明式 API 的強(qiáng)大之 處。用戶只需要在配置文件中聲明期望的樣子,K8S 會(huì)自動(dòng)讀取并保證用戶期望的運(yùn)行方式一定會(huì)發(fā) 生。 接下來(lái)再看一下幾個(gè)常用的 options,首先就是之前看到過(guò)的-o,用來(lái)對(duì)輸出信息進(jìn)行格式化。它 有很多的值但最常用的只有 3 種,分別是:json|yaml|wide 。 其中 wide 已經(jīng)看過(guò)了它會(huì)輸出很多額外 的信息,包括 POD 的 ip 地址和 POD 調(diào)度到了哪一個(gè)節(jié)點(diǎn)上。 而 json 和 yaml 則會(huì)保證你查看的資 源對(duì)象信息可以用對(duì)應(yīng)格式打印在屏幕上。 比如要查看某個(gè) POD 的信息:
通過(guò)這樣的命令就把查看到的信息以 yaml 格式打印在屏幕上了, 如果需要可以通過(guò) > 符號(hào)把內(nèi)容保 存到標(biāo)準(zhǔn) yaml 文件中待后續(xù)處理, 實(shí)際上一些測(cè)試或運(yùn)維工具就是這么做的。 另外再介紹一個(gè)常用 的 options 就是--all-namespaces。 知道大多數(shù)的資源類(lèi)型都是屬于某個(gè)名稱空間的,但是有些時(shí)候在操 作對(duì)象的時(shí)候希望能夠操作整個(gè)集群所有名稱空間下的資源。 這個(gè)時(shí)候就輪到 --all-namespaces 出場(chǎng) 了。
最后一個(gè)常用的 options 是 -l, 它是一種標(biāo)簽(label)選擇器。 這里又涉及到了 K8S 中的標(biāo)簽管理 了,這是 K8S 中一種主要的調(diào)度策略。 通過(guò)在特定的資源對(duì)象上打上對(duì)應(yīng)的 label,后續(xù)可以通過(guò) label 來(lái)進(jìn)行管理和調(diào)度。 比如給某個(gè) Node 上打了一個(gè) ssd=true 的標(biāo)簽,代表著在這個(gè) Node 上存在 SSD 磁盤(pán)。 而在創(chuàng)建 POD 的時(shí)候可以顯示的使用 nodeSelector 來(lái)指定我的 POD 必須調(diào)度到打了 ssd 標(biāo)簽的 Node 上。 這是 K8S 的一種調(diào)度策略。在 K8S 中任何對(duì)象都可以打上 label,包括 POD。而 其他資源對(duì)象就可以通過(guò) label 找到對(duì)應(yīng)的 pod 集合。 比如后面要講的 Service 就是通過(guò)指定對(duì)應(yīng)的 label 來(lái)覺(jué)得都接管哪些 POD 的網(wǎng)絡(luò)并做負(fù)載均衡策略。同樣的命令行中也可以通過(guò) -l 來(lái)指定只查詢 擁有對(duì)應(yīng)的 label 的資源對(duì)象: