Kubernetes-应用部署问题定位和处理

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: 1、应用部署问题处理的整体思路 在将容器化的应用部署到Kubernetes集群中,可能会出现各种问题。根据Kubernetes的架构设计原理,容器化应用对外提供服务出现的主要问题在三个点上: 1)应用本身的问题:此问题为应用本身的问题,不在此文中进行详细的阐述; 2)作为容器化应用逻辑主机的P...

1、应用部署问题处理的整体思路


在将容器化的应用部署到Kubernetes集群中,可能会出现各种问题。根据Kubernetes的架构设计原理,容器化应用对外提供服务出现的主要问题在三个点上:

1)应用本身的问题:此问题为应用本身的问题,不在此文中进行详细的阐述;

2)作为容器化应用逻辑主机的Pod的问题:此部分的问题主要涉及到容器化应用是否在容器云中正常部署和运行,这里会涉及到CPU、内存、存储资源等问题;

3)代理容器化应用服务的问题:第三方服务或用户会通过代理服务访问容器化应用,如果代理服务存在问题,则容器云应用将无法对外提供服务能力,这里会涉及到服务是否存在、DNS解析是否正确等问题。

在本文中,以部署的高可用MySQL(请参考:Kubernetes-部署高可用的MySQL)为例展示如何进行问题定位和处理。另外为了能够在Kubernetes集群外访问MySQL数据库,对外暴露了MySQL master的NodePort类型服务,服务名称为mysql-0-svc。

2、调试Pods

在调试Pod之前,通过kubectl get pods命令查看一下Pod的运行状态。

$ kubectl get pods --namespace=kube-public

对于特定的Pod,可以通过kubectl describe pods命令查看详细的信息。

$ kubectl describe pods/mysql-0 --namespace=kube-public

在Pod的生命周期中,有如下的几个状态:

  • Pending: Pod已经被Kubernetes系统接受,但是还有一个或者多个容器镜像未被创建。这包括Pod正在被调度和从网络上下载镜像的时间。
  • Running: Pod已经被绑定到了一个Node,所有的容器也已经被创建。至少有一个容器已经在运行,或者在启动或者重新启动的过程中。
  • Succeeded: 在Pod中的所有的容器都已经被成功的终止,并且不会再重启。
  • Failed: 在Pod中所有容器都已经被终止,并且至少有一个容器是非正常终止的。即,容器以非零状态退出或者被系统强行终止的。
  • Unknown: 由于某些原因,Pod不能被获取,典型的情况是在与Pod的主机进行通信中发生了失败。
  • Waiting:由于某些原因,Pod已被调度到了Node节点上,但无法正常运行。
  • Crashing:由于某些原因,Pod处于崩溃状态。

根据Pod所处的状态,相应的处理方式不同。

2.1 Pod处于待命(Pending)状态

如果Pod被卡在待命(Pending)状态,则意味着它无法被安排到Node节点上。造成这种情况通常因为某种类型的资源不足,从而导致Pod无法被调度。通过查看kubectl describe …命令的输出内容,应该有为什么Pod无法被调度的原因。这些原因包括:

  • 没有足够的资源:集群中的CPU或内存可能已经耗尽了,在这种情况下,需要删除Pod,调整资源请求或向集群中添加新的Node节点。
  • 正在使用hostPort:将Pod绑定到了数量有限的hostPort。在大多数情况下,没有必要使用hostPort,可以尝试使用服务来暴露Pod。如果确实需要hostPort,那么只能调度与Kubernetes集群中的节点一样多的Pod。

2.2 Pod处于等待(Waiting)状态

如果Pod处于等待(Waiting)状态,则它已被调度到一个工作Node上,但它无法在该Node上运行。同样,通过kubectl describe …应该是能够获取有用的信息。处于等待(Waiting)状态的最常见的原因是无法拉取镜像。有三件事需要检查:

  • 确保镜像名称正确无误。
  • 确认镜像仓库中是否存在此镜像?
  • 在机器上,运行docker pull <image>命令,查看是否可以拉取镜像。

2.3 Pod崩溃(Crashing)或其他不健康

首先,通过执行kubectl logs ${POD_NAME} ${CONTAINER_NAME}查看当前容器的日志:

$ kubectl logs mysql-0 mysql --namespace=kube-public

如果容器之前已崩溃,可以使用以下命令访问上一个容器的崩溃日志:

$ kubectl logs --previous mysql-0 mysql --namespace=kube-public

或者,也可以使用kubectl exec在该容器内运行命令:

$ kubectl exec ${POD_NAME} -c ${CONTAINER_NAME} -- ${CMD} ${ARG1} ${ARG2} ... ${ARGN}

请注意,这-c ${CONTAINER_NAME}是可选的,对于仅包含单个容器的Pod,可以省略。

如果这些方法都不起作用,可以找到运行该pod的主机,并通过SSH连接到该主机。

2.4 Pod正在运行,但没有按照要求执行

如果Pod没有按预期运行,可能是Pod描述中存在错误,并且在创建Pod时忽略了该错误。通常可能是,Pod描述的一部分嵌套不正确,或键名不正确,因此键被忽略。例如,如果拼写错误command,commnd则将创建Pod,但不会按照希望使用命令行。

首先,要做的第一件事是删除此Pod,并尝试使用–validate选项再次创建它。例如,运行kubectl create –validate -f mypod.yaml。如果拼写错误command,commnd那么会出现如下错误:

I0805 10:43:25.129850 46757 schema.go:126] unknown field: commnd
I0805 10:43:25.129973 46757 schema.go:129] this may be a false alarm, see https://github.com/kubernetes/kubernetes/issues/6842
pods/mypod

接下来,要检查的是apiserver上的Pod是否与要创建的Pod相匹配。例如,运行kubectl get pods/mypod -o yaml > mypod-on-apiserver.yaml,然后将原始的Pod描述mypod.yaml与从apiserver返回的描述文件mypod-on-apiserver.yaml进行比较。“apiserver”版本通常会有一些不在原始版本上的内容,这不影响。但是,如果原始版本上有不在apiserver版本上的行,则可能意味着原始版本Pod描述规范存在问题。

3、调试代理服务

根据Kubernetes的架构设计,用户或其它应用通过代理服务访问容器化应用。因此需要通过调试确认代理服务是否正常,需要做的工作包括:

1)检查代理服务本身是否存在;

2)检查代理服务是否能够正常通过DNS进行解析;

3)检查代理服务本身是否正确。

3.1 检查服务是否存在

在调试服务时,第一步要做的就是检查服务是否存在。在本文的前面说明了,在Kubernetes中通过NodePort类型对外暴露了MySQL master。通过执行kubectl get svc命令,可以获取是否存在相应服务:

$ kubectl get svc/mysql-0-svc --namespace=kube-public

通过返回的结果可以看出,在Kubernetes集群中存在此服务。

3.2 能否通过DNS解析正常解析代理服务

对于处于同一个命名空间的容器化应用,可以直接通过代理服务的名称(mysql-0-svc)访问MySQL master。

$ kubectl exec -it redis-ha-redis-ha-sentinel-5947b9569-r2b56 --namespace=kube-public -- nslookup mysql-0-svc

对Kubernetes集群中不同命名空间的容器化应用,则需要通过添加命名空间名称后(mysql-0-svc.kube-public)访问MySQL master:

$ kubectl exec -it gf1-6497d5df45-98g8v -- nslookup mysql-0-svc.kube-public

根据返回的可以看出,通过DNS能够正确的解析代理服务。

3.2.1 DNS是否正常工作

如果通过上述的操作都无法正常解析服务,通过kubectl exec -it ${POD_NAME} — nslookup命令检查一下Kubernetes master是否正常工作:

$ kubectl exec -it gf1-6497d5df45-98g8v -- nslookup kubernetes.default

如果此操作也失败,则需要检查Kubernetes集群中的DNS服务是否正常运行。

3.3 代理服务本身是否正确

如果代理服务也存在,DNS解析也没有问题。则需要检查一下代理服务本身是否有问题:

$ kubectl get service mysql-0-svc -o yaml --namespace=kube-public

例如访问的端口是否正确?targetPort是否指向了正确的Pods端口?这里的端口协议是否与Pod暴露出来的端口协议一致等。

本文转自中文社区-Kubernetes-应用部署问题定位和处理

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
8月前
|
存储 Kubernetes 对象存储
部署DeepSeek但GPU不足,ACK One注册集群助力解决IDC GPU资源不足
借助阿里云ACK One注册集群,充分利用阿里云强大ACS GPU算力,实现DeepSeek推理模型高效部署。
|
7月前
|
存储 Kubernetes 开发工具
使用ArgoCD管理Kubernetes部署指南
ArgoCD 是一款基于 Kubernetes 的声明式 GitOps 持续交付工具,通过自动同步 Git 存储库中的配置与 Kubernetes 集群状态,确保一致性与可靠性。它支持实时同步、声明式设置、自动修复和丰富的用户界面,极大简化了复杂应用的部署管理。结合 Helm Charts,ArgoCD 提供模块化、可重用的部署流程,显著减少人工开销和配置错误。对于云原生企业,ArgoCD 能优化部署策略,提升效率与安全性,是实现自动化与一致性的理想选择。
335 0
|
6月前
|
存储 Kubernetes 异构计算
Qwen3 大模型在阿里云容器服务上的极简部署教程
通义千问 Qwen3 是 Qwen 系列最新推出的首个混合推理模型,其在代码、数学、通用能力等基准测试中,与 DeepSeek-R1、o1、o3-mini、Grok-3 和 Gemini-2.5-Pro 等顶级模型相比,表现出极具竞争力的结果。
|
7月前
|
存储 Kubernetes 监控
K8s集群实战:使用kubeadm和kuboard部署Kubernetes集群
总之,使用kubeadm和kuboard部署K8s集群就像回归童年一样,简单又有趣。不要忘记,技术是为人服务的,用K8s集群操控云端资源,我们不过是想在复杂的世界找寻简单。尽管部署过程可能遇到困难,但朝着简化复杂的目标,我们就能找到意义和乐趣。希望你也能利用这些工具,找到你的乐趣,满足你的需求。
643 33
|
7月前
|
Kubernetes 开发者 Docker
集群部署:使用Rancher部署Kubernetes集群。
以上就是使用 Rancher 部署 Kubernetes 集群的流程。使用 Rancher 和 Kubernetes,开发者可以受益于灵活性和可扩展性,允许他们在多种环境中运行多种应用,同时利用自动化工具使工作负载更加高效。
371 19
|
7月前
|
存储 测试技术 对象存储
使用容器服务ACK快速部署QwQ-32B模型并实现推理智能路由
阿里云最新发布的QwQ-32B模型,通过强化学习大幅度提升了模型推理能力。QwQ-32B模型拥有320亿参数,其性能可以与DeepSeek-R1 671B媲美。
|
8月前
|
存储 Kubernetes 测试技术
企业级LLM推理部署新范式:基于ACK的DeepSeek蒸馏模型生产环境落地指南
企业级LLM推理部署新范式:基于ACK的DeepSeek蒸馏模型生产环境落地指南
322 12
|
8月前
|
人工智能 Kubernetes 异构计算
大道至简-基于ACK的Deepseek满血版分布式推理部署实战
大道至简-基于ACK的Deepseek满血版分布式推理部署实战
402 5
|
8月前
|
边缘计算 调度 对象存储
部署DeepSeek但IDC GPU不足,阿里云ACK Edge虚拟节点来帮忙
介绍如何使用ACK Edge与虚拟节点满足DeepSeek部署的弹性需求。
|
8月前
|
存储 Kubernetes 对象存储
部署DeepSeek但GPU不足,ACK One注册集群助力解决IDC GPU资源不足
部署DeepSeek但GPU不足,ACK One注册集群助力解决IDC GPU资源不足
183 3

推荐镜像

更多