系列目錄html
咱們把集羣管理命令分爲兩個部分,第一部分介紹一些簡單的,可是多是很是經常使用的命令以及一些平時可能沒有碰到的技巧.第二部分將綜合前面介紹的工具經過示例來說解一些更爲複雜的命令.node
使用kubectl get pods
獲取的通常是默認名稱空間的信息(能夠在配置文件中指定默認全稱空間,若是沒有指定則默認爲default).若是想要獲取獲取非默認名稱空間的pod,則須要指定-n(或者--namespace)參數.可是有些時候咱們想要查看整個集羣中全部名稱空間的pod,則能夠經過kubectl get pods --all-namespaces
linux
有的童鞋可能會好奇,可不可能不選擇所有,可是選擇多個名稱空間下的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
有經驗的童鞋都知道,受某個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
有必定經驗的童鞋可能會知道,使用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過濾出來.
[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核數,以及該節點的壓力等信息.