一文搞懂Kubernetes容器运行原理

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: Hello folks,我是 Luga,今天我们来分享一下与云原生体系有关的话题- 云原生技术-Container。 作为一个“核心”要素之一,容器技术在云原生生态中发挥着重要的意义。

    Hello folks,我是 Luga,今天我们来分享一下与云原生体系有关的话题- 云原生技术-Container。 作为一个“核心”要素之一,容器技术在云原生生态中发挥着重要的意义。


01

Kubernetes容器概述


from 网络

    容器能够有效地虚拟化主机操作系统(或内核)并将应用程序的依赖项与同一台机器上运行的其他容器隔离开。在容器出现之前,在同一个虚拟机 (VM) 上部署了多个应用程序,共享依赖项的任何更改都可能导致奇怪的事情发生,从而导致排障较为困难。

    容器主要通过两个部分解决这个问题:容器引擎和容器镜像,容器镜像是应用程序及其依赖项的包。容器引擎在容器中运行应用程序,将其与主机上运行的其他应用程序隔离开来。这样就无需为每个应用程序运行单独的操作系统,从而提高资源利用率并降低成本。关于 Kubernetes Container 技术的解析,大家可以参考之前的文章,具体:

    1. 一文彻底搞懂Container

    2. K8S Container解析

    当我们开始学习 Kubernetes 时,我们并不完全清楚每个 Pod 是如何分配 IP 地址以及微服务容器化后是如何正常工作。或许,我们可能或多或少了解各个组件的概念以及它们是如何独立工作。但是,在特定的环境下可能不清楚这些组件是如何关联起来。例如,我们知道什么是 CNI 插件,然而,却不理解 Kubernetes 所涉猎的组件之间是如何相互调用。因此,基于对各种核心组件的了解,以及它们如何在 Kubernetes 集群中拼接在一起,以便使得每个 Container 能够基于其所设定的环境变量正确运行,在实际的业务环境中进行有效维护便显得尤为重要。

   在当前的 Kubernetes 生态体系中有多种网络解决方案以及容器运行时环境的各种选项。在本文中,笔者将试图从整个 Kubernetes 编排架构角度来阐述 Container 容器运行的基本原理,以使得大家能够更深入理解容器生态体系相关知识。


02

CRI(容器运行时接口) 架构


    CRI(Container Runtime Interface)是一个插件接口,允许 Kubelet 使用不同的容器运行时。各种容器运行时实现了 CRI API,这允许用户在他们的 Kubernetes 安装中使用他们选择的容器运行时。

    我们先简要了解一下 Containerd 的 CRI 插件架构。

    CRI 插件是 Kubernetes 容器运行时接口 (CRI) 的实现。Containerd 与 Kubelet 在同一节点上运行,Containerd 内部的 CRI 插件处理来自 Kubelet 的所有 CRI 服务请求,并使用 Containerd 内部结构来管理容器和容器镜像。

    CRI 插件使用 Containerd 来管理整个容器生命周期和所有容器镜像。如下所示,CRI 通过 CNI(容器网络接口)管理 Pod 网络。



    基于上述结构图,让我们梳理下 CRI 插件如何基于 Kubelet 创建容器并运行 Pod 过程:

    1、Kubelet 通过 CRI 运行时服务 API 调用 CRI 插件来创建 Pod。

    2、CRI 使用 Containerd Internal 来创建和启动一个特殊的沙箱容器,并将该容器放在 Pod 的 Cgroups 和 NameSpace 命名空间中。

    3、CRI 使用 CNI 配置 Pod 的网络命名空间。

    4、Kubelet 随后通过 CRI 镜像服务 API 调用 CRI 插件来拉取应用容器镜像。若镜像不存在于节点上,CRI 便进一步使用 Containerd 来拉取镜像。

    5、Kubelet 然后通过 CRI 运行时服务 API 调用 CRI,使用拉取的容器镜像在 Pod 内创建和启动应用程序容器。

    6、CRI 使用 Containerd Internal 创建应用容器,将其放入 Pod 的 Cgroups 和 NameSpace 中,然后启动 Pod 的新应用容器。在这些步骤之后,一个 Pod 及其相应的应用程序容器被创建并运行。


03

CNI(容器网络接口)架构


    作为另一个 CNCF 项目,CNI(容器网络接口)也是一个云原生计算基金会项目,由用在 Linux 容器中配置网络接口的规范和库以及许多受支持的插件组成。CNI 只关心容器的网络连接和删除容器时删除分配的资源。正因为如此,CNI 的支持范围很广,规范也很容易实现,为 Linux 容器提供基于插件的通用网络解决方案。

    通常来讲,CNI 被容器运行时 CR 使用,例如 Kubernetes、Podman、CRI-O 、rkt 、Openshift、Cloud Foundry、Amazon ECS、Singularity、OpenSVC 以及 Mesos 等等。Container 或 Pod 本身最初并不具备网络接口,容器运行时使用 ADD、DEL、CHECK 等操作命令调用 CNI 插件。例如,ADD 为容器创建一个新的网络接口,并将要添加的内容的详细信息通过 JSON 有效地传递给 CNI。

    那么,通常如何在 Kubernetes 中使用 CNI ?一般来讲,主要根据 CNI 配置文件以确定选用哪种 CNI 插件,具体如下所示:

    1、在每个节点上配置 CNI 文件(/etc/cni/net.d/xxnet.conf),其中 xxnet.conf表示网络配置文件的名称。

    2、基于 CNI 配置文件中进行二进制插件的安装部署。

    3、在节点上创建 Pod 后,Kubelet 会根据 CNI 配置文件运行前两步安装的 CNI 插件。

    4、基于上述进行 Pod 网络配置。


04

CRI 与 CNI 交互模型


    每个网络提供者都有一个 CNI 插件,容器运行时会调用其来为 Pod 启动时配置网络。若基于 Containerd 作为容器运行时,Containerd CRI 插件调用 CNI 插件。每个网络提供商也有一个安装在每个 Kubernetes 节点上的代理,用于配置 Pod 网络。安装网络提供程序代理后,它要么随 CNI 配置一起提供,要么在节点上创建一个,然后 CRI 插件使用该代理来确定要调用哪个 CNI 插件。

    CNI 配置文件的位置是可配置的,默认值为 /etc/cni/net.d/<config-file>。集群管理员需要在每个节点上提供 CNI 插件。CNI 插件的位置也是可配置的,默认值为 /opt/cni/bin。

    如果将 Containerd 作为容器运行时,可以在 Containerd 配置的 [plugins."io.containerd.grpc.v1.cri".cni] 部分下指定 CNI 配置和 CNI 插件二进制文件的路径。我们以 Flannel 网络方案为例,Flanneld 是 Flannel 守护进程,通常作为守护进程安装在 kubernetes 集群上,使用 install-cni 作为初始化容器。install-cni 容器在每个节点上创建 CNI 配置文件 - /etc/cni/net.d/10-flannel.conflist。 Flanneld 创建一个 Vxlan 设备,从 Api Server 获取网络元数据并监视 Pod 上的更新。创建 Pod 时,它会为整个集群中的所有 Pod 分配路由,这些路由允许 Pod 通过其 IP 地址相互连接。

     Containerd CRI Plugin 和 CNI Plugin 之间的交互模型,如下图所示:


    基于上所述,Kubelet 调用 Containerd CRI 插件以创建 Pod,Containerd CRI 插件调用 CNI 插件为 Pod 配置网络。网络提供者 CNI 插件调用其他基础 CNI 插件来配置网络。


05

容器运行流程图


    接下来,我们来看一下 Kubelet、Container Runtime 和 CNI 插件等它们是如何拼接在一起的,如何进行相互协作。当一个 Pod 被调度到一个节点上时,会触发不同的事件操作来启动一个 Pod。 在节点上调度 Pod 后,以下交互将进行网络配置并启动应用程序容器。具体如下所示:



    最后,我们来看一个完整的 Container 运行示意图,具体如下所示:


    以上为本文关于 Container 如何在 Kubernetes 中运行的相关原理解析,若文中相关术语及内容表达有误,欢迎大家随时沟通,交流。

    Adiós !

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
3月前
|
Kubernetes Docker Python
Docker 与 Kubernetes 容器化部署核心技术及企业级应用实践全方案解析
本文详解Docker与Kubernetes容器化技术,涵盖概念原理、环境搭建、镜像构建、应用部署及监控扩展,助你掌握企业级容器化方案,提升应用开发与运维效率。
765 109
|
2月前
|
存储 Kubernetes 网络安全
关于阿里云 Kubernetes 容器服务(ACK)添加镜像仓库的快速说明
本文介绍了在中国大陆地区因网络限制无法正常拉取 Docker 镜像的解决方案。作者所在的阿里云 Kubernetes 集群使用的是较旧版本的 containerd(1.2x),且无法直接通过 SSH 修改节点配置,因此采用了一种无需更改 Kubernetes 配置文件的方法。通过为 `docker.io` 添加 containerd 的镜像源,并使用脚本自动修改 containerd 配置文件中的路径错误(将错误的 `cert.d` 改为 `certs.d`),最终实现了通过多个镜像站点拉取镜像。作者还提供了一个可重复运行的脚本,用于动态配置镜像源。虽然该方案能缓解镜像拉取问题,
330 2
|
2月前
|
Kubernetes Devops Docker
Kubernetes 和 Docker Swarm:现代 DevOps 的理想容器编排工具
本指南深入解析 Kubernetes 与 Docker Swarm 两大主流容器编排工具,涵盖安装、架构、网络、监控等核心维度,助您根据团队能力与业务需求精准选型,把握云原生时代的技术主动权。
273 1
|
3月前
|
Ubuntu PHP Docker
一个可以运行的Dockerfile_php ,用来创建php容器镜像
该简介描述了一个基于 Dragonwell 8 Ubuntu 的 Docker 镜像,用于构建包含 PHP 7.4 及常用扩展的运行环境。通过更换为阿里云源提升安装速度,配置了 PHP-FPM 并暴露 9000 端口,使用自定义 Dockerfile 构建镜像并成功运行容器。
|
1月前
|
人工智能 算法 调度
阿里云ACK托管集群Pro版共享GPU调度操作指南
本文介绍在阿里云ACK托管集群Pro版中,如何通过共享GPU调度实现显存与算力的精细化分配,涵盖前提条件、使用限制、节点池配置及任务部署全流程,提升GPU资源利用率,适用于AI训练与推理场景。
210 1
|
1月前
|
弹性计算 监控 调度
ACK One 注册集群云端节点池升级:IDC 集群一键接入云端 GPU 算力,接入效率提升 80%
ACK One注册集群节点池实现“一键接入”,免去手动编写脚本与GPU驱动安装,支持自动扩缩容与多场景调度,大幅提升K8s集群管理效率。
221 89
|
6月前
|
资源调度 Kubernetes 调度
从单集群到多集群的快速无损转型:ACK One 多集群应用分发
ACK One 的多集群应用分发,可以最小成本地结合您已有的单集群 CD 系统,无需对原先应用资源 YAML 进行修改,即可快速构建成多集群的 CD 系统,并同时获得强大的多集群资源调度和分发的能力。
269 9
|
6月前
|
资源调度 Kubernetes 调度
从单集群到多集群的快速无损转型:ACK One 多集群应用分发
本文介绍如何利用阿里云的分布式云容器平台ACK One的多集群应用分发功能,结合云效CD能力,快速将单集群CD系统升级为多集群CD系统。通过增加分发策略(PropagationPolicy)和差异化策略(OverridePolicy),并修改单集群kubeconfig为舰队kubeconfig,可实现无损改造。该方案具备多地域多集群智能资源调度、重调度及故障迁移等能力,帮助用户提升业务效率与可靠性。

热门文章

最新文章

推荐镜像

更多