kubernetes集羣管理經常使用命令一

系列目錄html

咱們把集羣管理命令分爲兩個部分,第一部分介紹一些簡單的,可是多是很是經常使用的命令以及一些平時可能沒有碰到的技巧.第二部分將綜合前面介紹的工具經過示例來說解一些更爲複雜的命令.node

列出集羣中全部pod

使用kubectl get pods獲取的通常是默認名稱空間的信息(能夠在配置文件中指定默認全稱空間,若是沒有指定則默認爲default).若是想要獲取獲取非默認名稱空間的pod,則須要指定-n(或者--namespace)參數.可是有些時候咱們想要查看整個集羣中全部名稱空間的pod,則能夠經過kubectl get pods --all-namespaceslinux

有的童鞋可能會好奇,可不可能不選擇所有,可是選擇多個名稱空間下的pod,其實也是能夠的.如下示例同時選擇了default和kube-system名稱空間下的全部podnginx

[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僅僅輸出名稱,而後使用循環逐個刪除.web

列出包含特定標籤的pod

有經驗的童鞋都知道,受某個Deployment控制的一組pod的名稱每每跟這個Deployment的名稱有關係,每每是Deployment的名稱加上一串hash.可是若是若是兩個deployment名稱很相似,我就不就太容易找出某個deployment所控制的pod.最爲無助的是service和它選擇的pod之間每每從表面上看不出關係的,如何知道一個service所控制.其實咱們能夠經過service裏的labelselector選擇的lable來過濾此service所控制的pod.redis

好比我有一個名爲helloworld的service,咱們使用kubectl describe service helloworld來查看它的信息docker

[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來過濾podcentos

[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也能夠經過相似方式選擇,這樣選擇出的結果更爲準確.api

選擇指定節點上的pod

有必定經驗的童鞋可能會知道,使用kubectl get pods'時是不顯示節點信息的,經過指定參數-o wide就能夠展現出來pod所在的節點信息,而後即可以經過grep命令來過濾結果.好比咱們想要查找k8s-node2`節點上的運行了哪些pod(節點名稱能夠自定義的,你們的沒必要是k8s-nodexxx這種形式)bash

[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核數,以及該節點的壓力等信息.

相關文章
相關標籤/搜索