热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Kubernetes应用部署问题怎么处理

这篇文章主要讲解了“Kubernetes应用部署问题怎么处理”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和

这篇文章主要讲解了“Kubernetes应用部署问题怎么处理”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Kubernetes应用部署问题怎么处理”吧!

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

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

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

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

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

在本文中,以部署的高可用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 命令,查看是否可以拉取镜像。

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/6842pods/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应用部署问题怎么处理”的内容了,经过本文的学习后,相信大家对Kubernetes应用部署问题怎么处理这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程笔记,小编将为大家推送更多相关知识点的文章,欢迎关注!


推荐阅读
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 使用C++编写程序实现增加或删除桌面的右键列表项
    本文介绍了使用C++编写程序实现增加或删除桌面的右键列表项的方法。首先通过操作注册表来实现增加或删除右键列表项的目的,然后使用管理注册表的函数来编写程序。文章详细介绍了使用的五种函数:RegCreateKey、RegSetValueEx、RegOpenKeyEx、RegDeleteKey和RegCloseKey,并给出了增加一项的函数写法。通过本文的方法,可以方便地自定义桌面的右键列表项。 ... [详细]
  • 【Windows】实现微信双开或多开的方法及步骤详解
    本文介绍了在Windows系统下实现微信双开或多开的方法,通过安装微信电脑版、复制微信程序启动路径、修改文本文件为bat文件等步骤,实现同时登录两个或多个微信的效果。相比于使用虚拟机的方法,本方法更简单易行,适用于任何电脑,并且不会消耗过多系统资源。详细步骤和原理解释请参考本文内容。 ... [详细]
  • 解决VS写C#项目导入MySQL数据源报错“You have a usable connection already”问题的正确方法
    本文介绍了在VS写C#项目导入MySQL数据源时出现报错“You have a usable connection already”的问题,并给出了正确的解决方法。详细描述了问题的出现情况和报错信息,并提供了解决该问题的步骤和注意事项。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • phpcomposer 那个中文镜像是不是凉了 ... [详细]
  • MySQL语句大全:创建、授权、查询、修改等【MySQL】的使用方法详解
    本文详细介绍了MySQL语句的使用方法,包括创建用户、授权、查询、修改等操作。通过连接MySQL数据库,可以使用命令创建用户,并指定该用户在哪个主机上可以登录。同时,还可以设置用户的登录密码。通过本文,您可以全面了解MySQL语句的使用方法。 ... [详细]
  • REVERT权限切换的操作步骤和注意事项
    本文介绍了在SQL Server中进行REVERT权限切换的操作步骤和注意事项。首先登录到SQL Server,其中包括一个具有很小权限的普通用户和一个系统管理员角色中的成员。然后通过添加Windows登录到SQL Server,并将其添加到AdventureWorks数据库中的用户列表中。最后通过REVERT命令切换权限。在操作过程中需要注意的是,确保登录名和数据库名的正确性,并遵循安全措施,以防止权限泄露和数据损坏。 ... [详细]
  • Iamtryingtocreateanarrayofstructinstanceslikethis:我试图创建一个这样的struct实例数组:letinstallers: ... [详细]
  • 本文介绍了如何在Azure应用服务实例上获取.NetCore 3.0+的支持。作者分享了自己在将代码升级为使用.NET Core 3.0时遇到的问题,并提供了解决方法。文章还介绍了在部署过程中使用Kudu构建的方法,并指出了可能出现的错误。此外,还介绍了开发者应用服务计划和免费产品应用服务计划在不同地区的运行情况。最后,文章指出了当前的.NET SDK不支持目标为.NET Core 3.0的问题,并提供了解决方案。 ... [详细]
  • 本文介绍了Windows Vista操作系统中的用户账户保护功能,该功能是为了增强系统的安全性而设计的。通过对Vista测试版的体验,可以看到系统在安全性方面的进步。该功能的引入,为用户的账户安全提供了更好的保障。 ... [详细]
  • tcpdump 4.5.1 crash 深入分析
    tcpdump 4.5.1 crash 深入分析 ... [详细]
author-avatar
太姥茶叶论坛_730
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有