k8s排错指南

一、排查顺序:

查看node状态→查看pod状态→查看container状态→查看service流量是否路由到pod→查看ingress配置是否正确→查看kubelet系统日志

二、具体排查思路:

1、排查node故障:

#查看各节点状态:
kubectl get node <node-name>#查看node事件:
kubectl describe node <node-name>

Node 本身宕机或者 Kubelet 无法启动会导致

Node 上面的 Pod 无法正常运行

已在运行的 Pod 无法正常终止

2、排查pod故障

#查看 Pod 状态:
kubectl get pods <pod-name> -n <namespace> -o wide#查看 Pod 的 yaml 配置:
kubectl get pods <pod-name> -n <namespace> -o yaml#查看 Pod 的事件:
kubectl describe pods <pod-name> -n <namespace>#查看 Pod 容器日志:
kubectl logs -n <namespace> <pod-name> [-c <container-name>]#常见错误
##启动时的错误包括:
ImagePullBackoff
ImageInspectError
ErrImagePull
ErrImageNeverPull
RegistryUnavailable
InvalidImageName
##运行中的错误包括:
CrashLoopBackOff
RunContainerError
KillContainerError
VerifyNonRootError
RunInitContainerError
CreatePodSandboxError
ConfigPodSandboxError
KillPodSandboxError
SetupNetworkError
TeardownNetworkError

3、service故障排查

kubectl describe svc <svc-name> -n dev

4、ingress故障排查

kubectl describe ingress <ingress-name> -n dev

5、查看kubelet系统日志

journalctl -l -u kubelet -n 1000

kube-apiserver 日志

PODNAME=$(kubectl -n kube-system get pod -l component=kube-apiserver -o jsonpath='{.items[0].metadata.name}')
kubectl -n kube-system logs $PODNAME --tail 100

kube-apiserver 无法启动会导致

  • 集群不可访问
  • 已有的 Pod 和服务正常运行(依赖于 Kubernetes API 的除外)

kube-controller-manager 日志

PODNAME=$(kubectl -n kube-system get pod -l component=kube-controller-manager -o jsonpath='{.items[0].metadata.name}')
kubectl -n kube-system logs $PODNAME --tail 100

kube-scheduler 日志

PODNAME=$(kubectl -n kube-system get pod -l component=kube-scheduler -o jsonpath='{.items[0].metadata.name}')
kubectl -n kube-system logs $PODNAME --tail 100

kube-controller-manager/kube-scheduler 异常会导致

  • 复制控制器、节点控制器、云服务控制器等无法工作,从而导致 Deployment、Service 等无法工作,也无法注册新的 Node 到集群中来
  • 新创建的 Pod 无法调度(总是 Pending 状态)

kube-dns 日志

PODNAME=$(kubectl -n kube-system get pod -l k8s-app=kube-dns -o jsonpath='{.items[0].metadata.name}')
kubectl -n kube-system logs $PODNAME -c kubedns

Kubelet 日志

查看 Kubelet 日志需要首先 SSH 登录到 Node 上。

journalctl -l -u kubelet

Kube-proxy 日志

Kube-proxy 通常以 DaemonSet 的方式部署

kubectl -n kube-system get pod -l component=kube-proxy
NAME               READY     STATUS    RESTARTS   AGE
kube-proxy-42zpn   1/1       Running   0          1d
kube-proxy-7gd4p   1/1       Running   0          3d
kube-proxy-87dbs   1/1       Running   0          4d
kubectl -n kube-system logs kube-proxy-42zpn

Kube-dns/Dashboard CrashLoopBackOff

由于 Dashboard 依赖于 kube-dns,所以这个问题一般是由于 kube-dns 无法正常启动导致的。查看 kube-dns 的日志

kubectl logs --namespace=kube-system $(kubectl get pods --namespace=kube-system -l k8s-app=kube-dns -o name) -c kubedns
kubectl logs --namespace=kube-system $(kubectl get pods --namespace=kube-system -l k8s-app=kube-dns -o name) -c dnsmasq
kubectl logs --namespace=kube-system $(kubectl get pods --namespace=kube-system -l k8s-app=kube-dns -o name) -c sidecar

三、异常排错:

1、Node异常排错 

Node NotReady

Node 处于 NotReady 状态,大部分是由于 PLEG(Pod Lifecycle Event Generator)问题导致的。社区 issue #45419 目前还处于未解决状态。

NotReady 的原因比较多,在排查时最重要的就是执行 kubectl describe node <node name> 并查看 Kubelet 日志中的错误信息。常见的问题及修复方法为:

  1. Kubelet 未启动或者异常挂起:重新启动 Kubelet。
  2. CNI 网络插件未部署:部署 CNI 插件。
  3. Docker 僵死(API 不响应):重启 Docker。
  4. 磁盘空间不足:清理磁盘空间,比如镜像、临时文件等。

Node 节点加入 Kubernetes 集群后无法被调度,怎么办?

  1. 检查该节点的 taints 和 tolerations 是否与 Pod 的 selector 匹配
  2. 检查该节点的资源使用情况是否满足 Pod 的调度要求
  3. 确保该节点与 Kubernetes API server 的连接正常

2、pod异常排错

Pod 运行异常的排错方法。

一般来说,无论 Pod 处于什么异常状态,都可以执行以下命令来查看 Pod 的状态

  • kubectl get pod <pod-name> -o yaml 查看 Pod 的配置是否正确
  • kubectl describe pod <pod-name> 查看 Pod 的事件
  • kubectl logs <pod-name> [-c <container-name>] 查看容器日志

这些事件和日志通常都会有助于排查 Pod 发生的问题。

Pod 一直处于 Pending 状态

Pending 说明 Pod 还没有调度到某个 Node 上面。可以通过 kubectl describe pod <pod-name> 命令查看到当前 Pod 的事件,进而判断为什么没有调度。如

$ kubectl describe pod mypod
Events:Type     Reason            Age                From               Message----     ------            ----               ----               -------Warning  FailedScheduling  12s (x6 over 27s)  default-scheduler  0/4 nodes are available: 2 Insufficient cpu.

可能的原因包括

  • 资源不足,集群内所有的 Node 都不满足该 Pod 请求的 CPU、内存、GPU 或者临时存储空间等资源。解决方法是删除集群内不用的 Pod 或者增加新的 Node。
  • HostPort 端口已被占用,通常推荐使用 Service 对外开放服务端口
  • 检查该节点的 taints 和 tolerations 是否与 Pod 的 selector 匹配
  • 调整 Pod 的调度策略,如使用 NodeSelector、Affinity 等

Pod 一直处于 Waiting 或 ContainerCreating 状态

首先还是通过 kubectl describe pod <pod-name> 命令查看到当前 Pod 的事件

$ kubectl -n kube-system describe pod nginx-pod
Events:Type     Reason                 Age               From               Message----     ------                 ----              ----               -------Normal   Scheduled              1m                default-scheduler  Successfully assigned nginx-pod to node1Normal   SuccessfulMountVolume  1m                kubelet, gpu13     MountVolume.SetUp succeeded for volume "config-volume"Normal   SuccessfulMountVolume  1m                kubelet, gpu13     MountVolume.SetUp succeeded for volume "coredns-token-sxdmc"Warning  FailedSync             2s (x4 over 46s)  kubelet, gpu13     Error syncing podNormal   SandboxChanged         1s (x4 over 46s)  kubelet, gpu13     Pod sandbox changed, it will be killed and re-created.

可以发现,该 Pod 的 Sandbox 容器无法正常启动,具体原因需要查看 Kubelet 日志

$ journalctl -u kubelet
...
Mar 14 04:22:04 node1 kubelet[29801]: E0314 04:22:04.649912   29801 cni.go:294] Error adding network: failed to set bridge addr: "cni0" already has an IP address different from 10.244.4.1/24
Mar 14 04:22:04 node1 kubelet[29801]: E0314 04:22:04.649941   29801 cni.go:243] Error while adding to cni network: failed to set bridge addr: "cni0" already has an IP address different from 10.244.4.1/24
Mar 14 04:22:04 node1 kubelet[29801]: W0314 04:22:04.891337   29801 cni.go:258] CNI failed to retrieve network namespace path: Cannot find network namespace for the terminated container "c4fd616cde0e7052c240173541b8543f746e75c17744872aa04fe06f52b5141c"
Mar 14 04:22:05 node1 kubelet[29801]: E0314 04:22:05.965801   29801 remote_runtime.go:91] RunPodSandbox from runtime service failed: rpc error: code = 2 desc = NetworkPlugin cni failed to set up pod "nginx-pod" network: failed to set bridge addr: "cni0" already has an IP address different from 10.244.4.1/24

发现是 cni0 网桥配置了一个不同网段的 IP 地址导致,删除该网桥(网络插件会自动重新创建)即可修复

$ ip link set cni0 down
$ brctl delbr cni0

除了以上错误,其他可能的原因还有

  • 镜像拉取失败,比如
  1. 配置了错误的镜像
  2. Kubelet 无法访问镜像(国内环境访问 gcr.io 需要特殊处理)
  3. 私有镜像的密钥配置错误
  4. 镜像太大,拉取超时(可以适当调整 kubelet 的 --image-pull-progress-deadline 和 --runtime-request-timeout 选项)
  • CNI 网络错误,一般需要检查 CNI 网络插件的配置,比如
  1. 无法配置 Pod 网络
  2. 无法分配 IP 地址
  • 容器无法启动,需要检查是否打包了正确的镜像或者是否配置了正确的容器参数

Pod 处于 ImagePullBackOff 状态

这通常是镜像名称配置错误或者私有镜像的密钥配置错误导致。这种情况可以使用 docker pull <image> 来验证镜像是否可以正常拉取。

$ kubectl describe pod mypod
...
Events:Type     Reason                 Age                From                                Message----     ------                 ----               ----                                -------Normal   Scheduled              36s                default-scheduler                   Successfully assigned sh to k8s-agentpool1-38622806-0Normal   SuccessfulMountVolume  35s                kubelet, k8s-agentpool1-38622806-0  MountVolume.SetUp succeeded for volume "default-token-n4pn6"Normal   Pulling                17s (x2 over 33s)  kubelet, k8s-agentpool1-38622806-0  pulling image "a1pine"Warning  Failed                 14s (x2 over 29s)  kubelet, k8s-agentpool1-38622806-0  Failed to pull image "a1pine": rpc error: code = Unknown desc = Error response from daemon: repository a1pine not found: does not exist or no pull accessWarning  Failed                 14s (x2 over 29s)  kubelet, k8s-agentpool1-38622806-0  Error: ErrImagePullNormal   SandboxChanged         4s (x7 over 28s)   kubelet, k8s-agentpool1-38622806-0  Pod sandbox changed, it will be killed and re-created.Normal   BackOff                4s (x5 over 25s)   kubelet, k8s-agentpool1-38622806-0  Back-off pulling image "a1pine"Warning  Failed                 1s (x6 over 25s)   kubelet, k8s-agentpool1-38622806-0  Error: ImagePullBackOff

如果是私有镜像,需要首先创建一个 docker-registry 类型的 Secret

kubectl create secret docker-registry my-secret --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL

 然后在容器中引用这个 Secret

spec:containers:- name: private-reg-containerimage: <your-private-image>imagePullSecrets:- name: my-secret

Pod 一直处于 CrashLoopBackOff 状态

CrashLoopBackOff 状态说明容器曾经启动了,但又异常退出了。此时 Pod 的 RestartCounts 通常是大于 0 的,可以先查看一下容器的日志

kubectl describe pod <pod-name>
kubectl logs <pod-name>
kubectl logs --previous <pod-name>

这里可以发现一些容器退出的原因,比如

  • 容器进程退出
  • 健康检查失败退出
  • OOMKilled
$ kubectl describe pod mypod
...
Containers:sh:Container ID:  docker://3f7a2ee0e7e0e16c22090a25f9b6e42b5c06ec049405bc34d3aa183060eb4906Image:         alpineImage ID:      docker-pullable://alpine@sha256:7b848083f93822dd21b0a2f14a110bd99f6efb4b838d499df6d04a49d0debf8bPort:          <none>Host Port:     <none>State:          TerminatedReason:       OOMKilledExit Code:    2Last State:     TerminatedReason:       OOMKilledExit Code:    2Ready:          FalseRestart Count:  3Limits:cpu:     1memory:  1GRequests:cpu:        100mmemory:     500M
...

如果此时如果还未发现线索,还可以到容器内执行命令来进一步查看退出原因

kubectl exec cassandra -- cat /var/log/cassandra/system.log

如果还是没有线索,那就需要 SSH 登录该 Pod 所在的 Node 上,查看 Kubelet 或者 Docker 的日志进一步排查了

# Query Node
kubectl get pod <pod-name> -o wide# SSH to Node
ssh <username>@<node-name>

Pod 处于 Error 状态

通常处于 Error 状态说明 Pod 启动过程中发生了错误。常见的原因包括

  • 依赖的 ConfigMap、Secret 或者 PV 等不存在
  • 请求的资源超过了管理员设置的限制,比如超过了 LimitRange 等
  • 违反集群的安全策略,比如违反了 PodSecurityPolicy 等
  • 容器无权操作集群内的资源,比如开启 RBAC 后,需要为 ServiceAccount 配置角色绑定
     

Pod 处于 Terminating 或 Unknown 状态

从 v1.5 开始,Kubernetes 不会因为 Node 失联而删除其上正在运行的 Pod,而是将其标记为 Terminating 或 Unknown 状态。想要删除这些状态的 Pod 有三种方法:

  • 从集群中删除该 Node。使用公有云时,kube-controller-manager 会在 VM 删除后自动删除对应的 Node。而在物理机部署的集群中,需要管理员手动删除 Node(如 kubectl delete node <node-name>。
  • Node 恢复正常。Kubelet 会重新跟 kube-apiserver 通信确认这些 Pod 的期待状态,进而再决定删除或者继续运行这些 Pod。
  • 用户强制删除。用户可以执行 kubectl delete pods <pod> --grace-period=0 --force 强制删除 Pod。除非明确知道 Pod 的确处于停止状态(比如 Node 所在 VM 或物理机已经关机),否则不建议使用该方法。特别是 StatefulSet 管理的 Pod,强制删除容易导致脑裂或者数据丢失等问题。

如果 Kubelet 是以 Docker 容器的形式运行的,此时 kubelet 日志中可能会发现如下的错误:

{"log":"I0926 19:59:07.162477   54420 kubelet.go:1894] SyncLoop (DELETE, \"api\"): \"billcenter-737844550-26z3w_meipu(30f3ffec-a29f-11e7-b693-246e9607517c)\"\n","stream":"stderr","time":"2017-09-26T11:59:07.162748656Z"}
{"log":"I0926 19:59:39.977126   54420 reconciler.go:186] operationExecutor.UnmountVolume started for volume \"default-token-6tpnm\" (UniqueName: \"kubernetes.io/secret/30f3ffec-a29f-11e7-b693-246e9607517c-default-token-6tpnm\") pod \"30f3ffec-a29f-11e7-b693-246e9607517c\" (UID: \"30f3ffec-a29f-11e7-b693-246e9607517c\") \n","stream":"stderr","time":"2017-09-26T11:59:39.977438174Z"}
{"log":"E0926 19:59:39.977461   54420 nestedpendingoperations.go:262] Operation for \"\\\"kubernetes.io/secret/30f3ffec-a29f-11e7-b693-246e9607517c-default-token-6tpnm\\\" (\\\"30f3ffec-a29f-11e7-b693-246e9607517c\\\")\" failed. No retries permitted until 2017-09-26 19:59:41.977419403 +0800 CST (durationBeforeRetry 2s). Error: UnmountVolume.TearDown failed for volume \"default-token-6tpnm\" (UniqueName: \"kubernetes.io/secret/30f3ffec-a29f-11e7-b693-246e9607517c-default-token-6tpnm\") pod \"30f3ffec-a29f-11e7-b693-246e9607517c\" (UID: \"30f3ffec-a29f-11e7-b693-246e9607517c\") : remove /var/lib/kubelet/pods/30f3ffec-a29f-11e7-b693-246e9607517c/volumes/kubernetes.io~secret/default-token-6tpnm: device or resource busy\n","stream":"stderr","time":"2017-09-26T11:59:39.977728079Z"}

 如果是这种情况,则需要给 kubelet 容器设置 --containerized 参数并传入以下的存储卷

# 以使用 calico 网络插件为例-v /:/rootfs:ro,shared \-v /sys:/sys:ro \-v /dev:/dev:rw \-v /var/log:/var/log:rw \-v /run/calico/:/run/calico/:rw \-v /run/docker/:/run/docker/:rw \-v /run/docker.sock:/run/docker.sock:rw \-v /usr/lib/os-release:/etc/os-release \-v /usr/share/ca-certificates/:/etc/ssl/certs \-v /var/lib/docker/:/var/lib/docker:rw,shared \-v /var/lib/kubelet/:/var/lib/kubelet:rw,shared \-v /etc/kubernetes/ssl/:/etc/kubernetes/ssl/ \-v /etc/kubernetes/config/:/etc/kubernetes/config/ \-v /etc/cni/net.d/:/etc/cni/net.d/ \-v /opt/cni/bin/:/opt/cni/bin/ \

处于 Terminating 状态的 Pod 在 Kubelet 恢复正常运行后一般会自动删除。但有时也会出现无法删除的情况,并且通过 kubectl delete pods <pod> --grace-period=0 --force 也无法强制删除。此时一般是由于 finalizers 导致的,通过 kubectl edit 将 finalizers 删除即可解决。 

"finalizers": ["foregroundDeletion"
]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/744490.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows10安装RubyRails步骤

2024年3月14日安装&#xff0c;亲测。记录一下以便后续需要查看。 首先在官网下载RubyInstaller for Windows - 国内镜像 rubyinstaller.cn 版本是3.3.0 下载完后图形化界面安装 安装完毕&#xff0c;出现Ruby的命令行&#xff0c;或者在开始菜单出现start command prompt wi…

纯血鸿蒙来画龙!基于HarmonyOS ArkTS来操作SVG图片

大家好&#xff0c;龙年报喜&#xff0c;大地回春&#xff0c;作为程序员&#xff0c;以代码之名&#xff0c;表达对于龙年的祝福。本节将演示如何在基于HarmonyOS ArkTS的Image组件来实现画一条中国龙&#xff0c;祝大家“码”上“鸿”福到&#xff01; 创建应用 选择空模板…

Xcode下载模拟器报错Could not download iOS 17.4 Simulator (21E213).

xcode14以后最小化安装包&#xff0c;从而将模拟器不集中在安装包中 因此xcode14至以后的版本安装后第一次启动会加载提示安装模拟器的提示框 或者根据需要到xcode中进行所需版本|平台的模拟器进行安装 Xcode > Settings > Platforms 问题来了尝试多次都安装失败例如…

FreeRTOS 的任务创建和删除

任务创建是我们第一个要学习的 API 函数&#xff0c;同时它也是 FreeRTOS 众多 API 函数中最复杂的一个&#xff0c;但是没办法&#xff0c;这个函数是我们第一个要学习的&#xff0c;也是非常重要的。 那么来看一下咱们本节的主要内容有哪些&#xff1a; 首先我们来介绍一下…

4款实用性前端动画特效分享(附在线演示)

分享4款非常不错的项目动画特效 其中有jQuery特效、canvas特效、CSS动画等等 下方效果图可能不是特别的生动 那么你可以点击在线预览进行查看相应的动画特效 同时也是可以下载该资源的 全屏图片视差旋转切换特效 基于anime.js制作全屏响应式的图片元素布局&#xff0c;通过左…

Linux系统部署Swagger Editor结合内网穿透实现公网管理本地接口文档

文章目录 Swagger Editor本地接口文档公网远程访问1. 部署Swagger Editor2. Linux安装Cpolar3. 配置Swagger Editor公网地址4. 远程访问Swagger Editor5. 固定Swagger Editor公网地址 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的 人工智能学习网站&#xf…

一种基于宏和serde_json实现的rust web中统一返回类

本人rust萌新&#xff0c;写web碰到了这个&#xff0c;基于ChatGPT和文心一言学了宏&#xff0c;强行把这玩意实现出来了&#xff0c;做个学习记录&#xff0c;如果有更好的方法&#xff0c;勿喷。 先看效果&#xff0c;注意不支持嵌套&#xff0c;且kv映射要用>(因为它这个…

Hadoop大数据应用:Yarn 节点实现扩容与缩容

目录 一、实验 1.环境 2.Yarn 节点扩容 3.Yarn 节点缩容 二、问题 1.yarn启动服务报错 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 主机架构软件版本IP备注hadoop NameNode &#xff08;已部署&#xff09; SecondaryNameNode &#xff08;已部署&…

力扣● 392.判断子序列 ● 115.不同的子序列

● 392.判断子序列 可以直接使用双指针的方法&#xff0c;2个指针分别从s、t开头出发&#xff0c;时间复杂度为O(t.size())。 但是这里用动规来做。Carl&#xff1a;掌握本题的动态规划解法是对后面要讲解的编辑距离的题目打下基础。 so绕一下&#xff0c;用昨天的● 1143.最…

直排开料机:木工行业的效率革命者

在木工行业中&#xff0c;开料机作为关键的生产设备&#xff0c;其选择直接关系到生产效率和产品质量。近年来&#xff0c;直排开料机以其独特的优势逐渐崭露头角&#xff0c;成为了众多企业的首选。那么&#xff0c;直排开料机究竟有哪些令人瞩目的优势呢&#xff1f; 一、高…

CrossOver24软件免费电脑虚拟机,快速在Mac和Linux上运行Windows软件

当然&#xff0c;除了之前提到的核心技术、兼容性和性能优化外&#xff0c;CrossOver2024还具有其他一些值得关注的性能特点&#xff1a; CrossOver Mac-安装包下载如下&#xff1a;https://wm.makeding.com/iclk/?zoneid50028 CrossOver linux-安装包下载如下&#xff1a;ht…

Spring Cloud Alibab 入门搭建,包含Nacos中心,注册服务发现服务,Feign请求,GateWay网关,sentinel限流

一、安装Nacos注册中心 1.1查看Nacos官网&#xff0c;安装Nacos服务&#xff0c;下载源码或者安装包 1.2启动服务&#xff0c;默认端口为8848&#xff0c; 二、创建服务注册&发现 2.1使用脚手架&#xff0c;创建注册服务和发现服务项目&#xff0c;我用的版本是2.6.13&…

mavros话题订阅后无法触发回调

前提 使用树莓派与pixhawk通信&#xff0c;安装好mavros&#xff0c;树莓派与pixhawk串口连接 启动节点mavros节点后&#xff0c;通过ros2 topic list可以查看到一系列话题 查看话题的类型可以去wiki mavros中查看 或者使用ros2 topic info 话题名称可以查看到 问题描述 订阅…

没有硬件基础可以学单片机吗?

没有硬件基础可以学单片机吗&#xff1f; 在开始前我分享下我的经历&#xff0c;我刚入行时遇到一个好公司和师父&#xff0c;给了我机会&#xff0c;一年时间从3k薪资涨到18k的&#xff0c; 我师父给了一些 电气工程师学习方法和资料&#xff0c;让我不断提升自己&#xff0c…

实验3-单链表

1、现单链表的主要基本操作&#xff0c;并写一个主程序验证&#xff1b; 代码 //1、现单链表的主要基本操作&#xff0c;并写一个主程序验证&#xff1b; #include <iostream> using namespace std; typedef int ElemType; typedef struct LNode{ElemType data;struct …

一.算法基础

目录 1.算法基础 2.算法概念 3.时间复杂度--用来评估算法运行效率的一个式子 如何简单快速的判断算法复杂度? 4.空间复杂度 1.算法基础 2.算法概念 --静态动态 3.时间复杂度--用来评估算法运行效率的一个式子 ----一个单位!!! 1-在什么配置下运行(机器) 2-问题的规模…

头歌-十大经典排序算法

第1关&#xff1a;冒泡排序 任务描述 本关任务&#xff1a;实现冒泡排序算法&#xff0c;并将乱序数列变成升序。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;1.冒泡排序算法。 冒泡排序算法 冒泡排序重复地遍历待排序的数列&#xff0c;每次比较两个相…

①【Docker】Linux安装Docker容器教程

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ ①【Docker】Linux安装Docker容器教程 &#x…

slf4j 打印当前类和方法

spring initializr 自动包含依赖,也可以在 pom.xml 文件中添加 slf4j 的依赖,指定版本 例如我这边默认版本是 1.7.36 通过添加依赖修改版本为 1.7.32<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version…

JavaScript数组sort自定义排序

背景 刷LeetCode时&#xff0c;遇到一道简单的数组排序题&#xff1a; 问题 想着直接用js的数组sort自定义排序即可&#xff0c;奈何测试用例运行总是不通过&#xff0c;返回的一直都是原数组。 代码排查 复制代码到Firefox浏览器控制台运行&#xff0c;结果输出的是正确结果&a…