kubectl常用命令

本文记录常用的kubectl命令,不定期更新。

1. 统计k8s node上的污点信息

1
kubectl get nodes -o=custom-columns=NodeName:.metadata.name,TaintKey:.spec.taints[*].key,TaintValue:.spec.taints[*].value,TaintEffect:.spec.taints[*].effect

2. 查看不ready的pod

1
kubectl get pod --all-namespaces -o wide -w | grep -vE "Com|NAME|Running|1/1|2/2|3/3|4/4"

3. pod按照重启次数排序

1
2
3
kubectl get pods -A  --sort-by='.status.containerStatuses[0].restartCount' | tail

kubectl get pod -A --no-headers | sort -k5 -nr | head

4. kubectl proxy命令代理k8s apiserver

该命令经常用在开发的场景下,用来测试k8s api的结果。执行如下命令即可在本地127.0.0.1开启10999端口。

1
kubectl proxy --port=10999

在本地即可通过curl的方式来访问k8s的apiserver,而无需考虑鉴权问题。例如,curl http://127.0.0.1:10999/apis/batch/v1,即可直接返回结果。

5. --raw命令

该命令经常用在开发的场景下,用来测试k8s api的结果。执行如下的命令,即可返回json格式的结果。

1
kubectl get --raw /apis/batch/v1

6. 查看集群中的pod的request和limit情况

1
kubectl get pod -n kube-system  -o=custom-columns=NAME:.metadata.name,NAMESPACE:.metadata.namespace,PHASE:.status.phase,Request-cpu:.spec.containers\[0\].resources.requests.cpu,Request-memory:.spec.containers\[0\].resources.requests.memory,Limit-cpu:.spec.containers\[0\].resources.limits.cpu,Limit-memory:.spec.containers\[0\].resources.limits.memory

得到的效果如下:

1
2
3
4
5
NAME                                              NAMESPACE     PHASE       Request-cpu   Request-memory   Limit-cpu   Limit-memory
cleanup-for-np-processor-9pjkm kube-system Succeeded <none> <none> <none> <none>
coredns-6c6664b94-7rnm8 kube-system Running 100m 70Mi <none> 170Mi
coredns-6c6664b94-djxch kube-system Failed 100m 70Mi <none> 170Mi
coredns-6c6664b94-khvrb kube-system Running 100m 70Mi <none> 170Mi

7. 修改对象的status

因为status资源实际上为对象的subResource资源,实际上无法通过kubectl来完成,但该操作还是放到了该文档中。

下述命令的需求为修改service的status

1
2
3
4
APISERVER=https://kube-cn-nb-nbsjzxpoc-d01-a.intra.nbsjzx.ali.com:6443
TOKEN=eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi10b2tlbi1jazdkciIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJhZG1pbiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjhkZWE4MWQ4LTU2YTgtMTFlYy05MDMyLTgwNjE1ZjA4NDI0YSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTphZG1pbiJ9.O25G_MSmKRU_pIPO_9tFqDvbZm9SOM_Mix7jCJeFiZHzLiSc7n5RanP3QoEldR1IcFN4AZXzlzI1Rb0GyFQH7XmS1eLESMbKnrTR3N5s3wlRp-D5QT0c_RAVAiLKrP7KsSKNcLjQkIO8-Csf_kmizIh6fP0-b7Mp90cw0J8oSlM-ScEeUEksQyXvyisVN9qvvTIkmbsgh7pX5IFcB4mGbvV9loOUC3-LdiiaCkMJzMisEeSJRaajmLlwpWXtb2BSi9HmBMktUE9IVB8ryZ06wbPRianbjoBwtAhcXuRyj1LaEog3aJHsyMA_DOZJtvjYis60AIRZ1iBnc-gZtEFCxw
obj=nginx-ingress-lb
curl -XPATCH -H "Accept: application/json" -H "Content-Type: application/merge-patch+json" --header "Authorization: Bearer $TOKEN" --insecure -d '{"status": {"loadBalancer": {"ingress": [{"ip": "10.209.97.170"}]}}}' $APISERVER/api/v1/namespaces/acs-system/services/nginx-ingress-lb/status

APISERVER变量可以通过kubeconfig文件获取到。

TOKEN变量可以直接使用kube-system下的admin账号。

  1. 执行 kubectl get secrets -n kube-system | grep admin 获取到sa对应的secret
  2. 执行 kubectl get secrets -n kube-system xxxx -o yaml 获取到base64之后的token
  3. 执行 echo "xxxx" | base64 -d 即可获取到对应的token

obj变量为要修改的service对象名称。

8. 查看 secret 内容

1
kubectl get secret -n ark-system ark.cmdb.https.origin.tls -o jsonpath='{.data.ca\.pem}' | base64 -d

9. 修改 secret 或 cm 的内容

很多场景下使用 kubectl edit 修改不能完全满足需求,比如某个 key 对应的 value 非常长且包含空格,很难直接编辑。可以通过导出 key 对应的 value 到文件,然后再重新 apply 的方式合入。

导出 configmap 中特定的 key:

1
kubectl get cm -n kube-system  networkpolicy-config -o jsonpath='{.data.config\.yaml}'

修改完成后,将文件重新 apply cm

1
kubectl create --save-config cm  networkpolicy-config -n kube-system --from-file /tmp/config.yaml -o yaml --dry-run | kubectl apply -f -

9. 删除所有 pod(或特定状态 pod)

1
kubectl get pods --all-namespaces -o wide --no-headers | grep -v Running | awk '{print $1 " " $2}' | while read AA BB; do kubectl get pod -n $AA $BB --no-headers; done

10. kubectl debug

常用于网络问题排查,其中镜像 netshoot 中包含了丰富的网络命令。

1
kubectl exec -it nginx-statefulset-0 bash

进入到 k8s node 网络,其中 ${node} 为 k8s 的 node 名字。

1
kubectl debug node/${node} -it --image=nicolaka/netshoot

11. kubectl patch

1
kubectl patch -p '{"spec":{"filed1": "value1"}}' --type=merge xxx -n yyy

12. 查询对象的 labels

1
2
3
4
5
6
7
# 查看所有 k8s 节点及其 label
kubectl get nodes -o=jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.metadata.labels.topology\.kubernetes\.io/zone}{"\n"}{end}'
# 查看单个 k8s 节点的 label
kubectl get node c25e04016.cloud.e04.amtest130 -o jsonpath="{.metadata.labels['topology\.kubernetes\.io/zone']}"

# 获取没有污点的节点对应的 label machine-type
kubectl get nodes -o json | jq -r '.items[] | select(.spec.taints | not) | [.metadata.name, .metadata.labels["machine-type"]] | @tsv'