作为软件工程师,我们应该熟悉 K8s,尽管它有点像 DevOps,但它能让我们更好地了解幕后发生的事情,让我们与部署工作更密切相关,更有责任感。本文将从软件工程师的角度探讨 Kubernetes (K8s),我们将介绍其动机、原理和核心组件,助力于开发者们提升 Kubernetes 的专业知识水平,能更有信心地拥抱这项前沿技术!

背景

在谈论 Kubernetes 之前,首先让我们了解一下什么是容器

当我们考虑一个这样的场景时,容器的概念就会变得很清晰:在开发人员完成满足特定需求的代码编写后,下一步就是将其打包并无缝安装到另一台主机上,确保我们的客户可以轻松安装并享受其优势。那如何打包并安装到另一台主机上?通常,我们有很多依赖项,如二进制代码、依赖库和不同的操作系统,我们需要将它们全部打成一个包,即所谓的 "容器"。

换句话说,我们可以将代码与所有依赖项一起装入容器,然后在远程机器上轻松运行,或者用工程术语来说,"部署我们的服务"

部署挑战

既然我们知道我们的服务是使用容器运输的,那么就会出现这些主要问题:

  • 如何才能知道我们的容器服务不会崩溃?我们希望确保如果一个容器宕机,另一个容器将启动。

  • 怎样确保这个容器有足够的资源运行?也许它占用的资源比实际需要的还要多。

  • 如何管理版本部署,这意味着当我们升级代码时,可以在不停机的情况下完成?我们希望确保服务的高可用性。

  • 如何让我们的容器相互对话?

  • 当我们的请求增加或减少时,如何进行扩展或缩减?

在采用 K8s 之前,AppsFlyer 曾遇到过这些问题,而作为一家拥有强大平台团队的公司,我们通过内部实施解决了这些问题。例如,为了管理服务的生命周期,我们创建了一个名为"Medic"的流程,通过不断向健康检查 API 发送 GET 请求,确保我们的服务始终正常运行。

另一个例子是,我们的大多数服务都是通过一个 docker 容器和用于部署与管理服务的内部工具("Santa")部署在一个 ec2 实例上的。这不会与任何其他服务共享,否则就会浪费资源、时间,更重要的是,还会浪费金钱。

K8s 解决方案

从上文可以了解到,Kubernetes 的实施是为了解决我提到的挑战。

Kubernetes 的定义是:“这是一个用于自动化部署、扩展和管理容器化应用程序的开源系统。”换句话说,Kubernetes 为我们提供了一个容器编排系统,用于妥善管理我们的集群,让我们可以部署、管理资源并扩展应用。K8s 将我们的容器包裹起来,为我们掌舵。

以下就是我们从使用 K8s 和解决上述挑战中获得的一些好处:

  • 崩溃时容器的自行修复——Kubernetes 提供了一种健康检查机制。这意味着不再需要实现检查 API 来对我们的服务进行采样。

  • 应用容器的自动分发和调度为我们提供了节点资源的高效利用。通过与多个应用程序共享节点实例,明智、高效地利用资源。

  • 自动推出和回滚,无需停机

  • 服务发现和负载平衡可帮助容器相互通信

  • 水平扩展可确保开发人员在低负载或高负载的情况下同时使用应用程序,从而提高应用程序的性能。

总之,Kubernetes 是大规模管理容器化应用程序的最佳解决方案。凭借其强大的组件和自动化功能,Kubernetes 简化了应用程序生命周期的部署、扩展和管理。与直接在一个 EC2 实例上使用 Docker 相比,Kubernetes 可以节省时间和精力,并为管理生产中的应用程序提供基本功能。

最重要的是,Kubernetes 能为公司节省资金。通过自动管理基础设施,Kubernetes 减少了对人工干预和内部工具的需求,如上所述,这可以节省大量运营成本。此外,Kubernetes 还可以帮助优化资源利用率,使在相同硬件上运行更多应用程序成为可能,从而节省成本。

每位开发人员都应了解的 K8s 基本组件

Kubernetes 的核心组件分为两大类:控制平面组件和节点。让我们来看看这些高级组件:

API 服务器

API 服务器是控制平面的核心组件,负责公开 Kubernetes API 并处理 API 请求。它是集群中其他组件(如 kubectl 命令行工具或 Kubernetes 面板)与集群交互的主要方式。

调度器

调度器负责根据可用资源以及指定的限制和规则,将 pod 调度到集群中的节点上。它可确保以最大限度提高资源利用率和减少资源争用的方式将 pod 放置在节点上。

控制管理器

控制管理器是在控制平面上运行的进程,负责管理集群的状态并确保其符合所需的状态。它由多个不同的控制器组成,每个控制器负责集群管理的特定方面,例如部署控制器,它负责管理集群中应用程序的部署。

云控制管理器

云控制管理器是在云平台上运行 Kubernetes 时使用的特殊组件。它负责将 Kubernetes 控制平面与云提供商的 API 集成,允许集群使用云的特定功能和资源。

etcd

etcd 是一个分布式键值存储,用于存储 Kubernetes 集群的配置数据,包括集群的当前状态和期望状态。它用于存储需要在集群中所有节点间持久化的数据,如集群中 pod、服务和其他对象的信息。

Kubelet

Kubelet 是运行在集群中每个节点上的守护进程,负责管理该节点上的 pod。Kubelet 负责启动和停止 pod、监控 pod 的健康状况并在必要时重新启动 pod 等任务。它与 Kubernetes 控制平面通信,以接收关于运行哪些 pod 以及如何管理它们的指令,还与容器运行时(如 Docker)通信,以实际执行容器。

Kube-proxy

Kube-proxy 是一个在集群中每个节点上运行的守护进程,负责为集群实施虚拟网络基础设施。Kube-proxy 使用网络编程技术,根据集群网络配置中定义的规则,将网络流量转发到适当的 pod 或服务。Kube-proxy 执行的一些主要任务包括负载平衡、服务发现和网络策略执行。

总结

作为开发人员,全面了解我们所遇到的技术至关重要,无论这些技术是与我们的直接职责直接相关,还是由单独的 DevOps 团队管理,本文将作为一个完美的起点,推动您深入了解 K8s 的世界。

K8s 拥有陡峭的学习曲线,对于开发人员太过笨重。基于平台工程理念构建的全新一代应用管理平台 Walrus 将分离研发和运维的关注点,通过提供灵活强大的应用和环境部署管理能力、可屏蔽基础设施的上层抽象,使研发人员能够在无需了解底层技术细节的前提下自助构建、部署和运行应用程序,减轻开发人员的认知负担。借助 Walrus 将云原生的能力和最佳实践扩展到非容器化环境,并支持任意应用形态统一编排部署,降低使用基础设施的复杂度,为研发和运维团队提供易用、一致的应用管理和部署体验,进而构建无缝协作的软件交付流程。复制下方项目链接至浏览器,即刻试用 Walrus。

开源地址:github.com/seal-io/walrus

参考链接

https://medium.com/appsflyerengineering/hi-developer-meet-kubernetes-8652bdc210d9

从软件工程师角度聊聊 Kubernetes的更多相关文章

  1. [No00004D]深度思考好文:软件工程师的困境

    昨天是我一同学结婚的好日子,同学们大家聊各自的工作,有个同学突然问了我一句:我们同学中好像做软件的不多?如果再细分,好像做网络相关的更少? 回想起当时为何读计算机信息管理的专业,是因为那时听说读电脑未 ...

  2. CEO应向软件工程师学习的7个技能

    软件工程师的哪些技能是值得CEO学习的?显然,软件工程师是逻辑的,高效的,注重细节的,有计划的,并且大多数CEO也是如此.但是,软件工程师还有一些更微妙,甚至是令人懊恼的品质,那么CEO是否可以从中学 ...

  3. 转载:CEO应向软件工程师学习的7个技能

    软件工程师的哪些技能是值得CEO学习的?显然,软件工程师是逻辑的,高效的,注重细节的,有计划的,并且大多数CEO也是如此.但是,软件工程师还有一些更微妙,甚至是令人懊恼的品质,那么CEO是否可以从中学 ...

  4. 从架构演进的角度聊聊Spring Cloud都做了些什么?

    Spring Cloud作为一套微服务治理的框架,几乎考虑到了微服务治理的方方面面,之前也写过一些关于Spring Cloud文章,主要偏重各组件的使用,本次分享主要解答这两个问题:Spring Cl ...

  5. 连载《一个程序猿的生命周期》-《发展篇》 - 3.农民与软件工程师,农业与IT业

    相关文章:随笔<一个程序猿的生命周期>- 逆潮流而动的“叛逆者”        15年前,依稀记得走出大山,进城求学的场景.尽管一路有父亲的陪伴,但是内心仍然畏惧.当父亲转身离去.准备回到 ...

  6. 1、软件工程师要阅读的书籍 - IT软件人员书籍系列文章

    软件工程师要阅读的书籍估计是项目组内最多的.软件工程师处于项目组中最基础的人员储备阶层,与项目的关系最密切.当然,现在是大数据时代,我们无法全部看完所有相关的书籍,只能够先学习工作需要的知识,然后在项 ...

  7. Atitit. 高级软件工程师and 普通的区别 高级编程的门槛总结

    Atitit.  高级软件工程师and 普通的区别 高级编程的门槛总结 1. 完备的知识体系 2 2. 编程理论/原理的掌握 2 1.1. 掌握常用的概念(ORM,IOC,AOP,event driv ...

  8. Google前工程经理王忻:如何准备软件工程师的面试

    http://t.jobdu.com/thread-368-1-1.html 导读:原文作者王忻,Google前工程经理,2003年月加入Google,是Google Lively背后的主导力量,是G ...

  9. 软件工程师所需掌握的“终极技术”是什么?

    软件工程师所需掌握的"终极技术"是什么? http://yunli.blog.51cto.com/831344/1019990 最近,我在微博上看到@程序员邹欣老师发的一条微博 - ...

  10. net软件工程师求职简历

    Net软件工程师求职简历 姓    名: 王静静 性    别: 女 出生日期: 1991-12 籍    贯: 河北 居住地: 北京 学    历: 专科 E-mail: 335659753@qq. ...

随机推荐

  1. 00.Webstrom的基本入门设置

    1.取消红框类自动打开项目 2.打开轮滚缩放代码 3.设置代码字体,这里选择的是Consolas 推荐免费字体:https://files.cnblogs.com/files/huadaxia/jet ...

  2. Galaxy Project 是一个由 NIH、NSF、Johns Hopkins University 等机构支持的开源生物医学开源项目。Galaxy 作为其中的一个子项目,提供了以英文为主,......

    本文分享自微信公众号 - 生信科技爱好者(bioitee).如有侵权,请联系 support@oschina.cn 删除.本文参与"OSC源创计划",欢迎正在阅读的你也加入,一起分 ...

  3. BGP选路

    实验拓扑 实验需求 现有三个自治系统,需要对R1访问R4的loopback-X数据走向进行精确控制: R1访问R4的loopback0走R2,通过在R1上修改本地优先级实现 R1访问R4的loopba ...

  4. cmake 安装一个目录下的图片 到另一个目录文件中去

    install(DIRECTORY ./cfg/labels/ DESTINATION ./fservo/cfg/yolo_cfg/labels/) install (DIRECTORY ./cfg/ ...

  5. 逍遥自在学C语言 | 指针的基础用法

    前言 在C语言中,指针是一项重要的概念,它允许我们直接访问和操作内存地址. 可以说,指针是C语言一大优势.用得好,你写程序如同赵子龙百万军中取上将首级:用得不好,则各种问题层出不穷,有种双拳难敌四手的 ...

  6. C++面试八股文:std::string是如何实现的?

    某日二师兄参加XXX科技公司的C++工程师开发岗位第18面: 面试官:std::string用过吧? 二师兄:当然用过(废话,C++程序员就没有没用过std::string的). 面试官:std::s ...

  7. 前端树形结构图组件 tree组件,可拖拽移动,点击展开收缩,无限添加子集

    快速实现树形结构图组件 tree组件,可拖拽移动,点击展开收缩,无限添加子集; 下载完整代码请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id=1 ...

  8. GO 语言中 slice 的理解

    GO 语言中 slice 理解 为什么说 Go 语言的 slice 是引用类型,其底层实现明明是一个结构体? slice 的底层实现是一个包含三个字段的结构体:指向底层数组的指针.slice 的长度和 ...

  9. php屏蔽非正常访问和检测用户登录检测

    <?phpnamespace Manage\Controller;use Common\Controller\DefaultController;class BaseController ext ...

  10. 如何使用libavcodec将.h264码流文件解码为.yuv图像序列?

    一.打开和关闭输入文件和输出文件 //io_data.cpp static FILE* input_file= nullptr; static FILE* output_file= nullptr; ...