k8s的本质

本文介绍了Linux容器的组成,包括rootfs和Namespace+Cgroups,并强调了容器镜像在容器编排中的重要性。容器编排,如Kubernetes,因其能抽象和管理容器间的复杂关系而变得至关重要。Kubernetes通过CRI与容器运行时交互,支持不同运行时并管理GPU等硬件资源。此外,Kubernetes的声明式API允许通过Pod、Job等对象定义和管理应用,实现服务对象如Service、HorizontalPodAutoscaler等。Kubernetes致力于解决大规模集群中应用间的关系和运行形态问题,提供统一的定义方式。

1.一个运行的linux容器组成

  • 一组联合挂载在 /var/lib/docker/aufs/mnt 上的 rootfs,这一部分我们称为“容器镜像”(Container Image),是容器的静态视图;

  • 一个由 Namespace+Cgroups 构成的隔离环境,这一部分我们称为“容器运行时”(Container Runtime),是容器的动态视图。

2."容器编排"迅速成为上层建筑的原因

  • 开发者不需要关心容器运行时的差异。

  • 真正承载着容器信息进行传递的,是容器镜像,而不是容器运行时。

  • 通过容器镜像,它们可以和潜在用户(即,开发者)直接关联起来。(CI/CD、监控、安全、网络、存储等等)

    这样,容器就从一个开发者手里的小工具,一跃成为了云计算领域的绝对主角;而能够定义容器组织和管理规范的“容器编排”技术,则当仁不让地坐上了容器技术领域的“头把交椅”。

3.k8s项目主要解决的问题

Kubernetes 项目的架构,跟它的原型项目 Borg 非常类似,都由 Master 和 Node 两种节点组成,而这两种角色分别对应着控制节点和计算节点。其中,控制节点,即 Master 节点,由三个紧密协作的独立组件组合而成,它们分别是负责 API 服务的 kube-apiserver、负责调度的 kube-scheduler,以及负责容器编排的 kube-controller-manager。整个集群的持久化数据,则由 kube-apiserver 处理后保存在 Etcd 中。而计算节点上最核心的部分,则是一个叫作 kubelet 的组件。

  • 在 Kubernetes 项目中,kubelet 主要负责同容器运行时(比如 Docker 项目)打交道。

而这个交互所依赖的,是一个称作 CRI(Container Runtime Interface)的远程调用接口,这个接口定义了容器运行时的各项核心操作,比如:启动一个容器需要的所有参数。这也是为何,Kubernetes 项目并不关心你部署的是什么容器运行时、使用的什么技术实现,只要你的这个容器运行时能够运行标准的容器镜像,它就可以通过实现 CRI 接入到 Kubernetes 项目当中。而具体的容器运行时,比如 Docker 项目,则一般通过 OCI 这个容器运行时规范同底层的 Linux 操作系统进行交互,即:把 CRI 请求翻译成对 Linux 操作系统的调用(操作 Linux Namespace 和 Cgroups 等)。

  • kubelet 还通过 gRPC 协议同一个叫作 Device Plugin 的插件进行交互

这个插件,是 Kubernetes 项目用来管理 GPU 等宿主机物理设备的主要组件,也是基于 Kubernetes 项目进行机器学习训练、高性能作业支持等工作必须关注的功能。

  • kubelet 的另一个重要功能,则是调用网络插件和存储插件为容器配置网络和持久化存储。

    这两个插件与 kubelet 进行交互的接口,分别是 CNI(Container Networking Interface)和 CSI(Container Storage Interface)。

  • k8s着重解决的问题

    • 运行在大规模集群中的各种任务之间,应用与应用之间的关系。这些关系的处理,才是作业编排和管理系统最困难的地方。

    • 应用运行的形态是影响“如何容器化这个应用”的第二个重要因素。

  • k8s的设计思想
    • 从更宏观的角度,以统一的方式来定义任务之间的各种关系

    • 且为将来支持更多种类的关系留有余地

  • 在 Kubernetes 项目中,所推崇的使用方法:
    • 通过一个“编排对象”,比如 Pod、Job、CronJob 等,来描述你试图管理的应用;

    • 再为它定义一些“服务对象”,比如 Service、Secret、Horizontal Pod Autoscaler(自动水平扩展器)等。这些对象,会负责具体的平台级功能。

这种使用方法,就是所谓的“声明式 API”。这种 API 对应的“编排对象”和“服务对象”,都是 Kubernetes 项目中的 API 对象(API Object)。

    推荐阅读:​​​​​​​架构原理 · Kubernetes指南icon-default.png?t=M5H6https://feisky.gitbooks.io/kubernetes/content/architecture/architecture.html深入剖析 Kubernetes (geekbang.org)https://time.geekbang.org/column/intro/100015201

Kubernetes(简称K8s)是一个开源的容器部署和管理平台,由Google开发,后捐献给云原生计算基金会(CNCF)。它提供了容器编排、容器运行时、以容器为中心的基础设施编排、负载平衡、自我修复机制和服务发现等功能,本质上是用来简化微服务的开发和部署的[^2][^4]。 K8s的架构采用主从设备模型(Master - Slave架构),由中央控制节点(Master Node)和工作节点(Worker Node)组成。中央控制节点位于集群的中心,包含API Server、Scheduler、Controller Manager和etcd等组件,负责集群的管理、调度和状态监控;工作节点围绕在Master Node周围,每个节点上运行Kubelet、Kube - Proxy和容器运行时等组件,负责执行Master节点分配的任务,运行和管理容器实例[^4]。 K8s具有多个核心概念: - **Pod**:是Kubernetes中的最小调度单元,由一个或多个容器组成,这些容器共享存储和网络资源,分布在各个Node节点上,是Kubernetes生态系统中的核心管理单元[^4]。 - **Controller**:用于管理Pod的生命周期,确保Pod按照预期的状态运行。 - **Service**:为Pod提供稳定的网络接入点,实现服务发现和负载均衡[^4]。 在云原生应用开发中,有的团队会在代码中集成Spring Cloud K8S框架,将Spring Cloud框架和K8S平台进行融合。该框架包括DiscoveryClient和Config两大模块,分别实现了Spring Cloud的服务发现、配置管理等接口。集成此框架的应用通过查询K8S API获取服务的Endpoint、获取对应的ConfigMap,不过应用部署到K8S时,需赋予其查询K8S API的K8S平台相关权限,K8S相关权限定义可参见Spring Cloud K8S官网示例。同时,除了代码端需要依赖Spring Cloud K8S框架,还需要在K8S平台定义Service、Deployment用于获得服务的注册信息,以及ConfigMap用来指定应用的配置信息[^1]。 以下是一个简单的K8s Deployment的YAML示例: ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80 ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值