前言
本文是k8s學(xué)習(xí)系列文章,前后串起來是一個完整的課程(學(xué)習(xí)筆記),本文記錄k8s的資源管理方式及五大類資源的具體管理命令,看完本文基本上就能實現(xiàn)k8s的基本操作,可以獨立部署小型項目了。
前期文章連接:
從零開始搭建kubernetes集群環(huán)境(虛擬機/kubeadm方式)
1.kubernetes的資源管理
總結(jié):學(xué)習(xí)kubernetes的核心,就是學(xué)習(xí)如何對集群上的Pod、Pod控制器、Label標(biāo)簽、Service、存儲等各種資源進行操作。
系統(tǒng)資源查看
通過kubectl api-resources
命令可以查看系統(tǒng)中所有資源,如下圖,注意資源類型縮寫一列內(nèi)容,本文后續(xù)kubectl命令操作的資源有的用縮寫名,跟用全名一樣的。
2.資源管理方式
- 命令式對象管理:直接使用命令去操作kubernetes資源
kubectl命令的語法如下:kubectl [命令] [資源類型] [資源名稱] [參數(shù)]
如 kubectl run nginx-pod --image=nginx:1.17.1 --port=80
命令有很多,老規(guī)矩,查看幫助吧 kubectl--help
- 命令式對象配置:通過命令配置和配置文件去操作kubernetes資源
kubectl create/patch -f nginx-pod.yaml
nginx-pod.yaml是指定的配置文件,具體內(nèi)容后面實戰(zhàn)部分會有,莫急 - 聲明式對象配置:通過apply命令和配置文件去操作kubernetes資源
kubectl apply -f nginx-pod.yaml
問題:乍一看好像后兩種方式不好區(qū)分,同樣是創(chuàng)建一個k8s資源,使用 kubectl create 和使用 kubectl apply有什么區(qū)別呢?
區(qū)別有兩點:
(1)kubectl create命令可創(chuàng)建新資源。 因此,如果再次運行該命令,則會拋出錯誤,因為資源名稱在名稱空間中是唯一的。
(2)kubectl apply命令將配置應(yīng)用于資源。 如果資源不在那里,那么它將被創(chuàng)建。 kubectl apply命令可以第二次運行,如果資源存在就執(zhí)行更新,相當(dāng)于kubectl patch操作
以上三種資源管理方式,命令式對象管理直接操作資源對象,適用于測試環(huán)境,操作簡單,但是只能操作活動對象且難以審計、跟蹤;命令式對象配置操作對應(yīng)配置文件,可以審計跟蹤,但是項目較大時配置文件管理麻煩;聲明式對象配置支持目錄操作,但是意外情況下不好調(diào)式。
(沒關(guān)系,這里只是學(xué)習(xí)原理,生產(chǎn)環(huán)境還是界面管理工具的,比如我公司用的kuboard)
3.資源管理實戰(zhàn)
3.1 Namespace
k8s系統(tǒng)中Namespace資源是用了實現(xiàn)多套環(huán)境的資源隔離或者多租戶的資源隔離。默認情況下k8s集群中所有Pod資源都是可以相互訪問的,但是實際中如果不想讓兩個Pod之間相互干擾可以將兩個Pod劃分到不同的namespace下。
k8s通過將集群內(nèi)部的資源分配到不用的namespace中,形成邏輯上的“組”,方便不同組的資源可以隔離使用和管理。如果將不同的Namespace交給不同租戶進行管理,這樣就實現(xiàn)了多租戶的資源隔離。此時還能結(jié)合kubernetes的資源配額機制,限定不同租戶能占用的資源,例如CPU使用量、內(nèi)存使用量等等,來實現(xiàn)租戶可用資源的管理。
kubernetes在集群啟動之后,會默認創(chuàng)建幾個namespace,查看命令如下圖所示:
- 命令式對象管理,命令示例如下:
kubectl get namespace #查看所有的命名空間,同kubectl get ns
kubectl get namespace default #查看指定的命名空間default
kubectl get ns default -o wide #指定命名空間的輸出格式,還有-o json,-o yaml格式
kubectl describe namespace default #查看default命名空間的詳情
kubectl create namespace dev #創(chuàng)建命名空間
kubectl delete ns dev #刪除命名空間
- 命令式對象配置方式如下:
新建ns-dev.yaml配置文件,內(nèi)容如下:
apiVersion: v1
kind: Namespace
metadata:
name: dev
通過命令式對象配置進行創(chuàng)建和刪除
kubectl create -f ns-dev.yaml
kubectl delete -f ns-dev.yaml
3.2 Pod
Pod是kubernetes集群進行管理的最小單元,可以認為是容器的封裝,一個Pod中可以存在一個或者多個容器。kubernetes在集群啟動之后,集群中的各個組件也是以Pod方式運行的,可以通過下面的命令查看:
- 命令式對象管理,應(yīng)用示例如下:
kubectl run (Pod的名稱) [參數(shù)] #創(chuàng)建并運行Pod,如kubectl run nginx --image=nginx:1.17.1 --port=80 --namespace=dev
# --image 指定Pod的鏡像
# --port 指定端口
# --namespace 指定namespace
kubectl get pods -n dev #查詢名稱為dev的namespace下的所有Pod的基本信息
kubectl describe pod nginx -n dev #查看名稱為dev的namespace下的Pod的名稱為nginx的詳細信息
kubectl get pods [-n dev] -o wide #可以查詢到Pod的IP
curl 10.244.2.7:80 #訪問Nginx的Pod,ip每次都先查詢一下,可能發(fā)生變化
kubectl delete pod nginx -n dev #刪除Nginx的Pod
- 命令式對象配置方式只是配置文件內(nèi)容不一樣,命令是相同的,不在列舉(搜可得,后續(xù)詳情文章會詳解):
3.3 Label
Label的作用就是在資源上添加標(biāo)識,用來對它們進行區(qū)分和選擇。通過Label可以實現(xiàn)資源的多緯度分組,以便靈活、方便地進行資源分配、調(diào)度、配置和部署等管理工作。
Label的特點:
- 一個Label會以key/value鍵值對的形式附加到各種對象上,如Node、Pod、Service等。
- 一個資源對象可以定義任意數(shù)量的Label,同一個Label也可以被添加到任意數(shù)量的資源對象上去。
- Label通常在資源對象定義時確定,也可以在對象創(chuàng)建后動態(tài)的添加或刪除。
一些常用的Label標(biāo)簽示例如下:
● 版本標(biāo)簽:“version”:”release”,”version”:”stable”。。。
● 環(huán)境標(biāo)簽:“environment”:”dev”,“environment”:”test”,“environment”:”pro”
● 架構(gòu)標(biāo)簽:“tier”:”frontend”,”tier”:”backend”。。。
標(biāo)簽定義完畢之后,還要考慮到如何通過標(biāo)簽選擇所需資源,這就要用到Label Selector,當(dāng)前有兩種篩選方式:
- 基于等式的Label Selector,比如name=slave或者env!=production。
- 基于集合的Label Selector,比如name in (master,slave)或者name not in (master,slave)
注意:標(biāo)簽等號后面的值加不加引號都行; 標(biāo)簽的選擇條件可以使用多個,此時將多個Label Selector進行組合,使用逗號(,)進行分隔即可
語法及應(yīng)用示例
kubectl label pod nginx version=1.0 -n dev #為名稱Nginx的Pod資源打上標(biāo)簽version=1.0
kubectl label pod xxx key=value [-n 命名空間] --overwrite #如果標(biāo)簽key已經(jīng)存在,加--overwrite參數(shù)更新資源的標(biāo)簽
kubectl get pod nginx -n dev --show-labels #顯示Nginx的Pod的標(biāo)簽
kubectl get pod -l version=2.0 -n dev --show-labels #篩選版本號是2.0的在名稱為dev的namespace下的Pod
kubectl label pod xxx key- [-n 命名空間] #刪除標(biāo)簽 key減號
3.4 Deployment
在kubernetes中,Pod是最小的控制單元,但是kubernetes很少直接控制Pod,一般都是通過Pod控制器來完成的。Deployment是一種Pod控制器,用于Pod的管理,確保Pod資源符合預(yù)期的狀態(tài),當(dāng)Pod的資源出現(xiàn)故障的時候,會嘗試進行重啟或重建Pod。
在kubernetes中Pod控制器的種類有很多,本章節(jié)只介紹一種:Deployment。
語法及應(yīng)用示例
kubectl create deployment nginx --image=nginx:1.17.1 -n dev #為e名稱Nginx的Pod資源打上標(biāo)簽version=1.0
kubectl scale deployment nginx --replicas=4 -n dev #在名稱為test的命名空間下根據(jù)名為nginx的deployment創(chuàng)建3個Pod
kubectl get deployment -n dev #查看名稱為dev的namespace下的deployment信息
kubectl describe deployment nginx -n dev #查看deployment的詳細信息
kubectl delete deployment nginx -n dev #刪除名為nginx的deployment
小知識1:kubectl run nginx --image=nginx --replicas=2 --port=80
,創(chuàng)建一個名稱為nginx的deployment, 新版本可能會反饋Flag --replicas has been deprecated, has no effect and will be removed in the future,并且只會創(chuàng)建一個Nginx容器實例。
小知識2:kubectl run nginx --image=nginx --replicas=2 --port=80
,創(chuàng)建一個名稱為nginx的deployment這個deployment中默認生成了對應(yīng)的pod資源,如果刪除其中的Pod,這個deployment會嘗試創(chuàng)建一個新的Pod,這個特性也在新版本刪除了,直接刪除Pod就能刪除成功了。
3.5 Service
kubernetes設(shè)計了Service來解決外部環(huán)境訪問容器資源的問題。Pod資源可以提供具有高可用性的服務(wù),雖然每個Pod都會分配一個單獨的IP地址,但Pod的IP會隨著Pod的重建產(chǎn)生變化,且Pod的IP僅僅是集群內(nèi)部可見的虛擬的IP,外部無法訪問。
Service可以看做是一組同類的Pod對外的訪問接口,借助Service,應(yīng)用可以方便的實現(xiàn)服務(wù)發(fā)現(xiàn)和負載均衡。
3.5.1創(chuàng)建集群內(nèi)部可訪問的Service
語法:
kubectl expose deployment xxx --name=服務(wù)名 --type=ClusterIP --port=暴露的端口 --target-port=指向集群中的Pod的端口 [-n 命名空間]
#–type=ClusterIP會產(chǎn)生一個CLUSTER-IP,這個就是service的IP,在Service的生命周期內(nèi),這個地址是不會變化的
#暴露名為dev的namespace下的名為nginx的deployment,并設(shè)置服務(wù)名為svc-nginx
kubectl expose deployment nginx --name=svc-nginx --type=ClusterIP --port=80 --target-port=80 -n dev
#訪問service的80端口,轉(zhuǎn)發(fā)到Pod的80端口
kubectl get service -n dev #查看名為dev的命名空間的所有Service
curl ip:80 #在集群內(nèi)通過master節(jié)點ip可以訪問部署的nginx服務(wù)
3.5.2創(chuàng)建集群外部可訪問的Service
語法:
kubectl expose deployment xxx --name=服務(wù)名 --type=NodePort --port=暴露的端口 --target-port=指向集群中的Pod的端口 [-n 命名空間]
#–type=NodePort參數(shù)會產(chǎn)生一個外部也可以訪問的Service,
#例:暴露名為test的namespace下的名為nginx的deployment,并設(shè)置服務(wù)名為svc-nginx-1
kubectl expose deploy nginx --name=svc-nginx-1 --type=NodePort --port=80 --target-port=80 -n dev
此時外部環(huán)境可以通過master節(jié)點IP進行訪問了,端口查詢方法如下圖:文章來源:http://www.zghlxwxcb.cn/news/detail-795392.html
總結(jié):以上就是kubernetes的Namespace/Pod/Deployment/Service資源的基本操作,學(xué)會這些操作就可以在集群中實現(xiàn)一個服務(wù)的簡單部署和訪問了。但是如果想更好的使用k8s,接下來需要深入學(xué)習(xí)這幾種資源的細節(jié)和原理。文章來源地址http://www.zghlxwxcb.cn/news/detail-795392.html
到了這里,關(guān)于K8s學(xué)習(xí)(二)Kubernetest的資源管理及五大資源介紹的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!