一文搞懂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 !

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
9天前
|
PHP Docker 容器
如何在宿主主机运行容器中的php守护进程
在Docker容器中同时运行多个程序(如Nginx+PHP+Ftp)时,需用`docker exec`命令启动额外服务。首先通过`php -v`查看PHP版本,再用`which php-fpm7.4`确认PHP安装路径,通常返回`/usr/sbin/php-fpm7.4`。最后直接运行该路径启动PHP-FPM服务,确保其正常工作。
38 14
|
29天前
|
存储 监控 对象存储
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
针对本地存储和 PVC 这两种容器存储使用方式,我们对 ACK 的容器存储监控功能进行了全新升级。此次更新完善了对集群中不同存储类型的监控能力,不仅对之前已有的监控大盘进行了优化,还针对不同的云存储类型,上线了全新的监控大盘,确保用户能够更好地理解和管理容器业务应用的存储资源。
117 21
|
1月前
|
存储 监控 对象存储
ACK容器监控存储全面更新:让您的应用运行更稳定、更透明
介绍升级之后的ACK容器监控体系,包括各大盘界面展示和概要介绍。
|
1月前
|
存储 运维 Kubernetes
正式开源,Doris Operator 支持高效 Kubernetes 容器化部署方案
飞轮科技推出了 Doris 的 Kubernetes Operator 开源项目(简称:Doris Operator),并捐赠给 Apache 基金会。该工具集成了原生 Kubernetes 资源的复杂管理能力,并融合了 Doris 组件间的分布式协同、用户集群形态的按需定制等经验,为用户提供了一个更简洁、高效、易用的容器化部署方案。
正式开源,Doris Operator 支持高效 Kubernetes 容器化部署方案
|
1月前
|
Kubernetes Linux 虚拟化
入门级容器技术解析:Docker和K8s的区别与关系
本文介绍了容器技术的发展历程及其重要组成部分Docker和Kubernetes。从传统物理机到虚拟机,再到容器化,每一步都旨在更高效地利用服务器资源并简化应用部署。容器技术通过隔离环境、减少依赖冲突和提高可移植性,解决了传统部署方式中的诸多问题。Docker作为容器化平台,专注于创建和管理容器;而Kubernetes则是一个强大的容器编排系统,用于自动化部署、扩展和管理容器化应用。两者相辅相成,共同推动了现代云原生应用的快速发展。
209 11
|
Kubernetes Java 应用服务中间件
采集kubernetes的容器日志
原文:https://www.zeusro.tech/2018/12/08/log-to-kubernetes/ 推送到ElasticSearch
2778 0
|
监控 Kubernetes Shell
使用阿里云日志服务采集查询kubernetes容器日志
使用阿里云日志收集查询kubernetes容器日志
2947 0
|
1月前
|
缓存 容灾 网络协议
ACK One多集群网关:实现高效容灾方案
ACK One多集群网关可以帮助您快速构建同城跨AZ多活容灾系统、混合云同城跨AZ多活容灾系统,以及异地容灾系统。
|
2月前
|
Kubernetes Ubuntu 网络安全
ubuntu使用kubeadm搭建k8s集群
通过以上步骤,您可以在 Ubuntu 系统上使用 kubeadm 成功搭建一个 Kubernetes 集群。本文详细介绍了从环境准备、安装 Kubernetes 组件、初始化集群到管理和使用集群的完整过程,希望对您有所帮助。在实际应用中,您可以根据具体需求调整配置,进一步优化集群性能和安全性。
148 12
|
2月前
|
Prometheus Kubernetes 监控
OpenAI故障复盘 - 阿里云容器服务与可观测产品如何保障大规模K8s集群稳定性
聚焦近日OpenAI的大规模K8s集群故障,介绍阿里云容器服务与可观测团队在大规模K8s场景下我们的建设与沉淀。以及分享对类似故障问题的应对方案:包括在K8s和Prometheus的高可用架构设计方面、事前事后的稳定性保障体系方面。

热门文章

最新文章