更新時(shí)間:2022-12-21 10:27:32 來源:動(dòng)力節(jié)點(diǎn) 瀏覽1299次
kubectl是Kubernetes集群的命令行工具,通過kubectl能夠?qū)罕旧磉M(jìn)行管理,并能夠在集群上進(jìn)行容器化應(yīng)用的安裝部署.
K8s 的 Apiserver 是集群控制的入口,k8s 集群管理要在 master 節(jié)點(diǎn)進(jìn)行,即訪問部署的 Apiserver。kubectl 命令默認(rèn)訪問本機(jī)的 Apiserver 的 8080 端口。假如在 k8s 啟動(dòng)了 kubelet 服務(wù)的node 節(jié)點(diǎn),想使用 k8s 集群管理命令操作。會(huì)提示如下:
1.node 節(jié)點(diǎn)管理
(1)查看節(jié)點(diǎn)
$ kubectl get no/nodes
(2)刪除一個(gè)節(jié)點(diǎn)前,先驅(qū)趕掉上面的pod
$ kubectl drain slave2 --delete-local-data
(3)刪除slave2節(jié)點(diǎn),這個(gè)節(jié)點(diǎn)如果從新啟動(dòng)kubelet服務(wù)的話,在master節(jié)點(diǎn)還是可以看到的該節(jié)點(diǎn)的
$ kubectl delete node slave2
k8s刪除一個(gè)節(jié)點(diǎn)使用以下命令
其實(shí)以上命令是通用的,可以進(jìn)行任何資源的刪除:
kubectl delete [type] [typename],type 是資源類型,可以是 node, pod, rs, rc, deployment, service 等等,typename是這個(gè)資源的名稱
(4)查看資源概況
$ kubectl describe nodes
$ kubectl describe node slave1
2.namespace 命名空間管理
命名空間是一個(gè)抽象出來的概念,在一個(gè)命名空間中,pod名稱不允許重復(fù)。這個(gè)命名空間如果我們把他想象成我們的環(huán)境可能更好理解。我們的微服務(wù)項(xiàng)目需要部署到開發(fā)、測(cè)試、生產(chǎn)環(huán)境等。那這時(shí)候我們就可以定義3個(gè)命名空間為 dev、test、product。每個(gè)環(huán)境都要部署一套微服務(wù)容器。Pod名稱在不同的 namespace 中是相同的。或者也可以把 Namespace 和 Pod 理解成數(shù)據(jù)庫和表的關(guān)系。
(1)查看命名空間
(2)創(chuàng)建命名空間
方式1:使用命令創(chuàng)建
[root@master local]# kubectl create namespace esign-dev
namespace "esign-dev" created
方式2:配置文件創(chuàng)建命名空間
編輯配置文件:namespace-test.yaml
apiVersion: v1 #api版本號(hào)
kind: Namespace #指定類型為Namespace
metadata: #元數(shù)據(jù)描述
name: test #指定namespace名稱
創(chuàng)建namespace
[root@master local]# kubectl apply -f ./namespace-test.yaml
namespace "test" created
(3)刪除命名空間
刪除命名空間時(shí)會(huì)同時(shí)刪除該空間下所有資源,就好像數(shù)據(jù)庫和表的關(guān)系。開發(fā)中要謹(jǐn)慎操作,同時(shí)系統(tǒng)命名空間不會(huì)被刪除
3.pod 資源管理
(1)Pod 生命周期
pod生命周期:
Pending:API Server已經(jīng)創(chuàng)建了該P(yáng)od,但Pod中的一個(gè)或多個(gè)容器的鏡像還沒有創(chuàng)建,包括鏡像下載過程
Running:Pod內(nèi)所有容器已創(chuàng)建,且至少一個(gè)容器處于運(yùn)行狀態(tài)、正在啟動(dòng)狀態(tài)或正在重啟狀態(tài)
Completed:Pod內(nèi)所有容器均成功執(zhí)行退出,且不會(huì)再重啟
Failed :Pod內(nèi)所有容器均已退出,但至少一個(gè)容器退出失敗
Unknown:由于某種原因無法獲取Pod狀態(tài),例如網(wǎng)絡(luò)通信不暢
pod失效時(shí)的重啟策略:
Always:當(dāng)容器失效時(shí),立馬由kubelet自動(dòng)重啟該容器
OnFailure:當(dāng)容器終止運(yùn)行且退出碼不為0時(shí),由kubelet自動(dòng)重啟該容器
Never:不論容器運(yùn)行狀態(tài)如何,kubelet都不會(huì)重啟該容器
*對(duì)于Always這種策略,容器只要掛了,就會(huì)立即重啟,這樣是很耗費(fèi)資源的。所以Always重啟策略會(huì)這么做:第一次容器掛了立即重啟,如果再掛了就要延時(shí)10s重啟,第三次掛了就等20s重啟...... 依次類推
(2)創(chuàng)建 pod 容器
編輯 demo-rc/yaml 文件:
鏡像192.168.56.104:5000/nginx,是我基于Nginx鏡像重新tag,并上傳到docker私服的。這樣做是因?yàn)?k8s 會(huì)把構(gòu)建的 Pod 隨機(jī)分配到 node節(jié)點(diǎn)去處理,無論是哪個(gè) node去構(gòu)建 Pod都要能保證能拉到鏡像,所以必須用私服統(tǒng)一管理鏡像。
鏡像拉取策略 imagePullPolicy:
Always - 每次都要從私服pull
IfNotPresent - 本地有就不從私服拉(這是默認(rèn)值)
Never - 從不pull
關(guān)于鏡像拉取,Pod 構(gòu)建 docker 容器時(shí),會(huì)執(zhí)行docker pull 將鏡像從私服拉到本地。且其默認(rèn)執(zhí)行策略是如果本地有就不再pull。所以如果我們用jenkins構(gòu)建應(yīng)用服務(wù)時(shí),首先需要將鏡像上傳到私服,且 Pod 的執(zhí)行策略也必須是每次都要從私服Pull,否則它Pull 一次之后。將不再拉取最新構(gòu)建的鏡像。
apiVersion: v1 #描述的是Api版本
kind: Pod #指定的是Pod類型
metadata: #描述該P(yáng)od的元數(shù)據(jù)信息
name: nginx #Pod名稱
namespace: esign-dev #指定該P(yáng)od所屬的命名空間,這個(gè)命名空間需要提前創(chuàng)建好。否則報(bào)錯(cuò)
labels:
owner: jpjinga #給Pod添加自定義標(biāo)簽,key、value都是自定義
spec:
containers:
- name: nginx
image: 192.168.56.104:5000/nginx:latest
imagePullPolicy: Always #一直從遠(yuǎn)程倉庫拉取
ports:
- containerPort: 80 #容器端口
hostPort: 8081 #映射的主機(jī)端口
name: web
protocol: TCP
創(chuàng)建并啟動(dòng) pod
獲取Pod
kubectl get po -n esign-dev #獲取指定命名空間的Pod資源
kubectl get po --all-namespaces -o wide #獲取所有命名空間的Pod資源
我們看一下Pod啟動(dòng)后的具體信息:
kubectl describe pod nginx -n esign-dev
我們切換到主機(jī)名為 slave1(192.168.56.102)的節(jié)點(diǎn),查看運(yùn)行容器。可以發(fā)現(xiàn) k8s 運(yùn)行的是一個(gè)Pod基礎(chǔ)容器,我們?cè)谏弦黄罱╧8s集群node節(jié)點(diǎn)時(shí),配置過這個(gè)Pod基礎(chǔ)鏡像。Pod是K8s管理的最小單元。在這個(gè)Pod里運(yùn)行的是Nginx容器。主機(jī)對(duì)Pod內(nèi)部容器的端口映射是:8081->80。
我們用瀏覽器來訪問一下這個(gè)Nginx,可以看到訪問正常。
(3)查看容器運(yùn)行狀態(tài)
ready:Pod準(zhǔn)備情況,準(zhǔn)備就緒/Pod包含容器的總數(shù)目
restarts:Pod重啟次數(shù)
age:Pod存活時(shí)間
(4)查看Pod詳細(xì)信息
說明:查看的pod所屬命名空間namespace != dufault 時(shí),需要-n 指定其命名空間才可以看到
kubectl describe pod [podname] -n [namespace]
(5)更新Pod
更新:
kubectl replace -f demo-rc.yaml
由于Pod的很多屬性沒辦法修改,比如容器鏡像,這時(shí)候可以采用--force參數(shù)
kubectl replace --force -f demo-ng.yaml
看運(yùn)行效果,就相當(dāng)于刪掉后重新構(gòu)建了一個(gè)Pod:
(6)進(jìn)入Pod中的容器
命名空間非默認(rèn)時(shí)需要-n 指定
如果Pod內(nèi)部只有一個(gè)容器,不需要指定 -c ,默認(rèn)進(jìn)入第一個(gè)容器。
kubectl exec -it [pod-name] -n [namespace] -c [container-name] /bin/bash
(7)Pod與標(biāo)簽
添加標(biāo)簽
kubectl label pod [podname] -n [namespace] key=value #指定pod,添加自定義標(biāo)簽
查詢Pod時(shí),展示標(biāo)簽內(nèi)容:
(8)刪除Pod
-n 刪除指定命名空間下的Pod容器
如不指定,則刪除的是 namespace=default 下的Pod容器
kubectl delete pod [podname] -n [namespace] # 刪除一個(gè)Pod
kubectl delete pod --all -n [namespace] # 刪除所有Pod
(9)查看容器日志,參數(shù)-f 可以監(jiān)控實(shí)時(shí)日志
kubectl logs [-f] -n [namespace] [podName] -c [containerName]
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)
初級(jí) 202925
初級(jí) 203221
初級(jí) 202629
初級(jí) 203743