kubectl使用技巧

kubectl技巧

资源类型

下表列出的是 kubernetes 中所有支持的类型和缩写的别名。

资源类型 缩写别名
clusters
componentstatuses cs
configmaps cm
daemonsets ds
deployments deploy
endpoints ep
event ev
horizontalpodautoscalers hpa
ingresses ing
jobs
limitranges limits
namespaces ns
networkpolicies
nodes no
statefulsets
persistentvolumeclaims pvc
persistentvolumes pv
pods po
podsecuritypolicies psp
podtemplates
replicasets rs
replicationcontrollers rc
resourcequotas quota
cronjob cj
secrets
serviceaccount sa
services svc
storageclasses sc
thirdpartyresources

Kubectl 详细输出和调试

详细等级 描述
--v=0 总是对操作人员可见。
--v=1 合理的默认日志级别,如果你不需要详细输出。
--v=2 可能与系统的重大变化相关的,有关稳定状态的信息和重要的日志信息。这是对大多数系统推荐的日志级别。
--v=3 有关更改的扩展信息。
--v=4 调试级别详细输出。
--v=6 显示请求的资源。
--v=7 显示 HTTP 请求的 header。
--v=8 显示 HTTP 请求的内容。

节点和Pod

如何查找非 running 状态的 Pod 呢?
 kubectl get pods -A --field-selector=status.phase!=Running | grep -v Complete

顺便一说,--field-selector 是个值得深入一点的参数。

获取节点node名称、CPU、Memory:
kubectl get nodes -o custom-columns=NAME:.metadata.name,CPU:.status.capacity.cpu,Memory:.status.capacity.memory
获取节点列表,其中包含运行在每个节点上的 Pod 数量:
 kubectl get po -o json -A | \
   jq '.items | group_by(.spec.nodeName) | map({"nodeName": .[0].spec.nodeName, "count": length}) | sort_by(.count)'
有时候 DaemonSet 因为某种原因没能在某个节点上启动。手动搜索会有点麻烦:
kubectl get node | grep -v \"$(kubectl -n NS名称 get pod --all-namespaces -o wide | fgrep pod名称 | awk '{print $8}' | xargs -n 1 echo -n "\|" | sed 's/[[:space:]]*//g')\"
使用 kubectl top 获取 Pod 列表并根据其消耗的 CPU 或 内存进行排序:
 # cpu排序
 $ kubectl top pods -A | sort --reverse --key 3 --numeric
 # memory排序
 $ kubectl top pods -A | sort --reverse --key 4 --numeric
获取 Pod 列表,并根据重启次数进行排序:
kubectl get pods —sort-by=.status.containerStatuses[0].restartCount

当然也可以使用 PodStatus 以及 ContainerStatus 的其它字段进行排序。

查看 Pod 的 requests 和 limits
kubectl get pods -A -o=custom-columns='NameSpace:metadata.namespace,NAME:metadata.name,MEM-request:spec.containers[*].resources.requests.memory,MEM-limit:spec.containers[*].resources.limits.memory,CPU-request:spec.containers[*].resources.requests.cpu,CPU-limit:spec.containers[*].resources.limits.cpu'

NameSpace                   NAME                                                          MEM-request      MEM-limit           CPU-request   CPU-limit
cattle-fleet-local-system   fleet-agent-f9ff56756-6pfk8                                   <none>           <none>              <none>        <none>
cattle-fleet-system         fleet-controller-b6f75fd7b-qp9tc                              <none>           <none>              <none>        <none>
cattle-fleet-system         gitjob-7bd59b95cb-f9slj                                       <none>           <none>              <none>        <none>
 ...
查看 Deploy 的 requests 和 limits
kubectl get deploy -A -o=custom-columns='NameSpace:metadata.namespace,NAME:metadata.name,MEM-request:spec.template.spec.containers[*].resources.requests.memory,MEM-limit:spec.template.spec.containers[*].resources.limits.memory,CPU-request:spec.template.spec.containers[*].resources.requests.cpu,CPU-limit:spec.template.spec.containers[*].resources.limits.cpu'

NameSpace                   NAME                                          MEM-request      MEM-limit           CPU-request   CPU-limit
cattle-fleet-local-system   fleet-agent                                   <none>           <none>              <none>        <none>
cattle-fleet-system         fleet-controller                              <none>           <none>              <none>        <none>
 ...
查看 StatefulSet 的 requests 和 limits
kubectl get sts -A -o=custom-columns='NameSpace:metadata.namespace,NAME:metadata.name,MEM-request:spec.template.spec.containers[*].resources.requests.memory,MEM-limit:spec.template.spec.containers[*].resources.limits.memory,CPU-request:spec.template.spec.containers[*].resources.requests.cpu,CPU-limit:spec.template.spec.containers[*].resources.limits.cpu'

NameSpace     NAME                                                   MEM-request   MEM-limit     CPU-request   CPU-limit
default       alertmanager-kube-prometheus-kube-prome-alertmanager   200Mi         <none>        <none>        <none>
default       prometheus-kube-prometheus-kube-prome-prometheus       <none>        <none>        <none>        <none>
rabbitmq-ha   rabbitmq                                               <none>        <none>        <none>        <none>
 ...
查看 CronJob 的 requests 和 limits
kubectl get cj -A -o=custom-columns='NameSpace:metadata.namespace,NAME:metadata.name,MEM-request:spec.jobTemplate.spec.template.spec.containers[*].resources.requests.memory,MEM-limit:spec.jobTemplate.spec.template.spec.containers[*].resources.limits.memory,CPU-request:spec.jobTemplate.spec.template.spec.containers[*].resources.requests.cpu,CPU-limit:spec.jobTemplate.spec.template.spec.containers[*].resources.limits.cpu'

NameSpace                NAME                                   MEM-request   MEM-limit   CPU-request   CPU-limit
imlf-pub                 imlfpub-mlt-hour-pub-combine-crontab   1000Mi        4000Mi      1             4
imlf-pub                 imlfpub-next-model-12                  1000Mi        <none>      1             4
imlf-pub                 imlfpub-report-12use18                 1000Mi        4000Mi      1             4
 ...
获取指定资源的描述清单:
 kubectl explain hpa
 KIND:     HorizontalPodAutoscaler
 VERSION:  autoscaling/v1
 DESCRIPTION:
      configuration of a horizontal pod autoscaler.
 FIELDS:
    apiVersion    <string>
 ...

网络

获取集群节点的内部 IP:
 kubectl get nodes -o json | jq -r '.items[].status.addresses[]? | select (.type == "InternalIP") | .address' | \
   paste -sd "\n" -
 9.134.14.252
获取所有的 Service 对象以及其 nodePort
 kubectl get -A svc -o json | jq -r '.items[] | [.metadata.name,([.spec.ports[].nodePort | tostring ] | join("|"))]| @tsv'

 kubernetes  null
 ...
在排除 CNI(例如 Flannel)故障的时候,经常会需要检查路由来识别故障 Pod。Pod 子网在这里非常有用:
 kubectl get nodes -o jsonpath='{.items[*].spec.podCIDR}' | tr " " "\n"                                                            fix-doc-azure-container-registry-config  ✭
 10.120.0.0/24
 10.120.1.0/24
 10.120.2.0/24

日志

使用可读的时间格式输出日志:
 kubectl logs -f fluentbit-gke-qq9w9  -c fluentbit --timestamps
 2020-09-10T13:10:49.822321364Z Fluent Bit v1.3.11
 2020-09-10T13:10:49.822373900Z Copyright (C) Treasure Data
 2020-09-10T13:10:49.822379743Z
 2020-09-10T13:10:49.822383264Z [2020/09/10 13:10:49] [ info] Configuration:
只输出尾部日志:
 kubectl logs -f fluentbit-gke-qq9w9  -c fluentbit --tail=10
 [2020/09/10 13:10:49] [ info] ___________
 [2020/09/10 13:10:49] [ info]  filters:
 [2020/09/10 13:10:49] [ info]      parser.0
 ...
输出一个 Pod 中所有容器的日志:
kubectl -n my-namespace logs -f my-pod —all-containers
使用标签选择器输出多个 Pod 的日志:
kubectl -n my-namespace logs -f -l app=nginx
获取“前一个”容器的日志(例如崩溃的情况):
kubectl -n my-namespace logs my-pod —previous

证书

查看证书有效期
for item in `find /etc/kubernetes/pki -maxdepth 2 -name "*.crt"`;do openssl x509 -in $item -text -noout| grep Not;echo ==============$item===========;done

其它

把 Secret 复制到其它命名空间:
 kubectl get secrets -o json --namespace namespace-old | \
   jq '.items[].metadata.namespace = "namespace-new"' | \
   kubectl create-f  -