kubernetes叢集管理常用命令一
系列目錄
我們把叢集管理命令分為兩個部分,第一部分介紹一些簡單的,但是可能是非常常用的命令以及一些平時可能沒有碰到的技巧.第二部分將綜合前面介紹的工具通過示例來講解一些更為複雜的命令.
列出叢集中所有pod
使用kubectl get pods
獲取的一般是預設名稱空間的資訊(可以在配置檔案中指定預設全稱空間,如果沒有指定則預設為default).如果想要獲取獲取非預設名稱空間的pod,則需要指定-n(或者--namespace)引數.但是有些時候我們想要檢視整個叢集中所有名稱空間的pod,則可以通過kubectl get pods --all-namespaces
有的童鞋可能會好奇,可不可能不選擇全部,但是選擇多個名稱空間下的pod,其實也是可以的.以下示例同時選擇了default和kube-system名稱空間下的所有pod
[centos@k8s-master ~]$ kubectl get po --namespace={default,kube-system} NAME READY STATUS RESTARTS AGE coredns-78d4cf999f-8lpm6 1/1 Running 4 64d coredns-78d4cf999f-hd7nn 1/1 Running 4 64d etcd-k8s-master 1/1 Running 6 64d jxing-nginx-ingress-controller-7d9d4fc99d-bksl2 1/1 Running 0 2d1h jxing-nginx-ingress-default-backend-7875d67576-cmwz5 0/1 ImagePullBackOff 0 2d1h kube-apiserver-k8s-master 1/1 Running 0 23d kube-controller-manager-k8s-master 1/1 Running 7 64d kube-flannel-ds-amd64-5w2d6 1/1 Running 1 2d2h kube-flannel-ds-amd64-69vhm 1/1 Running 1 31h kube-flannel-ds-amd64-bh5hw 1/1 Running 1 2d7h kube-flannel-ds-amd64-csnqm 1/1 Running 0 47h kube-flannel-ds-amd64-fpdx5 1/1 Running 6 64d kube-flannel-ds-amd64-j6v7h 1/1 Running 4 3h50m kube-flannel-ds-amd64-qsrxw 1/1 Running 1 46h kube-proxy-7xcb7 1/1 Running 6 64d kube-proxy-d4jxx 1/1 Running 2 2d7h kube-proxy-ftjsk 1/1 Running 2 46h kube-proxy-jrfxs 1/1 Running 5 3h50m kube-proxy-kw4fw 1/1 Running 1 31h kube-proxy-thzdp 1/1 Running 1 2d2h kube-proxy-wrbmm 1/1 Running 0 47h kube-scheduler-k8s-master 1/1 Running 9 64d kubernetes-dashboard-6b8667558-dtn6r 1/1 Running 0 2d1h tiller-deploy-6df646875f-tp26r 1/1 Running 0 2d1h
只列出資源的名稱
在測試環境中,有時候我們可能想要把所有型別的資源全部刪除.比如刪除所有deployment.我們可以通過kubectl get deployment
來列出所有的deployment,然後逐個刪除.如果是全部刪除的話,這樣顯然是低效的,並且往往因為名稱拼寫錯誤導致操作失敗.在docker裡們,我們想要刪除全部執行的容器,可以通過docker ps -q
來獲取所有pod的id,然後通過迴圈來刪除.其實在kubernetes裡,可以通過kubectl get deployment -o=name
僅僅輸出名稱,然後使用迴圈逐個刪除.
列出包含特定標籤的pod
有經驗的童鞋都知道,受某個Deployment控制的一組pod的名稱往往跟這個Deployment的名稱有關係,往往是Deployment的名稱加上一串hash.但是如果如果兩個deployment名稱很類似,我就不就太容易找出某個deployment所控制的pod.最為無助的是service和它選擇的pod之間往往從表面上看不出關係的,如何知道一個service所控制.其實我們可以通過service裡的labelselector選擇的lable來過濾此service所控制的pod.
比如我有一個名為helloworld的service,我們使用kubectl describe service helloworld
來檢視它的資訊
[centos@k8s-master ~]$ kubectl describe service helloworld
Name: helloworld
Namespace: default
Labels: run=helloworld
Annotations: field.cattle.io/publicEndpoints:
[{"addresses":["192.168.9.40"],"port":32001,"protocol":"TCP","serviceName":"default:helloworld","allNodes":true}]
kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"run":"helloworld"},"name":"helloworld","namespace":"default"},...
Selector: app=helloworld
Type: NodePort
IP: 10.108.25.188
Port: <unset> 80/TCP
TargetPort: 80/TCP
NodePort: <unset> 32001/TCP
Endpoints: 10.244.2.30:80
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
它的labelSelector的值為app=helloworld
.我們可以通過這個label來過濾pod
[centos@k8s-master ~]$ kubectl get pod -l=app=helloworld
NAME READY STATUS RESTARTS AGE
helloworld-6d6bdb66dd-ncwk5 1/1 Running 0 3h4m
其實,除了service以外,deployment,ReplicationController,ReplicaSet也可以通過類似方式選擇,這樣選擇出的結果更為準確.
選擇指定節點上的pod
有一定經驗的童鞋可能會知道,使用kubectl get pods'時是不顯示節點資訊的,通過指定引數
-o wide就可以展示出來pod所在的節點資訊,然後便可以通過grep命令來過濾結果.比如我們想要查詢
k8s-node2`節點上的運行了哪些pod(節點名稱可以自定義的,大家的不必是k8s-nodexxx這種形式)
[centos@k8s-master easymock]$ kubectl get po --all-namespaces -o wide|grep k8s-node2
cattle-system cattle-node-agent-djg2h 1/1 Running 2 2d8h 192.168.122.74 k8s-node2 <none> <none>
default consul-0 1/1 Running 0 2d2h 10.244.2.27 k8s-node2 <none> <none>
default consul-2 1/1 Running 0 2d2h 10.244.2.28 k8s-node2 <none> <none>
default helloworld-6d6bdb66dd-ncwk5 1/1 Running 0 3h48m 10.244.2.30 k8s-node2 <none> <none>
default stodagent-6f47976ccb-8fzmv 1/1 Running 0 2d2h 10.244.2.23 k8s-node2 <none> <none>
default stodagent-6f47976ccb-vf7kx 1/1 Running 0 2d2h 10.244.2.22 k8s-node2 <none> <none>
default trackingapi-gateway-dep-79bb86bb57-x9xzp 1/1 Running 0 2d2h 10.244.2.24 k8s-node2 <none> <none>
ingress-nginx nginx-ingress-controller-c7dcb4d44-rhp22 1/1 Running 0 2d2h 10.244.2.25 k8s-node2 <none> <none>
kube-system kube-flannel-ds-amd64-bh5hw 1/1 Running 1 2d8h 192.168.122.74 k8s-node2 <none> <none>
kube-system kube-proxy-d4jxx 1/1 Running 2 2d8h 192.168.122.74 k8s-node2 <none> <none>
kube-system tiller-deploy-6df646875f-tp26r 1/1 Running 0 2d2h 10.244.2.26 k8s-node2 <none> <none>
tekton-pipelines tekton-pipelines-webhook-79d8658cdc-2tp84 1/1 Running 0 2d2h 10.244.2.19 k8s-node2 <none> <none>
這是通過linux的grep命令來實現的,其實,kubectl也有著非常強大的過濾功能,我們可以對它欄位選擇過濾器feild selector
,通過pod描述檔案裡的spec.nodeName
來過濾指定節點上的pod.命令示例如下:
[centos@k8s-master easymock]$ kubectl get po --all-namespaces -o wide --field-selector=spec.nodeName=k8s-node2
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
cattle-system cattle-node-agent-djg2h 1/1 Running 2 2d8h 192.168.122.74 k8s-node2 <none> <none>
default consul-0 1/1 Running 0 2d2h 10.244.2.27 k8s-node2 <none> <none>
default consul-2 1/1 Running 0 2d2h 10.244.2.28 k8s-node2 <none> <none>
default helloworld-6d6bdb66dd-ncwk5 1/1 Running 0 3h52m 10.244.2.30 k8s-node2 <none> <none>
default stodagent-6f47976ccb-8fzmv 1/1 Running 0 2d2h 10.244.2.23 k8s-node2 <none> <none>
default stodagent-6f47976ccb-vf7kx 1/1 Running 0 2d2h 10.244.2.22 k8s-node2 <none> <none>
default trackingapi-gateway-dep-79bb86bb57-x9xzp 1/1 Running 0 2d2h 10.244.2.24 k8s-node2 <none> <none>
ingress-nginx nginx-ingress-controller-c7dcb4d44-rhp22 1/1 Running 0 2d2h 10.244.2.25 k8s-node2 <none> <none>
kube-system kube-flannel-ds-amd64-bh5hw 1/1 Running 1 2d8h 192.168.122.74 k8s-node2 <none> <none>
kube-system kube-proxy-d4jxx 1/1 Running 2 2d8h 192.168.122.74 k8s-node2 <none> <none>
kube-system tiller-deploy-6df646875f-tp26r 1/1 Running 0 2d2h 10.244.2.26 k8s-node2 <none> <none>
tekton-pipelines tekton-pipelines-webhook-79d8658cdc-2tp84 1/1 Running 0 2d2h 10.244.2.19 k8s-node2 <none> <none>
列出所有狀態不是執行中的Pod
有時候我們需要列出所有未在執行的pod,以便決定下一步要做什麼行動.未執行的原因有很多,比如映象未能正常拉取,pod無法被正常排程等,我們首先要把所有未執行的pod過濾出來.
[root@k8s-master helloworld]# kubectl get pod --field-selector=status.phase!=Running
NAME READY STATUS RESTARTS AGE
redis-cache-f87d8488c-4d9dl 0/1 ErrImagePull 0 4d4h
redis-cache-f87d8488c-gjxqj 0/1 ImagePullBackOff 0 20h
redis-cache-f87d8488c-v4zjx 0/1 ImagePullBackOff 0 4d4h
這裡不同的是,前面我們使用的是等號來判斷相等關係,其實也可以像這裡使用(!=)來表示否定.
還有一點需要特別注意
phase=Running
的pod並不全是正常執行的pod,要確認一個pod是正常執行的,必須.status.conditions裡的Initialized,Ready,ContainersReady和PodScheduled幾種型別的值必須全部是"true",也可以通過展示欄位STATUS的值為Running
列出所有節點
我們通常都是和pod,service這些資源打交道,但是有些時候,我們也需要和節點打交道.可以使用kubectl get nodes
來檢視叢集中的所有節點資訊
檢視node資訊是通過
kubectl get
命令,kubectl get的引數在這裡同樣適用.
node也是k8s的資源,我們可以通過kubectl describe+節點名稱檢視節點記憶體,cpu核數,以及該節點的壓力等資訊.