kubectl使用技巧
- k8s
- 2024-08-04
- 54热度
- 0评论
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 -