系列目录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核数,以及该节点的压力等信息.