kubernetes叢集管理常用命令一

周國通發表於2019-06-20

系列目錄

我們把叢集管理命令分為兩個部分,第一部分介紹一些簡單的,但是可能是非常常用的命令以及一些平時可能沒有碰到的技巧.第二部分將綜合前面介紹的工具通過示例來講解一些更為複雜的命令.

列出叢集中所有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核數,以及該節點的壓力等資訊.

相關文章