更新時間:2022-12-21 10:27:32 來源:動力節點 瀏覽1336次
kubectl是Kubernetes集群的命令行工具,通過kubectl能夠對集群本身進行管理,并能夠在集群上進行容器化應用的安裝部署.
K8s 的 Apiserver 是集群控制的入口,k8s 集群管理要在 master 節點進行,即訪問部署的 Apiserver。kubectl 命令默認訪問本機的 Apiserver 的 8080 端口。假如在 k8s 啟動了 kubelet 服務的node 節點,想使用 k8s 集群管理命令操作。會提示如下:
1.node 節點管理
(1)查看節點
$ kubectl get no/nodes
(2)刪除一個節點前,先驅趕掉上面的pod
$ kubectl drain slave2 --delete-local-data
(3)刪除slave2節點,這個節點如果從新啟動kubelet服務的話,在master節點還是可以看到的該節點的
$ kubectl delete node slave2
k8s刪除一個節點使用以下命令
其實以上命令是通用的,可以進行任何資源的刪除:
kubectl delete [type] [typename],type 是資源類型,可以是 node, pod, rs, rc, deployment, service 等等,typename是這個資源的名稱
(4)查看資源概況
$ kubectl describe nodes
$ kubectl describe node slave1
2.namespace 命名空間管理
命名空間是一個抽象出來的概念,在一個命名空間中,pod名稱不允許重復。這個命名空間如果我們把他想象成我們的環境可能更好理解。我們的微服務項目需要部署到開發、測試、生產環境等。那這時候我們就可以定義3個命名空間為 dev、test、product。每個環境都要部署一套微服務容器。Pod名稱在不同的 namespace 中是相同的。或者也可以把 Namespace 和 Pod 理解成數據庫和表的關系。
(1)查看命名空間
(2)創建命名空間
方式1:使用命令創建
[root@master local]# kubectl create namespace esign-dev
namespace "esign-dev" created
方式2:配置文件創建命名空間
編輯配置文件:namespace-test.yaml
apiVersion: v1 #api版本號
kind: Namespace #指定類型為Namespace
metadata: #元數據描述
name: test #指定namespace名稱
創建namespace
[root@master local]# kubectl apply -f ./namespace-test.yaml
namespace "test" created
(3)刪除命名空間
刪除命名空間時會同時刪除該空間下所有資源,就好像數據庫和表的關系。開發中要謹慎操作,同時系統命名空間不會被刪除
3.pod 資源管理
(1)Pod 生命周期
pod生命周期:
Pending:API Server已經創建了該Pod,但Pod中的一個或多個容器的鏡像還沒有創建,包括鏡像下載過程
Running:Pod內所有容器已創建,且至少一個容器處于運行狀態、正在啟動狀態或正在重啟狀態
Completed:Pod內所有容器均成功執行退出,且不會再重啟
Failed :Pod內所有容器均已退出,但至少一個容器退出失敗
Unknown:由于某種原因無法獲取Pod狀態,例如網絡通信不暢
pod失效時的重啟策略:
Always:當容器失效時,立馬由kubelet自動重啟該容器
OnFailure:當容器終止運行且退出碼不為0時,由kubelet自動重啟該容器
Never:不論容器運行狀態如何,kubelet都不會重啟該容器
*對于Always這種策略,容器只要掛了,就會立即重啟,這樣是很耗費資源的。所以Always重啟策略會這么做:第一次容器掛了立即重啟,如果再掛了就要延時10s重啟,第三次掛了就等20s重啟...... 依次類推
(2)創建 pod 容器
編輯 demo-rc/yaml 文件:
鏡像192.168.56.104:5000/nginx,是我基于Nginx鏡像重新tag,并上傳到docker私服的。這樣做是因為 k8s 會把構建的 Pod 隨機分配到 node節點去處理,無論是哪個 node去構建 Pod都要能保證能拉到鏡像,所以必須用私服統一管理鏡像。
鏡像拉取策略 imagePullPolicy:
Always - 每次都要從私服pull
IfNotPresent - 本地有就不從私服拉(這是默認值)
Never - 從不pull
關于鏡像拉取,Pod 構建 docker 容器時,會執行docker pull 將鏡像從私服拉到本地。且其默認執行策略是如果本地有就不再pull。所以如果我們用jenkins構建應用服務時,首先需要將鏡像上傳到私服,且 Pod 的執行策略也必須是每次都要從私服Pull,否則它Pull 一次之后。將不再拉取最新構建的鏡像。
apiVersion: v1 #描述的是Api版本
kind: Pod #指定的是Pod類型
metadata: #描述該Pod的元數據信息
name: nginx #Pod名稱
namespace: esign-dev #指定該Pod所屬的命名空間,這個命名空間需要提前創建好。否則報錯
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
創建并啟動 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)的節點,查看運行容器。可以發現 k8s 運行的是一個Pod基礎容器,我們在上一篇搭建k8s集群node節點時,配置過這個Pod基礎鏡像。Pod是K8s管理的最小單元。在這個Pod里運行的是Nginx容器。主機對Pod內部容器的端口映射是:8081->80。
我們用瀏覽器來訪問一下這個Nginx,可以看到訪問正常。
(3)查看容器運行狀態
ready:Pod準備情況,準備就緒/Pod包含容器的總數目
restarts:Pod重啟次數
age:Pod存活時間
(4)查看Pod詳細信息
說明:查看的pod所屬命名空間namespace != dufault 時,需要-n 指定其命名空間才可以看到
kubectl describe pod [podname] -n [namespace]
(5)更新Pod
更新:
kubectl replace -f demo-rc.yaml
由于Pod的很多屬性沒辦法修改,比如容器鏡像,這時候可以采用--force參數
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)查看容器日志,參數-f 可以監控實時日志
kubectl logs [-f] -n [namespace] [podName] -c [containerName]
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習