更新時間:2022-12-21 10:27:32 來源:動力節(jié)點 瀏覽1968次
kubectl是Kubernetes集群的命令行工具,通過kubectl能夠對集群本身進行管理,并能夠在集群上進行容器化應用的安裝部署.
K8s 的 Apiserver 是集群控制的入口,k8s 集群管理要在 master 節(jié)點進行,即訪問部署的 Apiserver。kubectl 命令默認訪問本機的 Apiserver 的 8080 端口。假如在 k8s 啟動了 kubelet 服務的node 節(jié)點,想使用 k8s 集群管理命令操作。會提示如下:

1.node 節(jié)點管理
(1)查看節(jié)點
$ kubectl get no/nodes

(2)刪除一個節(jié)點前,先驅趕掉上面的pod
$ kubectl drain slave2 --delete-local-data
(3)刪除slave2節(jié)點,這個節(jié)點如果從新啟動kubelet服務的話,在master節(jié)點還是可以看到的該節(jié)點的
$ kubectl delete node slave2
k8s刪除一個節(jié)點使用以下命令

其實以上命令是通用的,可以進行任何資源的刪除:
kubectl delete [type] [typename],type 是資源類型,可以是 node, pod, rs, rc, deployment, service 等等,typename是這個資源的名稱
(4)查看資源概況
$ kubectl describe nodes
$ kubectl describe node slave1
2.namespace 命名空間管理
命名空間是一個抽象出來的概念,在一個命名空間中,pod名稱不允許重復。這個命名空間如果我們把他想象成我們的環(huán)境可能更好理解。我們的微服務項目需要部署到開發(fā)、測試、生產環(huán)境等。那這時候我們就可以定義3個命名空間為 dev、test、product。每個環(huán)境都要部署一套微服務容器。Pod名稱在不同的 namespace 中是相同的?;蛘咭部梢园?Namespace 和 Pod 理解成數(shù)據(jù)庫和表的關系。
(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版本號
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ù)據(jù)庫和表的關系。開發(fā)中要謹慎操作,同時系統(tǒng)命名空間不會被刪除

3.pod 資源管理
(1)Pod 生命周期
pod生命周期:
Pending:API Server已經創(chuàng)建了該Pod,但Pod中的一個或多個容器的鏡像還沒有創(chuàng)建,包括鏡像下載過程
Running:Pod內所有容器已創(chuàng)建,且至少一個容器處于運行狀態(tài)、正在啟動狀態(tài)或正在重啟狀態(tài)
Completed:Pod內所有容器均成功執(zhí)行退出,且不會再重啟
Failed :Pod內所有容器均已退出,但至少一個容器退出失敗
Unknown:由于某種原因無法獲取Pod狀態(tài),例如網絡通信不暢
pod失效時的重啟策略:
Always:當容器失效時,立馬由kubelet自動重啟該容器
OnFailure:當容器終止運行且退出碼不為0時,由kubelet自動重啟該容器
Never:不論容器運行狀態(tài)如何,kubelet都不會重啟該容器
*對于Always這種策略,容器只要掛了,就會立即重啟,這樣是很耗費資源的。所以Always重啟策略會這么做:第一次容器掛了立即重啟,如果再掛了就要延時10s重啟,第三次掛了就等20s重啟...... 依次類推
(2)創(chuàng)建 pod 容器
編輯 demo-rc/yaml 文件:
鏡像192.168.56.104:5000/nginx,是我基于Nginx鏡像重新tag,并上傳到docker私服的。這樣做是因為 k8s 會把構建的 Pod 隨機分配到 node節(jié)點去處理,無論是哪個 node去構建 Pod都要能保證能拉到鏡像,所以必須用私服統(tǒng)一管理鏡像。
鏡像拉取策略 imagePullPolicy:
Always - 每次都要從私服pull
IfNotPresent - 本地有就不從私服拉(這是默認值)
Never - 從不pull
關于鏡像拉取,Pod 構建 docker 容器時,會執(zhí)行docker pull 將鏡像從私服拉到本地。且其默認執(zhí)行策略是如果本地有就不再pull。所以如果我們用jenkins構建應用服務時,首先需要將鏡像上傳到私服,且 Pod 的執(zhí)行策略也必須是每次都要從私服Pull,否則它Pull 一次之后。將不再拉取最新構建的鏡像。
apiVersion: v1 #描述的是Api版本
kind: Pod #指定的是Pod類型
metadata: #描述該Pod的元數(shù)據(jù)信息
name: nginx #Pod名稱
namespace: esign-dev #指定該Pod所屬的命名空間,這個命名空間需要提前創(chuàng)建好。否則報錯
labels:
owner: jpjinga #給Pod添加自定義標簽,key、value都是自定義
spec:
containers:
- name: nginx
image: 192.168.56.104:5000/nginx:latest
imagePullPolicy: Always #一直從遠程倉庫拉取
ports:
- containerPort: 80 #容器端口
hostPort: 8081 #映射的主機端口
name: web
protocol: TCP
創(chuàng)建并啟動 pod

獲取Pod
kubectl get po -n esign-dev #獲取指定命名空間的Pod資源
kubectl get po --all-namespaces -o wide #獲取所有命名空間的Pod資源
我們看一下Pod啟動后的具體信息:
kubectl describe pod nginx -n esign-dev

我們切換到主機名為 slave1(192.168.56.102)的節(jié)點,查看運行容器??梢园l(fā)現(xiàn) k8s 運行的是一個Pod基礎容器,我們在上一篇搭建k8s集群node節(jié)點時,配置過這個Pod基礎鏡像。Pod是K8s管理的最小單元。在這個Pod里運行的是Nginx容器。主機對Pod內部容器的端口映射是:8081->80。

我們用瀏覽器來訪問一下這個Nginx,可以看到訪問正常。

(3)查看容器運行狀態(tài)
ready:Pod準備情況,準備就緒/Pod包含容器的總數(shù)目
restarts:Pod重啟次數(shù)
age:Pod存活時間

(4)查看Pod詳細信息
說明:查看的pod所屬命名空間namespace != dufault 時,需要-n 指定其命名空間才可以看到
kubectl describe pod [podname] -n [namespace]

(5)更新Pod
更新:
kubectl replace -f demo-rc.yaml
由于Pod的很多屬性沒辦法修改,比如容器鏡像,這時候可以采用--force參數(shù)
kubectl replace --force -f demo-ng.yaml
看運行效果,就相當于刪掉后重新構建了一個Pod:

(6)進入Pod中的容器
命名空間非默認時需要-n 指定
如果Pod內部只有一個容器,不需要指定 -c ,默認進入第一個容器。
kubectl exec -it [pod-name] -n [namespace] -c [container-name] /bin/bash
(7)Pod與標簽
添加標簽
kubectl label pod [podname] -n [namespace] key=value #指定pod,添加自定義標簽

查詢Pod時,展示標簽內容:

(8)刪除Pod
-n 刪除指定命名空間下的Pod容器
如不指定,則刪除的是 namespace=default 下的Pod容器
kubectl delete pod [podname] -n [namespace] # 刪除一個Pod
kubectl delete pod --all -n [namespace] # 刪除所有Pod
(9)查看容器日志,參數(shù)-f 可以監(jiān)控實時日志
kubectl logs [-f] -n [namespace] [podName] -c [containerName]