2022-04-07
kubernetes
00
请注意,本文编写于 748 天前,最后修改于 425 天前,其中某些信息可能已经过时。

目录

pod
启动
清理
清理卷
查找非 running 状态的 Pod
pod端口映射
QoS
什么是服务质量等级(QoS)
Guaranteed
Burstable
BestEffort
调试coredns
查看容器名
临时关闭 Daemonsets
创建临时可调式Pod
使用交互 shell 访问匹配到标签的 Pod
在多个pod中运行命令
k8s
资源
重置集群节点【慎用】
docker
根据overlay2目录名找容器
通过变量组合展示容器绑定端口列表
查询指定网络下的容器名称,如果存在输出容器名称,如果没有,输出With No Containers
通过索引序号读取默认网关
查看容器是否配置了容器策略
查看容器当前的运行状态
显示所有容器的IP
显示所有容器的mac地址
显示所有容器的名称,并分离出反斜杠
获取容器的日志路径
其他
导出干净的YAML(kubectl-neat)
复制资源到其他namespace下
获取K8s的token
容器线程数统计
设置deploy的环境变量
配置默认storageclass
进入容器namespace

pod

启动

根据启动时间降序(descending order)

bash
kubectl get pods --sort-by=.metadata.creationTimestamp

根据启动时间升序(ascending order)

bash
kubectl 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的重启次数进行排序

bash
kubectl 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【使用之前请验证】

bash
kubectl get pod -n $namespace |grep Terminating|awk '{print $1}'|xargs kubectl delete pod --grace-period=0 --force

批量强制删除集群内Terminating状态的pod【使用之前请验证】

bash
for 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

bash
kubectl 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

bash
kubectl 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

bash
kubectl 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

查找非 running 状态的 Pod

kubectl get pods -A --field-selector=status.phase!=Running | grep -v Complete

pod端口映射

  1. 将 localhost:3000 的请求转发到 nginx-pod Pod 的 80 端口
bash
kubectl port-forward nginx-po 3000:80
  1. 将 localhost:3201 的请求转发到 nginx-web service 的 3201 端口
bash
kubectl port-forward svc/nginx-web 3201

QoS

查看集群內 Pod 的服务质量等级(QoS)

bash
## 查看所有pod的QoS kubectl get pods --all-namespaces -o custom-columns=NAME:.metadata.name,NAMESPACE:.metadata.namespace,QOS-CLASS:.status.qosClass

什么是服务质量等级(QoS)

Guaranteed:Pod 里的每个容器都必须有内存/CPU 限制和请求,而且值必须相等。 Burstable:Pod 里至少有一个容器有内存或者 CPU 请求且不满足 Guarantee 等级的要求,即内存/CPU 的值设置的不同。 BestEffort:容器必须没有任何内存或者 CPU 的限制或请求。

QoS存在的意义: 当节点上内存资源紧张时,kubernetes 会根据预先设置的不同 QoS 类别进行相应处理。 QoS 主要分为Guaranteed、Burstable 和 BestEffort三类,优先级从高到低。 换言之,就是k8s如果资源不足,会优先干掉QoS等级低的pod。

Guaranteed

QoS 类为 Guaranteed 的 Pod必须满足以下几点:

  1. Pod 中的每个容器都必须指定内存限制和内存请求。
  2. 对于 Pod 中的每个容器,内存限制必须等于内存请求。
  3. Pod 中的每个容器都必须指定 CPU 限制和 CPU 请求。
  4. 对于 Pod 中的每个容器,CPU 限制必须等于 CPU 请求。

Burstable

如果满足下面条件,将会指定 Pod 的 QoS 类为 Burstable: Pod 不符合 Guaranteed QoS 类的标准。 Pod 中至少一个容器具有内存或 CPU 的请求或限制。

BestEffort

对于 QoS 类为 BestEffort 的 Pod,Pod 中的容器必须没有设置内存和 CPU 限制或请求。

调试coredns

bash
kubectl run -it --rm --restart=Never --image=infoblox/dnstools:latest dnstools

查看容器名

bash
kubectl get po calibre-web-76b9bf4d8b-2kc5j -o json | jq -j ".spec.containers[].name"

临时关闭 Daemonsets

如果需要临时将 Daemonsets 关闭,只需要将其调度到一个不存在的 node 上即可,调整下 nodeSelector

bash
kubectl patch daemonsets nginx-ingress-controller -p '{"spec":{"template":{"spec":{"nodeSelector":{"project/xdp":"none"}}}}}'

创建临时可调式Pod

bash
kubectl run ephemeral-busybox \ --rm \ --stdin \ --tty \ --restart=Never \ --image=lqshow/busybox-curl:1.28 \ -- sh

使用交互 shell 访问匹配到标签的 Pod

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

在多个pod中运行命令

bash
kubectl get pods -o name | xargs -I{} kubectl exec {} -- <command goes here>

k8s

资源

查看node资源使用情况

bash
kubectl 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资源总情况

bash
kubectl get no -o=custom-columns="NODE:.metadata.name,ALLOCATABLE CPU:.status.allocatable.cpu,ALLOCATABLE MEMORY:.status.allocatable.memory"

查看node cpu分配情况

bash
kubectl 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内存分配

bash
kubectl 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}'\'';'

查看所有镜像

bash
kubectl get pods -o custom-columns='NAME:metadata.name,IMAGES:spec.containers[*].image'

获取节点列表及其内存容量

bash
kubectl get no -o json | jq -r '.items | sort_by(.status.capacity.memory)[]|[.metadata.name,.status.capacity.memory]| @tsv'

获取每个节点的Pod数量

bash
kubectl get po -o json --all-namespaces | jq '.items | group_by(.spec.nodeName) | map({"nodeName": .[0].spec.nodeName, "count": length}) | sort_by(.count)'

重置集群节点【慎用】

  1. 将节点标记为不可调度,确保新的容器不会调度到该节点
bash
kubectl cordon <NODE-NAME>
  1. Master 节点上将需要重置的节点驱逐, 除了 deemonset
bash
kubectl drain <NODE-NAME> --delete-local-data --force --ignore-daemonsets
  1. 删除节点
bash
kubectl delete node <NODE-NAME>
  1. 在需要重置节点上执⾏重置脚本,注意,如果在 Master 主节点执⾏ kubeadm reset,则需要重新初始化集群
bash
kubeadm reset

docker

根据overlay2目录名找容器

bash
docker ps -q | xargs docker inspect --format '{{.Name}}, {{.State.Pid}}, {{.Id}}, {{.GraphDriver.Data.WorkDir}}'

通过变量组合展示容器绑定端口列表

bash
docker inspect --format '{{/*通过变量组合展示容器绑定端口列表*/}}已绑定端口列表:{{println}}{{range $p,$conf := .NetworkSettings.Ports}}{{$p}} -> {{(index $conf 0).HostPort}}{{println}}{{end}}' Web_web_1

查询指定网络下的容器名称,如果存在输出容器名称,如果没有,输出With No Containers

bash
docker inspect --format '{{range .Containers}}{{.Name}}{{println}}{{else}}With No Containers{{end}}' bridge

通过索引序号读取默认网关

bash
docker inspect bridge --format '{{/*查看网络的默认网关*/}}{{(index .IPAM.Config 0).Gateway}}'

查看容器是否配置了容器策略

bash
docker ps -q | xargs docker inspect --format '{{if not .State.Restarting}}{{.Name}}容器没有配置重启策略{{end}}'

查看容器当前的运行状态

bash
docker inspect --format '{{or .State.Status .State.Restarting}}' configuration-center

显示所有容器的IP

bash
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -q)

显示所有容器的mac地址

bash
docker inspect --format='{{range .NetworkSettings.Networks}}{{.MacAddress}}{{end}}' $(docker ps -a -q)

显示所有容器的名称,并分离出反斜杠

bash
docker inspect --format='{{.Name}}' $(docker ps -aq)|cut -d"/" -f2

获取容器的日志路径

bash
docker inspect --format='{{.LogPath}}' docker-test1

其他

导出干净的YAML(kubectl-neat)

安装:

bash
wget 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`

用法示例:

bash
kubectl 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下的资源配置到其他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:

bash
kubectl get secret <SECRET-NAME> -n <SOURCE-NAMESPACE> -oyaml | sed "/namespace:/d" | kubectl apply --namespace=<TARGET-NAMESPACE> -f -

获取K8s的token

bash
kubectl -n kube-system describe $(kubectl -n kube-system get secret -n kube-system -o name | grep namespace) | grep token

容器线程数统计

bash
printf " 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

设置deploy的环境变量

bash
kubectl set env deploy <DEPLOYMENT_NAME> OC_XXX_HOST=bbb

配置默认storageclass

bash
kubectl patch storageclass <your-class-name> -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'

进入容器namespace

bash
docker ps | grep APP_NAME docker inspect CONTAINER_ID | grep Pid nsenter -t PID -n

本文作者:mykernel

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!