生产环境中应用程序的监控与故障排除
1. 监控与告警
在生产环境中,创建并配置好告警机制后,服务人员无需再主动监控系统,可开展其他工作。一旦出现重大或异常情况,他们会及时得到通知并作出响应。
2. 运行手册(Runbooks)
当警报响起时,运行手册能发挥重要作用。它会为每个警报明确以下内容:
- 必须通知的人员。
- 此人应采取的解决潜在问题的措施。
- 若问题无法解决,应将问题升级到的对象。
运行手册的创建是一个复杂的过程,不能掉以轻心,但它对企业而言是至关重要的工具。例如,在在线商店场景中,如果支付服务提供商(PSP)故障,导致无法处理支付,这意味着应用程序缺少了关键功能,首席技术官(CTO)就应该知晓此事。
3. 生产环境中服务的故障排除
在生产环境中,建议创建仅包含必要内容的最小化镜像,避免包含不必要的调试和故障排除工具。理想情况下,生产系统的集群节点仅安装容器编排软件(如Kubernetes)和最小化操作系统(如CoreOS),应用容器也仅包含运行所需的二进制文件。这样做可以减少攻击面和处理漏洞的风险,同时小镜像还具有下载速度快、占用磁盘和内存空间少、启动时间短等优点。
然而,当Kubernetes集群上的应用服务出现意外行为甚至崩溃时,仅依靠日志可能无法找到问题的根本原因,需要在集群节点上进行故障排除。但直接SSH到集群节点并运行诊断工具是不可行的,因为集群节点运行的是最小化Linux发行版,未安装这些工具。而且,让开发人员直接访问生产集群节点也不是好主意,这可能引入潜在的易受攻击软件,危及其他Pod,甚至可能被黑客利用。
更好的解决方案是让集群管理员为开发人员运行所谓的堡垒容器(bastion container)。这个堡垒容器或故障排除容器安装了定位应用服务中错误根本原因所需的所有工具,还可以在主机的网络命名空间中运行,从而可以完全访问容器主机的所有网络流量。
4. netshoot容器
前Docker员工Nicola Kabar创建了一个方便的Docker镜像
nicolaka/netshoot
,Docker的现场工程师经常使用它来排除在Kubernetes或Docker Swarm上运行的生产应用程序的故障。该容器的目的是帮助解决Docker和Kubernetes网络故障,它包含了一系列强大的网络故障排除工具。
使用该容器进行调试的步骤如下:
1. 使用以下命令在Kubernetes上启动一个临时的堡垒容器进行调试:
$ kubectl run tmp-shell --rm -i --tty \
--image nicolaka/netshoot
启动后会出现如下提示:
bash-5.0#
-
在容器内使用工具,例如
ip命令:
bash-5.0# ip a
在Docker Desktop上运行该Pod时,输出类似于以下内容:
3. 要离开这个故障排除容器,只需按下
Ctrl + D
或输入
exit
并回车。
4. 如果需要更深入地排查,让容器在与Kubernetes主机相同的网络命名空间中运行,可以使用以下命令:
$ kubectl run tmp-shell --rm -i --tty \
--overrides='{"spec": {"hostNetwork": true}}' \
--image nicolaka/netshoot
-
在这个容器中再次运行
ip命令,将看到容器主机所看到的所有内容,例如所有的veth端点。
netshoot
容器安装了工程师排除网络相关问题所需的常用工具,如
ctop
、
curl
、
dhcping
、
drill
、
ethtool
、
iftop
、
iperf
和
iproute2
等。
5. 常见问题解答
以下是一些常见问题及解答:
| 问题 | 解答 |
| — | — |
| 为什么对应用服务进行检测很重要? | 出于性能和安全原因,无法在生产系统上进行实时调试。但应用服务可能因代码缺陷、网络故障或外部服务不可用等问题出现意外行为。为快速找出服务故障或异常的原因,需要尽可能多的日志信息,对服务进行检测可以产生合理的日志条目和发布的指标信息。 |
| 能否向感兴趣的外行解释什么是Prometheus? | Prometheus是一个用于收集其他基础设施服务(尤其是应用服务)提供的功能或非功能指标的服务。它会定期从所有配置的服务中拉取这些指标,服务本身无需担心数据发送。Prometheus还定义了生产者呈现指标的格式。 |
| 如何为Node.js应用导出Prometheus指标? | 要检测基于Node.js的应用服务,需要采取以下四个步骤:
I. 向项目中添加Prometheus适配器,推荐使用
siimon/prom-client
库。
II. 在应用启动时配置Prometheus客户端,包括定义指标注册表。
III. 暴露一个HTTP GET端点
/metrics
,返回指标注册表中定义的指标集合。
IV. 定义计数器、仪表或直方图类型的自定义指标,并在代码中使用它们,例如每次调用某个端点时增加计数器类型的指标。 |
| 需要调试在Kubernetes生产环境中运行的服务,仅靠服务产生的日志无法确定根本原因,如何在Kubernetes集群节点上进行故障排除? | 通常,生产环境中的Kubernetes集群节点仅包含最小化操作系统,以减少攻击面和节省资源。因此,不能假设主机上有用于故障排除的工具。推荐的方法是运行一个特殊的工具或故障排除容器作为临时Pod,许多Docker现场工程师成功使用的容器是
nicolaka/netshoot
。 |
6. 容器和镜像相关知识
-
容器
:容器是一种轻量级的虚拟化技术,具有诸多优点。它的架构基于Linux命名空间和控制组(cgroups),可以实现资源隔离和限制。容器镜像采用分层文件系统,使用写时复制(copy-on-write)机制,具有高效的存储和管理特性。
- 容器的操作 :可以对容器进行创建、启动、停止、删除等操作,还可以在现有网络命名空间中运行容器,避免以root身份运行容器以提高安全性。
- 容器日志 :容器日志的管理包括日志驱动的配置、过滤和告警机制的设置、旋转和保留策略的配置等。可以使用ELK Stack等工具进行集中管理和可视化。
- 镜像 :镜像的创建可以使用Dockerfile,遵循最佳实践,如多阶段构建等。镜像可以存储在镜像注册表中,方便共享和分发。
7. 应用部署和更新
- 部署到Kubernetes :在Kubernetes中部署应用包括部署数据库和Web组件等步骤,可以使用Kubernetes的Deployment、ReplicaSet和Service等资源对象来实现。还可以通过配置Prometheus和Grafana来监控应用。
- 部署到Docker Swarm :在Docker Swarm中部署应用需要创建服务、管理堆栈等操作,还可以进行负载均衡测试和零停机部署等。
- 应用更新策略 :应用更新可以采用蓝绿部署、金丝雀发布、滚动更新等策略,根据实际情况选择合适的策略可以减少更新对业务的影响。
8. 网络和路由
- 网络模型 :包括容器网络模型(CNM)和Kubernetes网络模型,理解这些模型有助于进行网络配置和故障排除。
- 路由 :可以使用反向代理(如Traefik)进行HTTP级路由,实现微服务的提取和流量重定向。
9. 自动化测试
自动化测试相对于手动测试具有更高的效率和准确性。常见的测试类型包括单元测试、集成测试、验收测试等,可以使用Arrange - Act - Assert(AAA)等模式进行测试实现。
10. 安全和机密管理
- 安全措施 :包括网络防火墙、角色基于访问控制(RBAC)、内容信任等,保障系统的安全性。
- 机密管理 :可以使用Docker机密和Kubernetes机密来保护敏感数据,对机密进行创建、更新和使用等操作。
通过以上内容,我们可以全面了解生产环境中应用程序的监控、故障排除、部署、更新、网络、测试和安全等方面的知识和技术,为构建和管理现代应用提供有力的支持。
生产环境中应用程序的监控与故障排除
11. 分布式应用架构
分布式应用架构具有多个关键特性,以确保系统的高效性、稳定性和可扩展性。以下是其主要组成部分:
-
松散耦合组件
:各个组件之间相互独立,一个组件的变化不会对其他组件产生重大影响,便于系统的维护和扩展。
-
服务发现
:能够自动发现和定位系统中的服务,确保服务之间的通信顺畅。例如,通过DNS服务实现服务发现。
-
负载均衡
:将请求均匀地分配到多个服务实例上,避免单个服务过载,提高系统的性能和可用性。常见的负载均衡算法有轮询(round - robin)等。
-
电路断路器模式
:当服务出现故障时,能够快速切断请求,避免故障的扩散。该模式还包括批量头(bulkhead)和速率限制器(rate limiter)等机制。
-
健康检查
:定期检查服务的健康状态,确保服务正常运行。
下面是一个简单的分布式应用架构的mermaid流程图:
graph LR
A[客户端] --> B[负载均衡器]
B --> C1[服务实例1]
B --> C2[服务实例2]
B --> C3[服务实例3]
C1 --> D[数据库]
C2 --> D
C3 --> D
E[服务发现系统] --> C1
E --> C2
E --> C3
12. 运行环境和工具
- 开发环境 :可以使用容器来运行开发环境,例如使用Dev容器。这样可以确保开发环境的一致性,避免因环境差异导致的问题。
-
工具安装
:在不同的操作系统上安装相关工具,如在macOS上使用Homebrew安装minikube,在Windows上使用Chocolatey安装相关软件。
| 操作系统 | 工具 | 安装方式 |
| — | — | — |
| macOS | Homebrew | 通过安装链接进行安装 |
| macOS | minikube | 使用Homebrew安装 |
| Windows | Chocolatey | 按照特定步骤安装 |
| Windows | Docker for Desktop | 从官方渠道安装 |
13. 编排器相关
- 编排器的需求 :随着容器数量的增加,需要编排器来管理容器的部署、调度和扩展。编排器的主要任务包括亲和性和位置感知、数据持久化、期望状态协调、全局服务管理、负载均衡、复制服务管理、路由、扩展、安全和自我修复等。
-
常见编排器
:
- Kubernetes :是一个广泛使用的容器编排平台,具有高可用性、可扩展性和自我修复能力。它的架构包括控制平面和工作节点,通过Deployment、ReplicaSet和Service等资源对象来管理应用。
- Docker Swarm :是Docker原生的编排工具,易于使用和部署。可以创建本地单节点Swarm或在云端创建Swarm,实现服务的部署和管理。
- 其他编排器 :如Apache Mesos、Amazon ECS等,各有其特点和适用场景。
14. 日志和监控的重要性
日志和监控在系统中具有重要意义,它们可以帮助我们及时发现系统中的问题,确保系统的稳定运行。
-
日志管理
:通过配置日志驱动、设置过滤和告警机制、配置旋转和保留策略等方式,对容器日志进行有效的管理。可以使用ELK Stack(Elasticsearch、Logstash和Kibana)等工具进行集中管理和可视化。
-
监控指标
:收集和分析功能和非功能指标,如CPU使用率、内存使用率、请求响应时间等。可以使用Prometheus和Grafana等工具进行指标的收集和可视化。
15. 安全相关措施
- 网络安全 :使用网络防火墙、软件定义网络(SDN)等技术,保障网络的安全性。避免使用不安全的网络配置,如主机网络模式可能存在的安全风险。
- 身份验证和授权 :采用角色基于访问控制(RBAC)等机制,确保只有授权的用户和服务能够访问系统资源。
- 内容信任 :通过内容信任机制,确保镜像的完整性和安全性,防止恶意镜像的使用。
16. 故障排除的最佳实践
-
使用专门的容器
:如前面提到的
nicolaka/netshoot容器,在生产环境中进行故障排除时非常有用。它包含了各种网络故障排除工具,可以帮助我们快速定位问题。 - 避免直接访问生产节点 :为了安全起见,尽量避免让开发人员直接访问生产集群节点。可以通过运行特殊的堡垒容器来进行故障排除。
- 利用日志和监控数据 :仔细分析日志和监控数据,从中找出问题的线索。可以设置告警规则,及时发现异常情况。
17. 总结
通过对生产环境中应用程序的监控、故障排除、部署、更新、网络、测试和安全等方面的全面了解,我们可以更好地构建和管理现代应用。在实际应用中,需要根据具体的业务需求和场景,选择合适的技术和工具,遵循最佳实践,确保系统的高效性、稳定性和安全性。同时,不断学习和掌握新的技术和方法,以应对不断变化的挑战。
以上内容涵盖了生产环境中应用程序相关的多个重要方面,为我们提供了一套完整的技术体系和实践指南,帮助我们在实际工作中更好地处理各种问题。
超级会员免费看
17万+

被折叠的 条评论
为什么被折叠?



