K8s不再是好选择?可能是这9个核心问题没悟透!

指尖上的架构 2024-10-09 02:45:06

、Kubeadm VS kubernetes 二进制

1.kubeadm 方式部署(推荐)

推荐理由:

官方推荐:kubeadm 是 Kubernetes 官方提供的工具,用于快速搭建生产级别的 Kubernetes 集群,尤其适合于初次部署和对集群稳定性要求较高的场景。简化部署:kubeadm 自动处理了大量的初始化步骤,包括证书生成、网络配置、Pod 网络插件安装等,大大减少了手动操作和潜在错误。一致性:只要集群遵循最佳实践和官方规范,就易于维护和升级。可扩展性:适用于从小规模到大规模集群的部署,支持 HA(高可用)配置。社区支持:有丰富的文档和社区支持,便于排查问题和获取最新更新。易于集成:对于集成自动化工具 Ansible 更加容易,也方便集成到公司运管平台。

2.Kubernetes 二进制文件部署

适用场景:

完全手动控制:如果小伙伴们希望对每个组件的安装细节有完全的掌控权,比如在某些特殊环境中无法或不愿意使用自动化工具时。定制化需求:可能有一些特殊的网络配置、安全策略或其他自定义需求,需要逐一手动配置。学习和理解原理:对于想深入了解 Kubernetes 内部工作原理的人来说,手动部署有助于更好地理解各个组件之间的交互和依赖关系。

注意:

二进制文件部署方式虽然更为灵活,但也意味着更高的复杂性和出错风险,特别是对于大型集群或多节点高可用配置。维护和升级过程也相对繁琐,需要手动执行一系列命令来更新各个组件。除非有特定需求或学习目的,一般情况下,对于生产环境的部署,建议使用 kubeadm,因为它能提供更稳定、便捷且符合标准的操作流程。而对于想要深入学习 Kubernetes 架构时,可以选择二进制文件部署方式来了解集群内部构造。

二、集群网络组件的选择

在 Kubernetes 集群中,选择合适的网络解决方案非常重要,因为它们负责提供跨节点容器间的服务发现、通信以及网络策略实施等功能。

1.Flannel

推荐理由:

简单易用:Flannel设计简洁,易于安装和配置,特别适合于初学者和小型集群。跨主机通信:它通过在集群内分配一个扁平化的IP地址空间来保证每个 Pod 都有一个唯一的IP地址,从而使得 Pod 之间可以直接通信。支持多种后端:包括 VXLAN、Host-Gateway 2种模式,可根据底层网络基础设施灵活选择。

局限性:

功能相对有限:相较于 Calico,Flannel 在网络策略方面的功能较弱,不提供精细化的网络策略控制。

2.Calico

推荐理由:

精细化网络策略:Calico 提供了强大的网络策略管理和实施能力,可以精确控制 Pod 间的流量。性能优越:由于其基于 BGP 协议,数据路径效率较高,特别适合大规模集群和对性能敏感的应用场景。安全性:除了网络策略,Calico 还支持网络隔离、微分段等高级安全特性。多云兼容:能够很好地适应公有云、私有云和混合云环境。

复杂度:

Calico 的配置和维护相比 Flannel 来说稍微复杂一些,尤其是涉及到 BGP 路由配置时。

3.CNI 网络方案优缺点及最终选择

至于怎么选择,我觉得需要先考虑几个问题,结合自己的业务场景去做应用:

需要细粒度网络访问控制?--> flannel不支持,calico支持(ACL);追求网络性能?--> flannel(host-gw),calico(BGP);当前架构下是否可以跑BGP协议?--> 公有云有些不支持;集群规模多大?--> 100台node左右推荐(flannel,host-gw)维护方便;是否有维护能力?--> calico维护复杂,路由表!

三、持久化存储

在 Kubernetes 集群中选择持久化存储方案时,需要考虑的因素还是蛮多的。不考虑外在因素,要看咱们整个团队或负责这块的同事是否专业于这块技术栈,记住,公司最宝贵的资源永远是数据(勿喷),下面我来通过几个不同的维度来分析下能够满足且可挑选的几个存储解决方案:

1.成本

NFS:一种成熟且广泛应用的网络文件系统,对于已有NAS设备的企业,利用NFS作为持久化存储是一种低成本的选择,只需安装NFS客户端和服务端即可。CEPH:开源分布式存储系统,提供块存储(RBD)、文件系统(CephFS)和对象存储(RGW)。在集群规模较大、预算充足且希望利用硬件冗余提高数据安全性的场景下,CEPH是性价比较高的选择,因其可水平扩展并提供高可用性。MiniO(MinIO):是一款开源的对象存储系统,对于需要大量非结构化数据存储,如图片、视频、日志等,MiniO可以作为S3兼容的对象存储服务,成本较低,且易于部署和管理。

2.性能与扩展性

NFS:性能受网络状况影响较大,不适合大规模并发读写或高 I/O 密集型应用。CEPH:具备优秀的扩展性和性能优化,适合大数据分析、数据库存储等高性能应用场景。MiniO:适合大规模对象存储场景,性能表现良好,尤其是在读写对象而非文件级别的操作上有优势。

3.数据可靠性与安全性

NFS:数据可靠性依赖于 NFS 服务器的稳定性和备份策略,安全性可通过权限管理增强。CEPH:提供副本集、纠删码等机制保证数据高可用性和容灾能力,自带加密选项以增加安全性。MiniO:支持多节点分布和纠删码,可提供企业级数据保护,同时也支持多种加密手段。

4.Kubernetes集成程度

NFS:Kubernetes 可以通过 PV/PVC 和 StorageClass 支持 NFS,基于原生的动态供应功能,省时省力。CEPH:提供 CSI(Container Storage Interface)驱动,支持动态存储类和持久卷的动态供应,无缝集成到Kubernetes生态系统中。MiniO:也有相应的 CSI 插件,可以作为 Kubernetes 的持久化存储,同样支持动态卷供应。

5.运维难度与社区支持

NFS:配置相对简单,但其设计原理基于网络文件系统,可能存在一定的性能挑战。CEPH:配置较为复杂,但因其广泛采用和活跃的社区,有大量的文档和案例可供参考。MiniO:相比之下,部署和运维较为简便,社区活跃,且有详细的 Kubernetes 集成指南。

总结

若追求成本效益和快速部署,小型集群或非关键任务可选用 NFS;对于大规模集群、需要高可用性和高性能存储,CEPH 是理想之选;若侧重于非结构化数据的长期存储和分发,MiniO 是一个出色的对象存储解决方案。还是那句话,不是我不给大家结论,实在是考量的因素有点多。在实际应用中,还需要结合企业内部的IT基础设施现状、运维能力以及未来的扩容计划做出决策。

四、是否 Helm 可作为线上应用管理工具

这个我可以先给大家一个结论,我们作为一家某个行业内的互联网龙头企业,整个业务链都是基于 Helm 作为线上应用管理工具使用的。

另外 Helm 在云原生领域中得到了广泛的采纳和认可。我来通过如下几点来给大家聊下 Helm 在线上应用管理中的适用性:

简化部署与升级:Helm 提供了统一的、声明式的部署方式,允许通过简单的命令行工具即可安装、升级和删除复杂的 Kubernetes 应用。线上应用的生命周期管理变得更加高效和可靠。

版本控制与回滚:Helm 采用了 Chart 的概念,包含了应用的所有YAML资源配置以及依赖关系,支持版本管理和应用历史记录。咱们可以轻易地对线上应用进行版本升级和回滚,这对于应对线上故障恢复和版本迭代尤为关键。

标准化与复用:Helm Chart 作为一种标准化的包格式,允许应用开发者封装应用及其依赖项,形成可重复使用和共享的软件包。这有利于组织内部的标准化管理,也方便与其他开发者分享和交流。

配置管理:Helm 允许通过 Values.yaml 文件进行参数化配置,使得同一 Chart 可以根据不同的环境变量和配置参数进行部署,满足线上环境多样化的配置需求。

安全性与审计:Helm 通过数字签名和验证机制增强了应用的安全性,同时每一次的部署变更都可通过 Helm 的历史记录来进行审计跟踪。

生态丰富:Helm 拥有庞大的社区支持和丰富的软件仓库,许多流行的 Kubernetes 应用都有对应的官方或社区维护的 Chart,极大地方便了线上应用的管理。

我们当前的团队小伙伴们,每个人负责几个业务线,同时大家会根据当前所负责的业务属性不定期开发、优化、迭代某类应用的 Charts 包,这样对于 DEV 和 OPS 的衔接更加的密切,从而更加了解线上应用的状态和配置。

另外,无论是从简化运维、保障应用一致性还是提高团队协作效率的角度来看,Helm 都是线上 Kubernetes 应用管理的理想选择。通过使用 Helm,运维人员能够更好地聚焦于应用本身的服务质量和业务发展,而不必花费过多精力在基础设施的复杂部署流程上。

五、CICD 工具的选择

在 Kubernetes 技术栈中,CICD 这个话题,大家正确看待就好了,不要总是听别人说,每个技术栈的发展和应用都有各自的优势,Jenkins 发展至今,难道就通过 kubernetes 某些层面直接否定?不现实的。我们企业仍然是基于 Jenkins 贯穿整个 CICD 的上线流程,而且没有遇到多少因为自身瓶颈卡脖子的问题,虽然业界有些软件与 kubernetes 的匹配度较高,但是真的适用你们企业的?还是通过几个维度来做个分析吧。

1.集成与兼容性

Jenkins:是最老牌的持续集成工具之一,通过 Kubernetes 插件可以非常好地与 K8s 集成,能够在 Kubernetes 集群中创建 Jenkins Slave Pod 实现弹性伸缩和资源优化。同时,Jenkins 有着丰富的插件生态,可以与各种 Git 仓库、Harbor、以及 Kubernetes 自身的 API 进行深度集成。

ArgoCD:专注于 Continuous Delivery(CD),作为 Kubernetes 的原生 CD 工具,它充分利用了 K8s 的声明式 API 对象(如 YAML 文件)来实现应用的部署和管理。ArgoCD 强调 GitOps 模式,将 Kubernetes 应用的整个生命周期管理与 Git 版本控制系统紧密绑定,支持自动同步和差异检测。

GitLab CI/CD:GitLab 自带了一整套完整的 CI/CD 工具链,不仅限于构建、测试和部署,还包括从代码托管、静态代码分析、安全扫描到制品库管理等多个环节。GitLab CI/CD 支持与 Kubernetes 集成,可以轻松地将应用部署到 Kubernetes 集群,并提供了一系列预设的 Kubernetes 部署模板。

2.易用性与学习曲线

Jenkins:高度可定制,但这也意味着学习和配置成本相对较高,对于复杂场景非常灵活,但对于初级用户可能需要更多时间去理解和掌握。

ArgoCD:侧重于应用部署和管理,概念清晰,对于熟悉 Kubernetes 的 DevOps 团队而言,学习曲线相对较平缓,易于上手。

GitLab CI/CD:因集成在 GitLab 平台中,所以对于已经使用 GitLab 的团队来说,其 CI/CD 流程的配置非常直观,YAML 配置文件 (gitlab-ci.yml) 易于编写和维护,同时提供了图形化界面辅助配置和监控。

3.自动化与扩展性

Jenkins:通过编写 Groovy 脚本和使用各种插件,几乎可以实现任何形式的自动化流程,但有时需要手工维护这些脚本和配置。

ArgoCD:专注于 Kubernetes 应用的自动化部署和运维,支持蓝绿部署、滚动更新、灰度发布等高级策略,通过 GitOps 模式实现了持续部署的自动化循环。

GitLab CI/CD:内置了众多自动化阶段,支持流水线的可视化编排,且由于与 GitLab 无缝衔接,可以轻松实现从代码提交到上线的完整自动化流程。

4.社区支持与生态

Jenkins:有庞大的社区支持,积累了大量的插件和教程,遇到问题容易找到解决方案。ArgoCD:随着 GitOps 理念的流行,ArgoCD 社区也在迅速壮大,尤其是在 Kubernetes 生态圈内,得到了广泛的认可和支持。GitLab CI/CD:作为一体化 DevOps 平台的一部分,GitLab CI/CD 依托 GitLab 社区的强大实力,拥有活跃的开发者和使用者群体。

当然还有几款大家在用的 CICD,就不一一评价了。

对于 Kubernetes 集群的 CI/CD 工具选择,如果是成熟的团队、需要高度定制化流程,并且已经有 Jenkins 使用经验,那么继续使用 Jenkins 并配合 Kubernetes 插件是个不错的选择;

如果希望拥抱 GitOps,简化应用部署和管理流程,ArgoCD 是一个很好的选择;

而对于希望在一个平台上完成全流程 DevOps 工作流,并且重视与代码版本管理紧密集成的团队,GitLab CI/CD 提供了一站式解决方案。

另外,在实际运用中,往往会选择组合使用这些工具,比如 Jenkins 或 GitLab CI/CD 负责 CI 部分,然后使用 ArgoCD 负责 CD 部分,以实现最佳效果。

六、集群应用网关

在 Kubernetes 技术栈中,选择集群应用网关(Ingress Controller)是一项重要的决定,不同的 Ingress Controller 工具各有优劣,我选择了几个较为热门的网关,从几个重要维度对比一下 ingress-nginx、nginx-ingress、APISIX 和 Kong。

1.功能完备性

Ingress-nginx:基于 Nginx 实现,由 Kubernetes 社区积极维护开源,提供基本的 Ingress 功能,包括 HTTP(S) 路由、TLS 终止、重写规则等,对于常规需求有足够的支持,但相比于其他工具可能在高级特性上略显不足。Nginx-ingress-controller:也是基于 Nginx,老牌负载均衡器,拥有更丰富的特性集,支持 Path 重写、Session 亲和性、全局速率限制等,更适合复杂的应用场景。APISIX:是云原生的API网关,除了基本的 Ingress 功能外,还提供了更多的高级特性,如金丝雀发布、蓝绿部署、服务熔断、JWT认证、ACL等,特别适合微服务架构和 API 管理。Kong:作为一款知名且成熟的 API 网关,除了 Ingress 的基本功能外,还有强大的插件系统支持,可以实现身份认证、限流、日志、监控等各种功能,非常适合企业级和大规模部署。

2.性能与扩展性

Ingress-nginx:由于直接基于Nginx,性能优异,但扩展性依赖于额外开发或配置。Nginx-ingress-controller:同样基于 Nginx,性能优秀,并且支持水平扩展和HA部署。APISIX:性能表现优秀,通过异步非阻塞模型实现高并发处理,且具备较好的扩展性和可插拔性。Kong:以其性能见长,通过 Lua 插件系统实现高效扩展,支持大型集群部署和高可用架构。

3.易用性与社区支持

Ingress-nginx:由 Kubernetes 社区发起并开源的一个项目,旨在为 Kubernetes 提供一个官方支持的 Ingress 控制器实现。Nginx-ingress-controller:由 NGINX 官方社区发起并开源,专门针对 Kubernetes 平台开发,为用户提供了一个专业、稳定的 Ingress 解决方案。APISIX:中国开源项目,有中文社区支持,文档完善,社区活跃度高,且逐渐在全球范围内获得广泛关注。Kong:国际知名的API网关项目,有丰富的文档和活跃的全球社区,商业支持也相当成熟。

4.云原生与集成

Ingress-nginx 和 Nginx-ingress-controller:均较好地支持 Kubernetes 环境,但可能在服务网格和云原生服务治理方面不如 APISIX 和 Kong。APISIX:原生支持云环境,整合了服务网格概念,与 Kubernetes 生态融合度高,且可与 Linkerd、Istio 等服务网格协同工作。Kong:不仅可以作为 Kubernetes Ingress Controller,还支持多云和混合云环境,可以与云服务商提供的服务如 AWS Lambda 等深度集成。

Ingress-nginx 更注重与 Kubernetes 生态系统的紧密集成和功能扩展,而 NGINX Ingress Controller 则强调与 Nginx 产品的原生集成、稳定性以及官方支持的优势。在实际使用中,用户可以根据自身对 Kubernetes 集成深度的需求、对 Nginx 功能扩展的要求以及对官方支持和长期维护的关注程度,来选择适合自己的 Ingress 控制器方案。

对于特别依赖或微服务架构下需要更强大 API 管理功能的场景,APISIX 和 Kong 则提供了更多的增值功能。APISIX 更适合寻求国产自主可控、高度集成Kubernetes 生态、追求高性能和灵活扩展的团队。而 Kong 则在国际化支持、企业级 API 管理、与多种云服务集成等方面表现出色,适合全球化运营和技术要求更高的组织。

选择哪种工具,应根据具体业务需求、团队技能、技术支持以及未来发展规划来综合评估。

七、监控平台解决方案

Zabbix 和 Prometheus 是两种广泛应用的监控解决方案,它们各自具有独特的特性和适用场景。接下来,我将对二者进行对比,并重点阐述 Prometheus 在 Kubernetes 上的优势,以及 Prometheus 与 Prometheus Operator 的区别和介绍。

1.Zabbix VS Prometheus

Zabbix 是一个传统的监控系统,提供丰富的监控功能,包括自动发现、阈值警告、图表展示等,支持多种类型的数据采集,如系统性能、网络流量、数据库状态等。Zabbix 的配置相对传统,依赖于中央服务器架构,虽然也能监控 Kubernetes,但并不原生支持 Kubernetes 的声明式和动态资源管理模式。

Prometheus 是专为云原生环境设计的监控和警报系统,尤其在 Kubernetes 环境下表现卓越。Prometheus 采用 Pull/Push 模型抓取监控数据,支持多维度数据模型,具有强大的查询语言 PromQL,可进行灵活的数据聚合和分析。Prometheus 通过 ServiceMonitor CRD (自定义资源定义)可以自动发现并监控 Kubernetes 中的服务和 Pod,完美契合 Kubernetes 的声明式理念。

2.Prometheus 在 Kubernetes 上的优势

原生集成:Prometheus 与 Kubernetes 有深度集成,通过 Prometheus Operator 可以自动发现和监控 Kubernetes 中的资源,无需手动配置监控目标。

声明式监控:Prometheus 通过 ServiceMonitor、PodMonitor 等 CRD 实现监控配置的声明式管理,符合 Kubernetes 的管理范式,简化了监控配置的复杂性。

Prometheus 丰富生态:Prometheus 生态圈包括 Grafana(数据可视化)、Alertmanager(警报管理)、 exporters(各类监控指标收集器)等工具,共同形成了强大的云原生监控解决方案。

灵活查询与告警:PromQL 提供了灵活的监控指标查询和聚合功能,以及强大的告警规则定义能力,能够满足复杂场景下的监控需求。

3.Prometheus VS Prometheus Operator

Prometheus:本身是一个独立的监控系统,用于收集和存储时间序列数据,并通过查询引擎进行数据分析和告警触发。

Prometheus Operator:是为了在 Kubernetes 上更方便地管理和部署 Prometheus 监控系统而设计的。它通过 Custom Resource Definitions(CRDs)将 Prometheus 监控相关的配置转化为 Kubernetes 对象,使得 Prometheus 的部署和管理变得更符合 Kubernetes 的管理风格。

优势在于,Prometheus Operator 提供了以下核心功能:

简化部署和管理:通过 Operator 创建和管理 Prometheus Server、Alertmanager、ServiceMonitor 和其他 CRDs,简化了部署过程,提高了配置的一致性和可维护性。声明式配置:通过 CRDs 实现监控目标的声明式配置,自动发现和监控 Kubernetes 集群中的服务。高可用与扩展性:可以方便地创建高可用的 Prometheus 集群,并支持水平扩展。

至此,随着当前技术栈的不停迭代和发展,在 Kubernetes 环境下,Prometheus 凭借其与 Kubernetes 的紧密集成、声明式配置以及强大的生态系统,成为越来越多企业的首选监控方案。而 Prometheus Operator 进一步提升了 Prometheus 在 Kubernetes 上的易用性和可靠性,使大规模集群监控更加得心应手。

八、可观察性的抉择

在 Kubernetes 技术栈中,选择可观测性(Observability)和 APM(Application Performance Monitoring,应用性能监控)工具是非常关键的,这有助于提升系统的可运维性和故障排查效率。

SkyWalking 和 OpenTelemetry 是目前市场上备受关注的两款工具,它们分别从不同角度提供可观测性支持,下面从多个维度对比和推荐:

1.功能特性

SkyWalking:是一款应用性能监视系统,专注于服务网格、微服务和云原生环境的可观测性,提供了服务拓扑发现、分布式追踪、性能指标监控、告警和诊断等功能。SkyWalking 支持多种语言 SDK,并有与 Kubernetes 集成的良好支持,可以方便地监控部署在 Kubernetes 上的应用程序。

OpenTelemetry:是一个开放标准的可观测性数据收集、传输和导出框架,旨在统一行业内各种监控和追踪工具的数据格式。OpenTelemetry 提供了统一的 SDK 用于在多种编程语言中产生遥测数据,包括 traces、metrics 和 logs,并支持将数据发送至多种后端分析和存储系统,如 Jaeger、Zipkin、Prometheus 和 SkyWalking 等。

2.开箱即用程度

SkyWalking:提供了一站式的解决方案,自带 UI 界面,易于部署和快速启用,尤其对于 Apache APISIX、Spring Boot、Java、Go 等语言和框架支持良好。

OpenTelemetry:作为一套标准和 SDK,本身并未提供完整的 UI 和数据存储分析组件,但它提供了广泛的适配器,可以与很多已有的 APM 和可观测性工具对接,用户需要选择合适的后端存储和分析工具。

3.生态与兼容性

SkyWalking:有着丰富的生态,但主要是围绕其自身的体系构建,兼容性体现在支持多种语言和框架的探针上。

OpenTelemetry:生态更为广阔,由于是 CNCF 项目,已被业界广泛接受和采纳,几乎所有的主流云服务商和 APM 工具都在支持 OpenTelemetry 标准,这使得数据可以更容易地迁移到不同工具或云服务中。

4.定制化需求

SkyWalking:对于寻求一站式解决方案、注重快速部署和高效分析的企业,SkyWalking 可能是更合适的选择,尤其适合已经在使用 Apache SkyWalking 生态的团队。

OpenTelemetry:对于期望更灵活的集成策略、愿意投入更多精力构建个性化可观测性体系的企业,OpenTelemetry 提供了更多的定制化可能性。可以依据不同需求选择最适合的后端系统,且随着标准的普及和发展,未来兼容性和扩展性更强。

总结推荐

如果你希望有一个快速部署、功能全面且对 Kubernetes 环境支持良好的一站式解决方案,SkyWalking 是值得推荐的。

如果你的企业需要一个更灵活、开放的标准框架,以便与现有或未来的各种可观测性工具无缝对接,并且看重生态的多样性,OpenTelemetry 是更好的选择。

实际上,许多情况下,这两个工具并不是互斥的,而是可以结合使用。例如,可以使用 OpenTelemetry SDK 收集应用的可观测性数据,然后将这些数据输出给 SkyWalking 或其他支持 OpenTelemetry 的后端系统进行进一步分析和展示。

九、Istio 到底要不要安排?

Istio 作为服务网格(Service Mesh)解决方案,在 Kubernetes 架构中,它通过在微服务间提供一致的安全、连接、可观测性和流量管理能力,显著提高了云原生应用的运维效率和整体性能。但是一直有小伙伴在咨询一些问题例如:istio 技术栈是否特别复杂?istio 服务挂了,是否会影响到整个集群的应用?Istio 是否具有全面应用的可行性?有哪些风险点以及注意事项,今天咱们就展开聊聊。

1.Istio 功能&认可度

全面兼容性:Istio 通过 Sidecar 模式部署 Envoy 代理,能够与多种编程语言和框架编写的微服务兼容,只要这些服务部署在 Kubernetes 集群中,就能够在不修改服务代码的情况下,应用 Istio 的服务治理功能。功能完备:Istio 提供了丰富的功能集,包括流量管理(路由、熔断、重试、超时等)、安全策略(身份认证、授权、密钥交换等)、可观测性(跟踪、监控、日志等)以及渐进式采用的能力,使得它在很多场景下具有全面应用的可行性。模块化部署:Istio 由数据面板(Data Plane)和控制面板(Control Plane)两部分组成,可以根据需要单独部署 Istio 的服务治理功能(如 Envoy sidecar 代理)或流量管理功能(如 Pilot、Galley、 Citadel 等控制组件)。行业接受度:Istio 在业界获得了广泛的应用和好评,其背后的 Google、IBM、Lyft 等公司持续投入开发和维护,使得 Istio 成为了云原生时代服务治理的事实标准之一。

2.Istio 技术栈是否特别复杂?

Istio 由于其功能丰富,涉及到了服务间的通信管理、安全控制、可观测性等诸多方面,的确具有一定的技术复杂性。不过,Istio 的设计理念是尽可能减少对应用代码的侵入,通过 Sidecar 模式让 Envoy 代理接管服务间通信,从而实现上述功能。尽管如此,对于初次接触的服务治理工具的团队,确实需要一定时间去学习和理解 Istio 的核心概念和配置方法。但随着对服务网格理解的加深和实践经验的积累,大部分团队都能够逐步掌握并发挥其优势。

3.Istio 服务挂了,是否会影响整个集群的应用?

Istio 的核心组件(例如 Pilot、Galley、 Citadel 等)失效,确实可能对集群中部分服务的正常运作产生影响,尤其是流量管理和安全性相关的功能。然而,Envoy 代理在设计上具有一定的容错性,例如它可以缓存一部分配置,短时间内即使控制面板不可用,服务间的通信也不一定会立刻中断。即便如此,为了避免单点故障,Istio 提倡部署高可用的控制面,并且可以在适当时候通过冗余和故障转移来确保服务的连续性。

4.Istio 是否具有全面应用的可行性?

Istio 已经在众多生产环境中得到了验证和应用,证明了其在 Kubernetes 架构中全面应用的可行性。对于需要复杂服务间通信管理、安全策略、可观测性等功能的企业级应用,Istio 是一种理想的解决方案。然而,是否适用于每个具体的项目或场景,则需要根据项目规模、业务需求、团队技术栈以及运维能力等多方面因素综合评估。

5.风险点与注意事项

资源开销:每个 Pod 中额外的 Envoy 代理会占用一定的计算和内存资源,需要在容量规划时加以考虑。性能影响:虽然 Envoy 是高性能代理,但在极端场景下仍可能带来性能损失,需关注并针对性优化。运维复杂度:随着 Istio 的引入,运维人员需要掌握新工具和配置,这对团队的学习成本和运维能力提出了更高要求。稳定性与可用性:确保 Istio 控制面组件的高可用性,避免单点故障导致的服务中断。升级策略:Istio 的升级需要精心规划,防止中间版本兼容性问题或配置丢失导致的服务异常。

不过,总的来说,Istio 作为服务网格解决方案确实增强了云原生应用的运维和管理能力,但在全面应用时需充分考虑其复杂性、资源消耗、运维要求以及可能的风险点,并采取适当的策略和措施予以应对。也不是说,全部的业务场景都适用,如果仅有很少量的应用而且服务层面也不需要很精度的流量控制,那真的就没必要了。另外核心维护人员对于 Istio 的技能熟悉度也是考量之一!从外部来看,随着技术的演进和社区支持的加强,Istio 在许多场合下已经成为推动微服务治理现代化的重要力量。我们已经全面应用,至于大家,那就视情况而定吧!

放在最后

今天从如上几个方面总结汇聚成了一篇解答式的文章,更多的是基于笔者已知的场景和业界的使用情况做了分析,很多问题不是不给大家答案,主要是因为每个企业在选择和采用这些技术时,应当充分考虑自身业务需求、现有技术栈的兼容性以及团队的技术储备与成长潜力。例如,在 Kubernetes 集群建设中,不同的网络组件、存储方案、CI/CD工具、监控系统、网关服务以及服务网格(如 Istio)等选择,都需要紧密结合业务规模、系统性能需求、安全性要求以及团队维护能力等因素。

最后,技术栈的发展它是一个动态的过程,既要把握技术趋势,也要贴合自身实际情况,适时调整和优化。在推进技术演进的过程中,培养团队的技术广度和深度,促进技术与业务的深度融合,才是实现技术栈可持续发展的关键所在。

作者丨ZHDYA

来源丨公众号:运维狗工作日记(ID:DEVOPS002)

dbaplus社群欢迎广大技术人员投稿,投稿邮箱:editor@dbaplus.cn

社死!刚入职就把数据库删了,事故原因尴尬又奇葩……

2024-09-27 10:07·dbaplus社群

一、offer收割机,就职新公司

5年前的就业环境非常好,当时面试了很多家公司,收到了很多 offer。最终我决定入职一家互联网教育公司,新的公司福利非常好,各种零食随便吃,据说还能正点下班,一切都超出我的期望,“可算让我找着神仙公司了”,我的心里一阵窃喜。

在熟悉环境之后,我趁着上厕所的时候,顺便去旁边的零食摊挑了点零食。接下来的一天里,我专注地配置开发环境、阅读新人文档,当然我也不忘兼顾手边的零食。

入职几天后 ,领导给安排了一个小需求,我和同事沟通完技术方案后,就开始开发了。

二、单元测试有点奇怪

完成开发后,我决定写个单元测试验证下,在研究单元测试代码后,我发现这种单测写法和我之前的写法不太一样。

这家公司的单测好像没有启动整个项目,仅加载了部分类,而且不能访问测试环境数据库~ 于是我决定按照前东家写单测的方式重新写单元测试。

于是我新增了一个单测基类,在单测中启动整个SpringBoot,直接访问测试环境数据库。然而也并不是很顺利,启动阶段总是会遇到各种异常报错,需要一个一个排查…… 所幸项目排期不紧张,还有充足时间。

我做梦也没有想到,此刻,已经铸成大错。

三、故障现场

我身边的工位旁慢慢地聚集了越来越多的人,本来我还在安安静静的调试单元测试,注意力不自觉的被吸引了过去。

“测试环境为什么这么多异常,访问不通啊。到处都是 500 报错”,不知道谁在说话。

“嗯,我们还在排查,稍等一下”,我旁边的同事一边认真排查日志,一边轻声回复道。

“为什么数据库报的异常是, 查不到数据呢?” ,同事在小声嘀咕,然后打开 命令行,立即登上 MySQL。

我亲眼看着他在操作,奇怪的是数据库表里的数据全部被删掉了,其他的几个表数据也都被删除了。

简直太奇怪了,此刻的我还处于吃瓜心态。

有一个瞬间我在考虑,是否和我执行的单元测试有关系?但我很快就否决掉了这个想法,因为我只是在调试单元测试,我没有删数据库啊,单测里也不可能删库啊。我还在笑话自己 胡思乱想……

很快 DBA 就抱着电脑过来,指着电脑说,你们看这些日志,确实有人把这些表删除了。

"有 IP 吗,定位下是谁删除的, 另外线上环境有问题吗?”,旁边的大组长过来和 DBA 说。

“嗯,我找到ip 了,我找运维看下,这个ip是谁的”。DBA 回复道。

四、庭审现场

当 DBA 找到我的时候,我感到无辜和无助,我懵逼了,我寻思我啥也没干啊,我怎么可能删库呢。(他们知道我刚入职,我现在怀疑:那一刻他们可能会怀疑 我是友商派过来的卧底、间谍,执行删库的秘密任务)

经过一系列的掰扯和分析,最终定位 确实是我新增的单元测试把数据库删了。

五、故障原因

需要明确的是,原单元测试执行时不会删除数据库;测试环境启动时也不会删除数据库。

只要在单元测试中连接测试数据库,就会删除掉数据库的所有数据。为什么呢?

1、为什么单元测试删除了所有数据?

原单元测试 使用的是 H2 内存数据库,即Java 开发的嵌入式(内存级别)数据库,它本身只是一个类库,也就是只有一个 jar 文件,可以直接嵌入到项目中。H2数据库又被称为内存数据库,因为它支持在内存中创建数据库和表。所以如果我们使用H2数据库的内存模式,那么我们创建的数据库和表都只是保存在内存中,一旦应用重启,那么内存中的数据库和表就不存在了。 所以非常适合用来做单元测试。

H2 数据库在启动阶段,需要执行用户指定的 SQL 脚本,脚本中一般包含表创建语句,用来构建需要使用的表。

但是我司的 SQL 脚本除了创建表语句,还包含了删除表语句。即在创建表之前先删除表。为什么呢?据他们说,是因为这个 SQL 脚本可能会重复执行,当重复执行时创建表语句 会报错。所以他们在创建表之前,先尝试删除表。这样确保 SQL 脚本可重复执行。( 其实可以用 Create if not exists )

故障的原因就是:测试数据库执行了这个删表再建表的 SQL 脚本,导致所有数据都被清除了。

2、为什么测试数据库会执行这条 SQL 脚本呢?

1) 我新建的单元测试把H2 内存数据库换成了测试数据库。

2) spring.data.initialize=默认值为 true;默认情况下,会自动执行 sql 脚本。

所以测试数据库 执行了 SQL 脚本。

3、为什么在测试环境正常启动时,没有问题,不会删除所有数据呢?

只有单测引入测试数据库才会出问题,在测试环境正常启动项目是没问题的。

当编译项目时,测试目录下的文件、代码和正式代码编译后的结果不会放到一起。因为 SQL脚本被放在了 测试目录下, 所以正式代码在测试环境启动时,不会执行到这个 SQL脚本,自然不会有问题。

六、深刻教训

最终数据被修复了,DBA有测试数据库的备份,然而快照并非实时的,不可避免地还是丢失了一部分数据。

所幸的是出问题的是测试环境,并非线上环境。否则,我会不会被起诉,也未可知。

后续的改进措施包括:

收回了数据库账户的部分权限,只有管理账户才可以修改数据库表结构。代码中执行 DML语句的账户不允许执行 DDL 语句。DBA 盘点测试数据库的快照能力,确保快照间隔足够短,另外新增一个调研课题:删库后如何快速恢复,参照下其他公司的方案。所有的项目 spring.data.initialize 全部声明为 false。不自动执行 SQL 脚本SQL脚本一律不许出现 删除表的语句。SQL不能重复执行的问题,想其他办法解决。另外的一个项目急需人手,把新来的那谁 调到其他项目上

这可能是程序员们在技术上越来越保守的原因……不经意的一个调整可能引发无法承受的滔天巨浪

作者丨五阳

来源丨网址:https://juejin.cn/post/7412490391935893541

*本文首发于稀土掘金,dbaplus社群已取得作者授权,进行原创发布。欢迎广大技术人员投稿,投稿邮箱:editor@dbaplus.cn

活动推荐

为了和大家一起探索AI相关技术在大数据、数据资产管理、数据库、运维等领域的最佳落地方式,挖掘由此激发的软件发展和技术进步,第九届DAMS中国数据智能管理峰会将于2024年11月29日在上海举办,携手一众产学研界技术领跑单位,带来新思路、重实践、可落地的全日干货盛宴。

活动详情:

0 阅读:11

指尖上的架构

简介:感谢大家的关注