根据启动时间降序(descending order)
bashkubectl get pods --sort-by=.metadata.creationTimestamp
根据启动时间升序(ascending order)
bashkubectl get pods --sort-by=.metadata.creationTimestamp | awk 'NR == 1; NR > 1 {print $0 | "tac"}'
kubectl get pods --sort-by=.metadata.creationTimestamp | tail -n +2 | tac
kubectl get pods --sort-by={metadata.creationTimestamp} --no-headers | tac
kubectl get pods --sort-by=.metadata.creationTimestamp | tail -n +2 | tail -r
根据pods的重启次数进行排序
bashkubectl get pods -A --sort-by='.status.containerStatuses[0].restartCount'
清理K8s异常pod
bash#clean Evicted
kubectl get pods --all-namespaces -o wide | grep Evicted | awk '{print $1,$2}' | xargs -L1 kubectl delete pod -n
# clean error
kubectl get pods --all-namespaces -o wide | grep Error | awk '{print $1,$2}' | xargs -L1 kubectl delete pod -n
#clean compete
kubectl get pods --all-namespaces -o wide | grep Completed | awk '{print $1,$2}' | xargs -L1 kubectl delete pod -n
强制删除指定namespace下Terminating
状态的pod【使用之前请验证】
bashkubectl get pod -n $namespace |grep Terminating|awk '{print $1}'|xargs kubectl delete pod --grace-period=0 --force
批量强制删除集群内Terminating
状态的pod【使用之前请验证】
bashfor ns in $(kubectl get ns --no-headers | cut -d ' ' -f1); do \
for po in $(kubectl -n $ns get po --no-headers --ignore-not-found | grep Terminating | cut -d ' ' -f1); do \
kubectl -n $ns delete po $po --force --grace-period 0; \
done; \
done;
获取CrashLoopBackOff
的pod
bashkubectl get pod -A |grep CrashLoopBackOff CrashloopBackOff 表示pod经历了 starting , crashing 然后再次 starting 并再次 crashing 。 这个失败的容器会被kubelet不断重启,并且按照几何级数(exponentially)延迟(10s,20s,40s…)直到5分钟,最后一次是10分钟后重置。默认使用的是 podRestartPolicy PodSpec 有一个 restartPolicy 字段,值可以是 Always , OnFailure 和 Never ,默认是 Always 导致 CrashLoopBackOff 的原因通常有: 1. 容器中应用程序持续crash 2. pod/container的参数配置错误 3. 当部署Kubernetes pod是出现错误
临时释放的指定namespace下的pod
bash适用于不想删除 Kubernetes 集群內的信息
# 方法一:通过 patch 模式
kubectl get deploy -o name -n <NAMESPACE>|xargs -I{} kubectl patch {} -p '{"spec":{"replicas":0}}'
# 方法二:通过资源伸缩副本数
kubectl get deploy -o name |xargs -I{} kubectl scale --replicas=0 {}
清理没有使用的 pv
bashkubectl describe -A pvc | grep -E "^Name:.*$|^Namespace:.*$|^Used By:.*$" | grep -B 2 "<none>" | grep -E "^Name:.*$|^Namespace:.*$" | cut -f2 -d: | paste -d " " - - | xargs -n2 bash -c 'kubectl -n ${1} delete pvc ${0}'
清理没有被绑定的 PVC
bashkubectl get pvc --all-namespaces | tail -n +2 | grep -v Bound | awk '{print $1,$2}' | xargs -L1 kubectl delete pvc -n
#
kubectl get pv | tail -n +2 | grep -v Bound | awk '{print $1}' | xargs -L1 kubectl delete pv
kubectl get pods -A --field-selector=status.phase!=Running | grep -v Complete
bashkubectl port-forward nginx-po 3000:80
bashkubectl port-forward svc/nginx-web 3201
查看集群內 Pod 的服务质量等级(QoS)
bash## 查看所有pod的QoS
kubectl get pods --all-namespaces -o custom-columns=NAME:.metadata.name,NAMESPACE:.metadata.namespace,QOS-CLASS:.status.qosClass
Guaranteed:Pod 里的每个容器都必须有内存/CPU 限制和请求,而且值必须相等。 Burstable:Pod 里至少有一个容器有内存或者 CPU 请求且不满足 Guarantee 等级的要求,即内存/CPU 的值设置的不同。 BestEffort:容器必须没有任何内存或者 CPU 的限制或请求。
QoS存在的意义: 当节点上内存资源紧张时,kubernetes 会根据预先设置的不同 QoS 类别进行相应处理。 QoS 主要分为Guaranteed、Burstable 和 BestEffort三类,优先级从高到低。 换言之,就是k8s如果资源不足,会优先干掉QoS等级低的pod。
QoS 类为 Guaranteed 的 Pod必须满足以下几点:
如果满足下面条件,将会指定 Pod 的 QoS 类为 Burstable: Pod 不符合 Guaranteed QoS 类的标准。 Pod 中至少一个容器具有内存或 CPU 的请求或限制。
对于 QoS 类为 BestEffort 的 Pod,Pod 中的容器必须没有设置内存和 CPU 限制或请求。
bashkubectl run -it --rm --restart=Never --image=infoblox/dnstools:latest dnstools
bashkubectl get po calibre-web-76b9bf4d8b-2kc5j -o json | jq -j ".spec.containers[].name"
如果需要临时将 Daemonsets 关闭,只需要将其调度到一个不存在的 node 上即可,调整下 nodeSelector
bashkubectl patch daemonsets nginx-ingress-controller -p '{"spec":{"template":{"spec":{"nodeSelector":{"project/xdp":"none"}}}}}'
bashkubectl run ephemeral-busybox \
--rm \
--stdin \
--tty \
--restart=Never \
--image=lqshow/busybox-curl:1.28 \
-- sh
bash# 案例1
kubectl exec -i -t $(kubectl get pod -l <KEY>=<VALUE> -o name |sed 's/pods\///') -- bash
# 案例2
kubectl exec -i -t $(kubectl get pod -l <KEY>=<VALUE> -o jsonpath='{.items[0].metadata.name}') -- bash
bashkubectl get pods -o name | xargs -I{} kubectl exec {} -- <command goes here>
查看node资源使用情况
bashkubectl get nodes --no-headers | awk '{print $1}' | xargs -I {} sh -c "echo {} ; kubectl describe node {} | grep Allocated -A 5 | grep -ve Event -ve Allocated -ve percent -ve --;"
查看node资源总情况
bashkubectl get no -o=custom-columns="NODE:.metadata.name,ALLOCATABLE CPU:.status.allocatable.cpu,ALLOCATABLE MEMORY:.status.allocatable.memory"
查看node cpu分配情况
bashkubectl get nodes --no-headers | awk '{print $1}' | xargs -I {} sh -c 'echo -n "{}\t"|tr "\n" " " ; kubectl describe node {} | grep Allocated -A 5 | grep -ve Event -ve Allocated -ve percent -ve -- | grep cpu | awk '\''{print $2$3}'\'';'
查看node内存分配
bashkubectl get nodes --no-headers | awk '{print $1}' | xargs -I {} sh -c 'echo "{}\t"|tr "\n" " " ; kubectl describe node {} | grep Allocated -A 5 | grep -ve Event -ve Allocated -ve percent -ve -- | grep memory | awk '\''{print $2$3}'\'';'
查看所有镜像
bashkubectl get pods -o custom-columns='NAME:metadata.name,IMAGES:spec.containers[*].image'
获取节点列表及其内存容量
bashkubectl get no -o json | jq -r '.items | sort_by(.status.capacity.memory)[]|[.metadata.name,.status.capacity.memory]| @tsv'
获取每个节点的Pod数量
bashkubectl get po -o json --all-namespaces | jq '.items | group_by(.spec.nodeName) | map({"nodeName": .[0].spec.nodeName, "count": length}) | sort_by(.count)'
bashkubectl cordon <NODE-NAME>
bashkubectl drain <NODE-NAME> --delete-local-data --force --ignore-daemonsets
bashkubectl delete node <NODE-NAME>
bashkubeadm reset
bashdocker ps -q | xargs docker inspect --format '{{.Name}}, {{.State.Pid}}, {{.Id}}, {{.GraphDriver.Data.WorkDir}}'
bashdocker inspect --format '{{/*通过变量组合展示容器绑定端口列表*/}}已绑定端口列表:{{println}}{{range $p,$conf := .NetworkSettings.Ports}}{{$p}} -> {{(index $conf 0).HostPort}}{{println}}{{end}}' Web_web_1
bashdocker inspect --format '{{range .Containers}}{{.Name}}{{println}}{{else}}With No Containers{{end}}' bridge
bashdocker inspect bridge --format '{{/*查看网络的默认网关*/}}{{(index .IPAM.Config 0).Gateway}}'
bashdocker ps -q | xargs docker inspect --format '{{if not .State.Restarting}}{{.Name}}容器没有配置重启策略{{end}}'
bashdocker inspect --format '{{or .State.Status .State.Restarting}}' configuration-center
bashdocker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -q)
bashdocker inspect --format='{{range .NetworkSettings.Networks}}{{.MacAddress}}{{end}}' $(docker ps -a -q)
bashdocker inspect --format='{{.Name}}' $(docker ps -aq)|cut -d"/" -f2
bashdocker inspect --format='{{.LogPath}}' docker-test1
安装:
bashwget https://github.com/itaysk/kubectl-neat/releases/download/v2.0.3/kubectl-neat_linux_amd64.tar.gz
tar -xvf kubectl-neat_linux_amd64.tar.gz
chmod +x kubectl-neat
cp kubectl-neat /usr/sbin/
#mac 找对应的版本即可
#或者使用kubectl插件管理工具进行安装`kubectl krew install neat`
用法示例:
bashkubectl get pod mypod -o yaml | kubectl neat kubectl get pod mypod -oyaml | kubectl neat -o json kubectl neat -f - <./my-pod.json kubectl neat -f ./my-pod.json kubectl neat -f ./my-pod.json --output yaml
复制某个namespace下的资源配置到其他namespace
比如:复制Secret到其他namespace
方案1:
bash# 可以用来复制镜像认证(aliregistry)或者ssl证书的secrets
kubectl get secrets aliregistry -o yaml --namespace default | \
kubectl neat -o json| \
jq '.metadata.namespace = "test"'| \
kubectl create -f -
方案2:
bashkubectl get secret <SECRET-NAME> -n <SOURCE-NAMESPACE> -oyaml | sed "/namespace:/d" | kubectl apply --namespace=<TARGET-NAMESPACE> -f -
bashkubectl -n kube-system describe $(kubectl -n kube-system get secret -n kube-system -o name | grep namespace) | grep token
bashprintf " ThreadNUM PID\t\tCOMMAND\n" && ps -eLf | awk '{$1=null;$3=null;$4=null;$5=null;$6=null;$7=null;$8=null;$9=null;print}' | sort |uniq -c |sort -rn | head -10
bashkubectl set env deploy <DEPLOYMENT_NAME> OC_XXX_HOST=bbb
bashkubectl patch storageclass <your-class-name> -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
bashdocker ps | grep APP_NAME docker inspect CONTAINER_ID | grep Pid nsenter -t PID -n
本文作者:mykernel
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!