<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>CNCF X 阿里巴巴云原生技术公开课 on GoClub</title><link>https://go.botsarena.tech/docs/resources/cloud-native-web3-fulltext/cncf-alibaba-cloud-native-course/</link><description>Recent content in CNCF X 阿里巴巴云原生技术公开课 on GoClub</description><generator>Hugo</generator><language>zh-cn</language><atom:link href="https://go.botsarena.tech/docs/resources/cloud-native-web3-fulltext/cncf-alibaba-cloud-native-course/index.xml" rel="self" type="application/rss+xml"/><item><title>01 第一堂“云原生”课</title><link>https://go.botsarena.tech/docs/resources/cloud-native-web3-fulltext/cncf-alibaba-cloud-native-course/001/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://go.botsarena.tech/docs/resources/cloud-native-web3-fulltext/cncf-alibaba-cloud-native-course/001/</guid><description>&lt;div class="goclub-source-note"&gt;来源：&lt;a href="https://study.disign.me/document/CNCF%20X%20%e9%98%bf%e9%87%8c%e5%b7%b4%e5%b7%b4%e4%ba%91%e5%8e%9f%e7%94%9f%e6%8a%80%e6%9c%af%e5%85%ac%e5%bc%80%e8%af%be/01%20%e7%ac%ac%e4%b8%80%e5%a0%82%e2%80%9c%e4%ba%91%e5%8e%9f%e7%94%9f%e2%80%9d%e8%af%be.md" target="_blank" rel="noopener noreferrer"&gt;技术书栈原文&lt;/a&gt;。本页按授权迁移至 GoClub。&lt;/div&gt;
&lt;h1 id="01-第一堂-云原生-课"&gt;01 第一堂“云原生”课&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;本节课程要点&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;云原生技术发展历程（为什么要学习这门课）&lt;/li&gt;
&lt;li&gt;课程简介与预备知识（这门课到底教什么）&lt;/li&gt;
&lt;li&gt;云原生的定义与技术要点（本节正式内容）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="为什么要开设云原生技术公开课"&gt;为什么要开设云原生技术公开课？&lt;/h2&gt;
&lt;h3 id="云原生技术发展简史"&gt;云原生技术发展简史&lt;/h3&gt;
&lt;p&gt;首先从第一个问题进行分享，那就是“为什么要开设云原生技术公开课？”云原生、CNCF 都是目前非常热门的关键词，但是这些技术并不是非常新鲜的内容。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2004 年— 2007 年，Google 已在内部大规模地使用像 Cgroups 这样的容器技术；&lt;/li&gt;
&lt;li&gt;2008 年，Google 将 Cgroups 合并进入了 Linux 内核主干；&lt;/li&gt;
&lt;li&gt;2013 年，Docker 项目正式发布。&lt;/li&gt;
&lt;li&gt;2014 年，Kubernetes 项目也正式发布。这样的原因也非常容易理解，因为有了容器和 Docker 之后，就需要有一种方式去帮助大家方便、快速、优雅地管理这些容器，这就是 Kubernetes 项目的初衷。在 Google 和 Redhat 发布了 Kubernetes 之后，这个项目的发展速度非常之快。&lt;/li&gt;
&lt;li&gt;2015 年，由Google、Redhat 以及微软等大型云计算厂商以及一些开源公司共同牵头成立了 CNCF 云原生基金会。CNCF 成立之初，就有 22 个创始会员，而且 Kubernetes 也成为了 CNCF 托管的第一个开源项目。在这之后，CNCF 的发展速度非常迅猛；&lt;/li&gt;
&lt;li&gt;2017 年，CNCF 达到 170 个成员和 14 个基金项目；&lt;/li&gt;
&lt;li&gt;2018 年，CNCF 成立三周年有了 195 个成员，19 个基金会项目和 11 个孵化项目，如此之快的发展速度在整个云计算领域都是非常罕见的。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="云原生技术生态现状"&gt;云原生技术生态现状&lt;/h3&gt;
&lt;p&gt;因此，如今我们所讨论的云原生技术生态是一个庞大的技术集合。CNCF 有一张云原生全景图（&lt;a href="https://github.com/cncf/landscape" rel="nofollow noreferrer noopener"&gt;https://github.com/cncf/landscape&lt;/a&gt;），在这个全景图里已经有 200 多个项目和产品了，这些项目和产品也都是和 CNCF 的观点所契合的。所以如果以这张全景图作为背景，加以思考就会发现，我们今天所讨论的云原生其实主要谈论了以下几点：&lt;/p&gt;</description></item><item><title>02 容器基本概念</title><link>https://go.botsarena.tech/docs/resources/cloud-native-web3-fulltext/cncf-alibaba-cloud-native-course/002/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://go.botsarena.tech/docs/resources/cloud-native-web3-fulltext/cncf-alibaba-cloud-native-course/002/</guid><description>&lt;div class="goclub-source-note"&gt;来源：&lt;a href="https://study.disign.me/document/CNCF%20X%20%e9%98%bf%e9%87%8c%e5%b7%b4%e5%b7%b4%e4%ba%91%e5%8e%9f%e7%94%9f%e6%8a%80%e6%9c%af%e5%85%ac%e5%bc%80%e8%af%be/02%20%e5%ae%b9%e5%99%a8%e5%9f%ba%e6%9c%ac%e6%a6%82%e5%bf%b5.md" target="_blank" rel="noopener noreferrer"&gt;技术书栈原文&lt;/a&gt;。本页按授权迁移至 GoClub。&lt;/div&gt;
&lt;h1 id="02-容器基本概念"&gt;02 容器基本概念&lt;/h1&gt;
&lt;h1 id="容器与镜像"&gt;容器与镜像&lt;/h1&gt;
&lt;h3 id="什么是容器"&gt;什么是容器？&lt;/h3&gt;
&lt;p&gt;在介绍容器的具体概念之前，先简单回顾一下操作系统是如何管理进程的。&lt;/p&gt;
&lt;p&gt;首先，当我们登录到操作系统之后，可以通过 ps 等操作看到各式各样的进程，这些进程包括系统自带的服务和用户的应用进程。那么，这些进程都有什么样的特点？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第一，这些进程可以相互看到、相互通信；&lt;/li&gt;
&lt;li&gt;第二，它们使用的是同一个文件系统，可以对同一个文件进行读写操作；&lt;/li&gt;
&lt;li&gt;第三，这些进程会使用相同的系统资源。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这样的三个特点会带来什么问题呢？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;因为这些进程能够相互看到并且进行通信，高级权限的进程可以攻击其他进程；&lt;/li&gt;
&lt;li&gt;因为它们使用的是同一个文件系统，因此会带来两个问题：这些进程可以对于已有的数据进行增删改查，具有高级权限的进程可能会将其他进程的数据删除掉，破坏掉其他进程的正常运行；此外，进程与进程之间的依赖可能会存在冲突，如此一来就会给运维带来很大的压力；&lt;/li&gt;
&lt;li&gt;因为这些进程使用的是同一个宿主机的资源，应用之间可能会存在资源抢占的问题，当一个应用需要消耗大量 CPU 和内存资源的时候，就可能会破坏其他应用的运行，导致其他应用无法正常地提供服务。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;针对上述的三个问题，如何为进程提供一个独立的运行环境呢？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;针对不同进程使用同一个文件系统所造成的问题而言，Linux 和 Unix 操作系统可以通过 chroot 系统调用将子目录变成根目录，达到视图级别的隔离；进程在 chroot 的帮助下可以具有独立的文件系统，对于这样的文件系统进行增删改查不会影响到其他进程；&lt;/li&gt;
&lt;li&gt;因为进程之间相互可见并且可以相互通信，使用 Namespace 技术来实现进程在资源的视图上进行隔离。在 chroot 和 Namespace 的帮助下，进程就能够运行在一个独立的环境下了；&lt;/li&gt;
&lt;li&gt;但在独立的环境下，进程所使用的还是同一个操作系统的资源，一些进程可能会侵蚀掉整个系统的资源。为了减少进程彼此之间的影响，可以通过 Cgroup 来限制其资源使用率，设置其能够使用的 CPU 以及内存量。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;那么，应该如何定义这样的进程集合呢？&lt;/p&gt;
&lt;p&gt;其实，&lt;strong&gt;容器就是一个视图隔离、资源可限制、独立文件系统的进程集合。&lt;/strong&gt;所谓“视图隔离”就是能够看到部分进程以及具有独立的主机名等；控制资源使用率则是可以对于内存大小以及 CPU 使用个数等进行限制。容器就是一个进程集合，它将系统的其他资源隔离开来，具有自己独立的资源视图。&lt;/p&gt;
&lt;p&gt;容器具有一个独立的文件系统，因为使用的是系统的资源，所以在独立的文件系统内不需要具备内核相关的代码或者工具，我们只需要提供容器所需的二进制文件、配置文件以及依赖即可。只要容器运行时所需的文件集合都能够具备，那么这个容器就能够运行起来。&lt;/p&gt;
&lt;h3 id="什么是镜像"&gt;什么是镜像？&lt;/h3&gt;
&lt;p&gt;综上所述，我们将这些容器运行时所需要的所有的文件集合称之为容器镜像。&lt;/p&gt;
&lt;p&gt;那么，一般都是通过什么样的方式来构建镜像的呢？通常情况下，我们会采用 Dockerfile 来构建镜像，这是因为 Dockerfile 提供了非常便利的语法糖，能够帮助我们很好地描述构建的每个步骤。当然，每个构建步骤都会对已有的文件系统进行操作，这样就会带来文件系统内容的变化，我们将这些变化称之为 changeset。当我们把构建步骤所产生的变化依次作用到一个空文件夹上，就能够得到一个完整的镜像。 changeset 的分层以及复用特点能够带来几点优势：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第一，能够提高分发效率，简单试想一下，对于大的镜像而言，如果将其拆分成各个小块就能够提高镜像的分发效率，这是因为镜像拆分之后就可以并行下载这些数据；&lt;/li&gt;
&lt;li&gt;第二，因为这些数据是相互共享的，也就意味着当本地存储上包含了一些数据的时候，只需要下载本地没有的数据即可，举个简单的例子就是 golang 镜像是基于 alpine 镜像进行构建的，当本地已经具有了 alpine 镜像之后，在下载 golang 镜像的时候只需要下载本地 alpine 镜像中没有的部分即可；&lt;/li&gt;
&lt;li&gt;第三，因为镜像数据是共享的，因此可以节约大量的磁盘空间，简单设想一下，当本地存储具有了 alpine 镜像和 golang 镜像，在没有复用的能力之前，alpine 镜像具有 5M 大小，golang 镜像有 300M 大小，因此就会占用 305M 空间；而当具有了复用能力之后，只需要 300M 空间即可。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="如何构建镜像"&gt;如何构建镜像？&lt;/h3&gt;
&lt;p&gt;如下图所示的 Dockerfile 适用于描述如何构建 golang 应用的。&lt;/p&gt;</description></item><item><title>03 Kubernetes 核心概念</title><link>https://go.botsarena.tech/docs/resources/cloud-native-web3-fulltext/cncf-alibaba-cloud-native-course/003/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://go.botsarena.tech/docs/resources/cloud-native-web3-fulltext/cncf-alibaba-cloud-native-course/003/</guid><description>&lt;div class="goclub-source-note"&gt;来源：&lt;a href="https://study.disign.me/document/CNCF%20X%20%e9%98%bf%e9%87%8c%e5%b7%b4%e5%b7%b4%e4%ba%91%e5%8e%9f%e7%94%9f%e6%8a%80%e6%9c%af%e5%85%ac%e5%bc%80%e8%af%be/03%20Kubernetes%20%e6%a0%b8%e5%bf%83%e6%a6%82%e5%bf%b5.md" target="_blank" rel="noopener noreferrer"&gt;技术书栈原文&lt;/a&gt;。本页按授权迁移至 GoClub。&lt;/div&gt;
&lt;h1 id="03-kubernetes-核心概念"&gt;03 Kubernetes 核心概念&lt;/h1&gt;
&lt;p&gt;Please enable cookies.&lt;/p&gt;
&lt;h2 id="什么是-kubernetes"&gt;什么是 Kubernetes&lt;/h2&gt;
&lt;p&gt;Kubernetes，从官方网站上可以看到，它是一个工业级的容器编排平台。Kubernetes 这个单词是希腊语，它的中文翻译是“舵手”或者“飞行员”。在一些常见的资料中也会看到“ks”这个词，也就是“k8s”，它是通过将8个字母“ubernete ”替换为“8”而导致的一个缩写。&lt;/p&gt;
&lt;h2 id="you-are-being-rate-limited"&gt;You are being rate limited&lt;/h2&gt;
&lt;p&gt;Kubernetes 为什么要用“舵手”来命名呢？大家可以看一下这张图：&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://go.botsarena.tech/pictures/study-disign/5af90d3e67bcbefd4c4e.webp" alt="avatar"&gt;&lt;/p&gt;
&lt;p&gt;这是一艘载着一堆集装箱的轮船，轮船在大海上运着集装箱奔波，把集装箱送到它们该去的地方。我们之前其实介绍过一个概念叫做 container，container 这个英文单词也有另外的一个意思就是“集装箱”。Kubernetes 也就借着这个寓意，希望成为运送集装箱的一个轮船，来帮助我们管理这些集装箱，也就是管理这些容器。&lt;/p&gt;
&lt;p&gt;这个就是为什么会选用 Kubernetes 这个词来代表这个项目的原因。更具体一点地来说：Kubernetes 是一个自动化的容器编排平台，它负责应用的部署、应用的弹性以及应用的管理，这些都是基于容器的。&lt;/p&gt;
&lt;h2 id="kubernetes-有如下几个核心的功能"&gt;Kubernetes 有如下几个核心的功能&lt;/h2&gt;
&lt;h2 id="what-happened"&gt;What happened?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;服务的发现与负载的均衡；&lt;/li&gt;
&lt;li&gt;容器的自动装箱，我们也会把它叫做 scheduling，就是“调度”，把一个容器放到一个集群的某一个机器上，Kubernetes 会帮助我们去做存储的编排，让存储的声明周期与容器的生命周期能有一个连接；&lt;/li&gt;
&lt;li&gt;Kubernetes 会帮助我们去做自动化的容器的恢复。在一个集群中，经常会出现宿主机的问题或者说是 OS 的问题，导致容器本身的不可用，Kubernetes 会自动地对这些不可用的容器进行恢复；&lt;/li&gt;
&lt;li&gt;Kubernetes 会帮助我们去做应用的自动发布与应用的回滚，以及与应用相关的配置密文的管理；&lt;/li&gt;
&lt;li&gt;对于 job 类型任务，Kubernetes 可以去做批量的执行；&lt;/li&gt;
&lt;li&gt;为了让这个集群、这个应用更富有弹性，Kubernetes 也支持水平的伸缩。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;下面，我们希望以三个例子跟大家更切实地介绍一下 Kubernetes 的能力。&lt;/p&gt;
&lt;h3 id="调度"&gt;调度&lt;/h3&gt;
&lt;p&gt;Kubernetes 可以把用户提交的容器放到 Kubernetes 管理的集群的某一台节点上去。Kubernetes 的调度器是执行这项能力的组件，它会观察正在被调度的这个容器的大小、规格。&lt;/p&gt;
&lt;p&gt;比如说它所需要的 CPU以及它所需要的 memory，然后在集群中找一台相对比较空闲的机器来进行一次 placement，也就是一次放置的操作。在这个例子中，它可能会把红颜色的这个容器放置到第二个空闲的机器上，来完成一次调度的工作。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://go.botsarena.tech/pictures/study-disign/22de0d29d0c70ac8a8f3.webp" alt="avatar"&gt;&lt;/p&gt;
&lt;h3 id="自动修复"&gt;自动修复&lt;/h3&gt;
&lt;p&gt;Kubernetes 有一个节点健康检查的功能，它会监测这个集群中所有的宿主机，当宿主机本身出现故障，或者软件出现故障的时候，这个节点健康检查会自动对它进行发现。&lt;/p&gt;
&lt;p&gt;下面 Kubernetes 会把运行在这些失败节点上的容器进行自动迁移，迁移到一个正在健康运行的宿主机上，来完成集群内容器的一个自动恢复。&lt;/p&gt;</description></item><item><title>04 理解 Pod 和容器设计模式</title><link>https://go.botsarena.tech/docs/resources/cloud-native-web3-fulltext/cncf-alibaba-cloud-native-course/004/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://go.botsarena.tech/docs/resources/cloud-native-web3-fulltext/cncf-alibaba-cloud-native-course/004/</guid><description>&lt;div class="goclub-source-note"&gt;来源：&lt;a href="https://study.disign.me/document/CNCF%20X%20%e9%98%bf%e9%87%8c%e5%b7%b4%e5%b7%b4%e4%ba%91%e5%8e%9f%e7%94%9f%e6%8a%80%e6%9c%af%e5%85%ac%e5%bc%80%e8%af%be/04%20%e7%90%86%e8%a7%a3%20Pod%20%e5%92%8c%e5%ae%b9%e5%99%a8%e8%ae%be%e8%ae%a1%e6%a8%a1%e5%bc%8f.md" target="_blank" rel="noopener noreferrer"&gt;技术书栈原文&lt;/a&gt;。本页按授权迁移至 GoClub。&lt;/div&gt;
&lt;h1 id="04-理解-pod-和容器设计模式"&gt;04 理解 Pod 和容器设计模式&lt;/h1&gt;
&lt;h2 id="为什么需要-pod"&gt;为什么需要 Pod&lt;/h2&gt;
&lt;h3 id="容器的基本概念"&gt;容器的基本概念&lt;/h3&gt;
&lt;p&gt;现在来看第一个问题：为什么需要 Pod？我们知道 Pod 是 Kubernetes 项目里面一个非常重要的概念，也是非常重要的一个原子调度单位，但是为什么我们会需要这样一个概念呢？我们在使用容器 Docker 的时候，也没有这个说法。其实如果要理解 Pod，我们首先要理解容器，所以首先来回顾一下容器的概念：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;容器的本质实际上是一个进程，是一个视图被隔离，资源受限的进程。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;容器里面 PID=1 的进程就是应用本身，这意味着管理虚拟机等于管理基础设施，因为我们是在管理机器，但管理容器却等于直接管理应用本身。这也是之前说过的不可变基础设施的一个最佳体现，这个时候，你的应用就等于你的基础设施，它一定是不可变的。&lt;/p&gt;
&lt;p&gt;在以上面的例子为前提的情况下，Kubernetes 又是什么呢？我们知道，很多人都说 Kubernetes 是云时代的操作系统，这个非常有意思，因为如果以此类推，容器镜像就是这个操作系统的软件安装包，它们之间是这样的一个类比关系。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://go.botsarena.tech/pictures/study-disign/2d1d64f1acbb5e8df0c0.webp" alt="avatar"&gt;&lt;/p&gt;
&lt;h3 id="真实操作系统里的例子"&gt;真实操作系统里的例子&lt;/h3&gt;
&lt;p&gt;如果说 Kubernetes 就是操作系统的话，那么我们不妨看一下真实的操作系统的例子。&lt;/p&gt;
&lt;p&gt;例子里面有一个程序叫做 Helloworld，这个 Helloworld 程序实际上是由一组进程组成的，需要注意一下，这里说的进程实际上等同于 Linux 中的线程。&lt;/p&gt;
&lt;p&gt;因为 Linux 中的线程是轻量级进程，所以如果从 Linux 系统中去查看 Helloworld 中的 pstree，将会看到这个 Helloworld 实际上是由四个线程组成的，分别是 &lt;strong&gt;{api、main、log、compute}&lt;/strong&gt;。也就是说，四个这样的线程共同协作，共享 Helloworld 程序的资源，组成了 Helloworld 程序的真实工作情况。&lt;/p&gt;
&lt;p&gt;这是操作系统里面进程组或者线程组中一个非常真实的例子，以上就是进程组的一个概念。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://go.botsarena.tech/pictures/study-disign/d62494da4e8d6366c1fc.webp" alt="avatar"&gt;&lt;/p&gt;
&lt;p&gt;那么大家不妨思考一下，在真实的操作系统里面，一个程序往往是根据进程组来进行管理的。Kubernetes 把它类比为一个操作系统，比如说 Linux。针对于容器我们前面提到可以类比为进程，就是前面的 Linux 线程。那么 Pod 又是什么呢？实际上 Pod 就是我们刚刚提到的进程组，也就是 Linux 里的线程组。&lt;/p&gt;
&lt;h3 id="进程组概念"&gt;进程组概念&lt;/h3&gt;
&lt;p&gt;说到进程组，首先建议大家至少有个概念上的理解，然后我们再详细的解释一下。&lt;/p&gt;
&lt;p&gt;还是前面那个例子：Helloworld 程序由四个进程组成，这些进程之间会共享一些资源和文件。那么现在有一个问题：假如说现在把 Helloworld 程序用容器跑起来，你会怎么去做？&lt;/p&gt;</description></item><item><title>05 应用编排与管理：核心原理</title><link>https://go.botsarena.tech/docs/resources/cloud-native-web3-fulltext/cncf-alibaba-cloud-native-course/005/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://go.botsarena.tech/docs/resources/cloud-native-web3-fulltext/cncf-alibaba-cloud-native-course/005/</guid><description>&lt;div class="goclub-source-note"&gt;来源：&lt;a href="https://study.disign.me/document/CNCF%20X%20%e9%98%bf%e9%87%8c%e5%b7%b4%e5%b7%b4%e4%ba%91%e5%8e%9f%e7%94%9f%e6%8a%80%e6%9c%af%e5%85%ac%e5%bc%80%e8%af%be/05%20%e5%ba%94%e7%94%a8%e7%bc%96%e6%8e%92%e4%b8%8e%e7%ae%a1%e7%90%86%ef%bc%9a%e6%a0%b8%e5%bf%83%e5%8e%9f%e7%90%86.md" target="_blank" rel="noopener noreferrer"&gt;技术书栈原文&lt;/a&gt;。本页按授权迁移至 GoClub。&lt;/div&gt;
&lt;h1 id="05-应用编排与管理-核心原理"&gt;05 应用编排与管理：核心原理&lt;/h1&gt;
&lt;h2 id="资源元信息"&gt;资源元信息&lt;/h2&gt;
&lt;h3 id="1-kubernetes-资源对象"&gt;1. Kubernetes 资源对象&lt;/h3&gt;
&lt;p&gt;首先，我们来回顾一下 Kubernetes 的资源对象组成：主要包括了 Spec、Status 两部分。其中 Spec 部分用来描述期望的状态，Status 部分用来描述观测到的状态。&lt;/p&gt;
&lt;p&gt;今天我们将为大家介绍 K8s 的另外一个部分，即元数据部分。该部分主要包括了用来识别资源的标签：Labels， 用来描述资源的注解；Annotations， 用来描述多个资源之间相互关系的 OwnerReference。这些元数据在 K8s 运行中有非常重要的作用。后续课程中将会反复讲到。&lt;/p&gt;
&lt;h3 id="2-labels"&gt;2. labels&lt;/h3&gt;
&lt;p&gt;第一个元数据，也是最重要的一个元数据是：资源标签。资源标签是一种具有标识型的 Key：Value 元数据，这里展示了几个常见的标签。&lt;/p&gt;
&lt;p&gt;前三个标签都打在了 Pod 对象上，分别标识了对应的应用环境、发布的成熟度和应用的版本。从应用标签的例子可以看到，标签的名字包括了一个域名的前缀，用来描述打标签的系统和工具， 最后一个标签打在 Node 对象上，还在域名前增加了版本的标识 beta 字符串。&lt;/p&gt;
&lt;p&gt;标签主要用来筛选资源和组合资源，可以使用类似于 SQL 查询 select，来根据 Label 查询相关的资源。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://go.botsarena.tech/pictures/study-disign/5420da16084922811b9b.webp" alt="avatar"&gt;&lt;/p&gt;
&lt;h3 id="3-selector"&gt;3. Selector&lt;/h3&gt;
&lt;p&gt;最常见的 Selector 就是相等型 Selector。现在举一个简单的例子：&lt;/p&gt;
&lt;p&gt;假设系统中有四个 Pod，每个 Pod 都有标识系统层级和环境的标签，我们通过 Tie：front 这个标签，可以匹配左边栏的 Pod，相等型 Selector 还可以包括多个相等条件，多个相等条件之间是逻辑”与“的关系。&lt;/p&gt;
&lt;p&gt;在刚才的例子中，通过 Tie=front,Env=dev 的Selector，我们可以筛选出所有 Tie=front，而且 Env=dev 的 Pod，也就是下图中左上角的 Pod。另外一种 Selector 是集合型 Selector，在例子中，Selector 筛选所有环境是 test 或者 gray 的 Pod。&lt;/p&gt;</description></item><item><title>06 应用编排与管理</title><link>https://go.botsarena.tech/docs/resources/cloud-native-web3-fulltext/cncf-alibaba-cloud-native-course/006/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://go.botsarena.tech/docs/resources/cloud-native-web3-fulltext/cncf-alibaba-cloud-native-course/006/</guid><description>&lt;div class="goclub-source-note"&gt;来源：&lt;a href="https://study.disign.me/document/CNCF%20X%20%e9%98%bf%e9%87%8c%e5%b7%b4%e5%b7%b4%e4%ba%91%e5%8e%9f%e7%94%9f%e6%8a%80%e6%9c%af%e5%85%ac%e5%bc%80%e8%af%be/06%20%e5%ba%94%e7%94%a8%e7%bc%96%e6%8e%92%e4%b8%8e%e7%ae%a1%e7%90%86.md" target="_blank" rel="noopener noreferrer"&gt;技术书栈原文&lt;/a&gt;。本页按授权迁移至 GoClub。&lt;/div&gt;
&lt;h1 id="06-应用编排与管理"&gt;06 应用编排与管理&lt;/h1&gt;
&lt;h2 id="需求来源"&gt;需求来源&lt;/h2&gt;
&lt;h3 id="背景问题"&gt;背景问题&lt;/h3&gt;
&lt;p&gt;首先，我们来看一下背景问题。如下图所示：如果我们直接管理集群中所有的 Pod，应用 A、B、C 的 Pod，其实是散乱地分布在集群中。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://go.botsarena.tech/pictures/study-disign/1f00b4186acdf41b93ff.webp" alt="在这里插入图片描述"&gt;&lt;/p&gt;
&lt;p&gt;现在有以下的问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;首先，如何保证集群内可用 Pod 的数量？也就是说我们应用 A 四个 Pod 如果出现了一些宿主机故障，或者一些网络问题，如何能保证它可用的数量？&lt;/li&gt;
&lt;li&gt;如何为所有 Pod 更新镜像版本？我们是否要某一个 Pod 去重建新版本的 Pod？&lt;/li&gt;
&lt;li&gt;然后在更新过程中，如何保证服务的可用性？&lt;/li&gt;
&lt;li&gt;以及更新过程中，如果发现了问题，如何快速回滚到上一个版本？&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="deployment-管理部署发布的控制器"&gt;Deployment：管理部署发布的控制器&lt;/h3&gt;
&lt;p&gt;这里就引入了我们今天课程的主题：Deployment 管理部署发布的控制器。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://go.botsarena.tech/pictures/study-disign/1f00b4186acdf41b93ff.webp" alt="avatar"&gt;&lt;/p&gt;
&lt;p&gt;可以看到我们通过 Deployment 将应用 A、B、C 分别规划到不同的 Deployment 中，每个 Deployment 其实是管理的一组相同的应用 Pod，这组 Pod 我们认为它是相同的一个副本，那么 Deployment 能帮我们做什么事情呢？&lt;/p&gt;
&lt;p&gt;首先，Deployment 定义了一种 Pod 期望数量，比如说应用 A，我们期望 Pod 数量是四个，那么这样的话，controller 就会持续维持 Pod 数量为期望的数量。当我们与 Pod 出现了网络问题或者宿主机问题的话，controller 能帮我们恢复，也就是新扩出来对应的 Pod，来保证可用的 Pod 数量与期望数量一致；&lt;/p&gt;
&lt;p&gt;配置 Pod 发布方式，也就是说 controller 会按照用户给定的策略来更新 Pod，而且更新过程中，也可以设定不可用 Pod 数量在多少范围内；&lt;/p&gt;</description></item><item><title>07 应用编排与管理：Job &amp; DaemonSet</title><link>https://go.botsarena.tech/docs/resources/cloud-native-web3-fulltext/cncf-alibaba-cloud-native-course/007/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://go.botsarena.tech/docs/resources/cloud-native-web3-fulltext/cncf-alibaba-cloud-native-course/007/</guid><description>&lt;div class="goclub-source-note"&gt;来源：&lt;a href="https://study.disign.me/document/CNCF%20X%20%e9%98%bf%e9%87%8c%e5%b7%b4%e5%b7%b4%e4%ba%91%e5%8e%9f%e7%94%9f%e6%8a%80%e6%9c%af%e5%85%ac%e5%bc%80%e8%af%be/07%20%e5%ba%94%e7%94%a8%e7%bc%96%e6%8e%92%e4%b8%8e%e7%ae%a1%e7%90%86%ef%bc%9aJob%20&amp;amp;%20DaemonSet.md" target="_blank" rel="noopener noreferrer"&gt;技术书栈原文&lt;/a&gt;。本页按授权迁移至 GoClub。&lt;/div&gt;
&lt;h1 id="07-应用编排与管理-job-amp-daemonset"&gt;07 应用编排与管理：Job &amp;amp; DaemonSet&lt;/h1&gt;
&lt;h2 id="job"&gt;Job&lt;/h2&gt;
&lt;h3 id="需求来源"&gt;需求来源&lt;/h3&gt;
&lt;h4 id="job-背景问题"&gt;Job 背景问题&lt;/h4&gt;
&lt;p&gt;首先我们来看一下 Job 的需求来源。我们知道 K8s 里面，最小的调度单元是 Pod，我们可以直接通过 Pod 来运行任务进程。这样做将会产生以下几种问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;我们如何保证 Pod 内进程正确的结束？&lt;/li&gt;
&lt;li&gt;如何保证进程运行失败后重试？&lt;/li&gt;
&lt;li&gt;如何管理多个任务，且任务之间有依赖关系？&lt;/li&gt;
&lt;li&gt;如何并行地运行任务，并管理任务的队列大小？&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="job-管理任务的控制器"&gt;Job：管理任务的控制器&lt;/h4&gt;
&lt;p&gt;我们来看一下 Kubernetes 的 Job 为我们提供了什么功能：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;首先 kubernetes 的 Job 是一个管理任务的控制器，它可以创建一个或多个 Pod 来指定 Pod 的数量，并可以监控它是否成功地运行或终止；&lt;/li&gt;
&lt;li&gt;我们可以根据 Pod 的状态来给 Job 设置重置的方式及重试的次数；&lt;/li&gt;
&lt;li&gt;我们还可以根据依赖关系，保证上一个任务运行完成之后再运行下一个任务；&lt;/li&gt;
&lt;li&gt;同时还可以控制任务的并行度，根据并行度来确保 Pod 运行过程中的并行次数和总体完成大小。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="用例解读"&gt;用例解读&lt;/h3&gt;
&lt;p&gt;我们根据一个实例来看一下Job是如何来完成下面的应用的。&lt;/p&gt;
&lt;h4 id="job-语法"&gt;Job 语法&lt;/h4&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://go.botsarena.tech/pictures/study-disign/b640adccf558c2d49885.webp" alt="avatar"&gt;&lt;/p&gt;
&lt;p&gt;上图是 Job 最简单的一个 yaml 格式，这里主要新引入了一个 kind 叫 Job，这个 Job 其实就是 job-controller 里面的一种类型。 然后 metadata 里面的 name 来指定这个 Job 的名称，下面 spec.template 里面其实就是 pod 的 spec。&lt;/p&gt;</description></item><item><title>08 应用配置管理</title><link>https://go.botsarena.tech/docs/resources/cloud-native-web3-fulltext/cncf-alibaba-cloud-native-course/008/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://go.botsarena.tech/docs/resources/cloud-native-web3-fulltext/cncf-alibaba-cloud-native-course/008/</guid><description>&lt;div class="goclub-source-note"&gt;来源：&lt;a href="https://study.disign.me/document/CNCF%20X%20%e9%98%bf%e9%87%8c%e5%b7%b4%e5%b7%b4%e4%ba%91%e5%8e%9f%e7%94%9f%e6%8a%80%e6%9c%af%e5%85%ac%e5%bc%80%e8%af%be/08%20%e5%ba%94%e7%94%a8%e9%85%8d%e7%bd%ae%e7%ae%a1%e7%90%86.md" target="_blank" rel="noopener noreferrer"&gt;技术书栈原文&lt;/a&gt;。本页按授权迁移至 GoClub。&lt;/div&gt;
&lt;h1 id="08-应用配置管理"&gt;08 应用配置管理&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;本节课程要点&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ConfigMaps 和 Secret 资源的创建和使用；&lt;/li&gt;
&lt;li&gt;Pod 身份认证的实现和原理；&lt;/li&gt;
&lt;li&gt;容器资源、安全、前置校验等配置和使用。
细分为以下八个方面：&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://go.botsarena.tech/pictures/study-disign/95674c6c2b89e26edcbf.webp" alt="avatar"&gt;&lt;/p&gt;
&lt;h2 id="需求来源"&gt;需求来源&lt;/h2&gt;
&lt;h3 id="背景问题"&gt;背景问题&lt;/h3&gt;
&lt;p&gt;首先一起来看一下需求来源。大家应该都有过这样的经验，就是用一个容器镜像来启动一个 container。要启动这个容器，其实有很多需要配套的问题待解决：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第一，比如说一些可变的配置。因为我们不可能把一些可变的配置写到镜像里面，当这个配置需要变化的时候，可能需要我们重新编译一次镜像，这个肯定是不能接受的；&lt;/li&gt;
&lt;li&gt;第二就是一些敏感信息的存储和使用。比如说应用需要使用一些密码，或者用一些 token；&lt;/li&gt;
&lt;li&gt;第三就是我们容器要访问集群自身。比如我要访问 kube-apiserver，那么本身就有一个身份认证的问题；&lt;/li&gt;
&lt;li&gt;第四就是容器在节点上运行之后，它的资源需求；&lt;/li&gt;
&lt;li&gt;第五个就是容器在节点上，它们是共享内核的，那么它的一个安全管控怎么办？&lt;/li&gt;
&lt;li&gt;最后一点我们说一下容器启动之前的一个前置条件检验。比如说，一个容器启动之前，我可能要确认一下 DNS 服务是不是好用？又或者确认一下网络是不是联通的？那么这些其实就是一些前置的校验。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="pod-的配置管理"&gt;Pod 的配置管理&lt;/h3&gt;
&lt;p&gt;在 Kubernetes 里面，它是怎么做这些配置管理的呢？如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://go.botsarena.tech/pictures/study-disign/4d9367038b7effc90cda.webp" alt="avatar"&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;可变配置就用 ConfigMap；&lt;/li&gt;
&lt;li&gt;敏感信息是用 Secret；&lt;/li&gt;
&lt;li&gt;身份认证是用 ServiceAccount 这几个独立的资源来实现的；&lt;/li&gt;
&lt;li&gt;资源配置是用 Resources；&lt;/li&gt;
&lt;li&gt;安全管控是用 SecurityContext；&lt;/li&gt;
&lt;li&gt;前置校验是用 InitContainers 这几个在 spec 里面加的字段，来实现的这些配置管理。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="configmap"&gt;ConfigMap&lt;/h2&gt;
&lt;h3 id="configmap-介绍"&gt;ConfigMap 介绍&lt;/h3&gt;
&lt;p&gt;下面我们来介绍第一个部分，就是 ConfigMap。我们先来介绍 ConfigMap 它是用来做什么的、以及它带来的一个好处。它其实主要是管理一些可变配置信息，比如说我们应用的一些配置文件，或者说它里面的一些环境变量，或者一些命令行参数。&lt;/p&gt;
&lt;p&gt;它的好处在于它可以让一些可变配置和容器镜像进行解耦，这样也保证了容器的可移植性。看一下下图中右边的编排文件截图。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://go.botsarena.tech/pictures/study-disign/ec90585203e203b3c4f2.webp" alt="avatar"&gt;&lt;/p&gt;
&lt;p&gt;这是 ConfigMap 本身的一个定义，它包括两个部分：一个是 ConfigMap 元信息，我们关注 name 和 namespace 这两个信息。接下来这个 data 里面，可以看到它管理了两个配置文件。它的结构其实是这样的：从名字看ConfigMap中包含Map单词，Map 其实就是 key:value，key 是一个文件名，value 是这个文件的内容。&lt;/p&gt;</description></item><item><title>09 应用存储和持久化数据卷：核心知识</title><link>https://go.botsarena.tech/docs/resources/cloud-native-web3-fulltext/cncf-alibaba-cloud-native-course/009/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://go.botsarena.tech/docs/resources/cloud-native-web3-fulltext/cncf-alibaba-cloud-native-course/009/</guid><description>&lt;div class="goclub-source-note"&gt;来源：&lt;a href="https://study.disign.me/document/CNCF%20X%20%e9%98%bf%e9%87%8c%e5%b7%b4%e5%b7%b4%e4%ba%91%e5%8e%9f%e7%94%9f%e6%8a%80%e6%9c%af%e5%85%ac%e5%bc%80%e8%af%be/09%20%e5%ba%94%e7%94%a8%e5%ad%98%e5%82%a8%e5%92%8c%e6%8c%81%e4%b9%85%e5%8c%96%e6%95%b0%e6%8d%ae%e5%8d%b7%ef%bc%9a%e6%a0%b8%e5%bf%83%e7%9f%a5%e8%af%86.md" target="_blank" rel="noopener noreferrer"&gt;技术书栈原文&lt;/a&gt;。本页按授权迁移至 GoClub。&lt;/div&gt;
&lt;h1 id="09-应用存储和持久化数据卷-核心知识"&gt;09 应用存储和持久化数据卷：核心知识&lt;/h1&gt;
&lt;h2 id="volumes-介绍"&gt;Volumes 介绍&lt;/h2&gt;
&lt;h3 id="pod-volumes"&gt;Pod Volumes&lt;/h3&gt;
&lt;p&gt;首先来看一下 Pod Volumes 的使用场景：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;场景一：如果 pod 中的某一个容器在运行时异常退出，被 kubelet 重新拉起之后，如何保证之前容器产生的重要数据没有丢失？&lt;/li&gt;
&lt;li&gt;场景二：如果同一个 pod 中的多个容器想要共享数据，应该如何去做？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以上两个场景，其实都可以借助 Volumes 来很好地解决，接下来首先看一下 Pod Volumes 的常见类型：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;本地存储，常用的有 emptydir/hostpath；&lt;/li&gt;
&lt;li&gt;网络存储：网络存储当前的实现方式有两种，一种是 in-tree，它的实现的代码是放在 K8s 代码仓库中的，随着k8s对存储类型支持的增多，这种方式会给k8s本身的维护和发展带来很大的负担；而第二种实现方式是 out-of-tree，它的实现其实是给 K8s 本身解耦的，通过抽象接口将不同存储的driver实现从k8s代码仓库中剥离，因此out-of-tree 是后面社区主推的一种实现网络存储插件的方式；&lt;/li&gt;
&lt;li&gt;Projected Volumes：它其实是将一些配置信息，如 secret/configmap 用卷的形式挂载在容器中，让容器中的程序可以通过POSIX接口来访问配置数据；&lt;/li&gt;
&lt;li&gt;PV 与 PVC 就是今天要重点介绍的内容。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="persistent-volumes"&gt;Persistent Volumes&lt;/h3&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://go.botsarena.tech/pictures/study-disign/90602637afdb1fb13312.webp" alt="avatar"&gt;&lt;/p&gt;
&lt;p&gt;接下来看一下 PV（Persistent Volumes）。既然已经有了 Pod Volumes，为什么又要引入 PV 呢？我们知道 pod 中声明的 volume 生命周期与 pod 是相同的，以下有几种常见的场景：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;场景一：pod 重建销毁，如用 Deployment 管理的 pod，在做镜像升级的过程中，会产生新的 pod并且删除旧的 pod ，那新旧 pod 之间如何复用数据？&lt;/li&gt;
&lt;li&gt;场景二：宿主机宕机的时候，要把上面的 pod 迁移，这个时候 StatefulSet 管理的 pod，其实已经实现了带卷迁移的语义。这时通过 Pod Volumes 显然是做不到的；&lt;/li&gt;
&lt;li&gt;场景三：多个 pod 之间，如果想要共享数据，应该如何去声明呢？我们知道，同一个 pod 中多个容器想共享数据，可以借助 Pod Volumes 来解决；当多个 pod 想共享数据时，Pod Volumes 就很难去表达这种语义；&lt;/li&gt;
&lt;li&gt;场景四：如果要想对数据卷做一些功能扩展性，如：snapshot、resize 这些功能，又应该如何去做呢？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以上场景中，通过 Pod Volumes 很难准确地表达它的复用/共享语义，对它的扩展也比较困难。因此 K8s 中又引入了 **Persistent Volumes **概念，它可以将存储和计算分离，通过不同的组件来管理存储资源和计算资源，然后解耦 pod 和 Volume 之间生命周期的关联。这样，当把 pod 删除之后，它使用的PV仍然存在，还可以被新建的 pod 复用。&lt;/p&gt;</description></item><item><title>10 应用存储和持久化数据卷：存储快照与拓扑调度(至天)</title><link>https://go.botsarena.tech/docs/resources/cloud-native-web3-fulltext/cncf-alibaba-cloud-native-course/010/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://go.botsarena.tech/docs/resources/cloud-native-web3-fulltext/cncf-alibaba-cloud-native-course/010/</guid><description>&lt;div class="goclub-source-note"&gt;来源：&lt;a href="https://study.disign.me/document/CNCF%20X%20%e9%98%bf%e9%87%8c%e5%b7%b4%e5%b7%b4%e4%ba%91%e5%8e%9f%e7%94%9f%e6%8a%80%e6%9c%af%e5%85%ac%e5%bc%80%e8%af%be/10%20%e5%ba%94%e7%94%a8%e5%ad%98%e5%82%a8%e5%92%8c%e6%8c%81%e4%b9%85%e5%8c%96%e6%95%b0%e6%8d%ae%e5%8d%b7%ef%bc%9a%e5%ad%98%e5%82%a8%e5%bf%ab%e7%85%a7%e4%b8%8e%e6%8b%93%e6%89%91%e8%b0%83%e5%ba%a6%28%e8%87%b3%e5%a4%a9%29.md" target="_blank" rel="noopener noreferrer"&gt;技术书栈原文&lt;/a&gt;。本页按授权迁移至 GoClub。&lt;/div&gt;
&lt;h1 id="10-应用存储和持久化数据卷-存储快照与拓扑调度-至天"&gt;10 应用存储和持久化数据卷：存储快照与拓扑调度(至天)&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;本文将主要分享以下两方面的内容：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;存储快照概念、使用与工作原理；&lt;/li&gt;
&lt;li&gt;存储拓扑调度背景、概念、使用与工作原理。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="基本知识"&gt;基本知识&lt;/h2&gt;
&lt;h3 id="存储快照产生背景"&gt;存储快照产生背景&lt;/h3&gt;
&lt;p&gt;在使用存储时，为了提高数据操作的容错性，我们通常有需要对线上数据进行snapshot，以及能快速restore的能力。另外，当需要对线上数据进行快速的复制以及迁移等动作，如进行环境的复制、数据开发等功能时，都可以通过存储快照来满足需求，而 K8s 中通过 CSI Snapshotter controller 来实现存储快照的功能。&lt;/p&gt;
&lt;h3 id="存储快照用户接口-snapshot"&gt;存储快照用户接口-Snapshot&lt;/h3&gt;
&lt;p&gt;我们知道，K8s 中通过 pvc 以及 pv 的设计体系来简化用户对存储的使用，而存储快照的设计其实是仿照 pvc &amp;amp; pv 体系的设计思想。当用户需要存储快照的功能时，可以通过 VolumeSnapshot 对象来声明，并指定相应的 VolumeSnapshotClass 对象，之后由集群中的相关组件动态生成存储快照以及存储快照对应的对象 VolumeSnapshotContent。如下对比图所示，动态生成 VolumeSnapshotContent 和动态生成 pv 的流程是非常相似的。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://go.botsarena.tech/pictures/study-disign/2e9cf0f588e84b199dcb.webp" alt="avatar"&gt;&lt;/p&gt;
&lt;h3 id="存储快照用户接口-restore"&gt;存储快照用户接口-Restore&lt;/h3&gt;
&lt;p&gt;有了存储快照之后，如何将快照数据快速恢复过来呢？如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://go.botsarena.tech/pictures/study-disign/9cde45d0d0334d5b3aa9.webp" alt="avatar"&gt;&lt;/p&gt;
&lt;p&gt;如上所示的流程，可以借助 PVC 对象将其的 dataSource 字段指定为 VolumeSnapshot 对象。这样当 PVC 提交之后，会由集群中的相关组件找到 dataSource 所指向的存储快照数据，然后新创建对应的存储以及 pv 对象，将存储快照数据恢复到新的 pv 中，这样数据就恢复回来了，这就是存储快照的restore用法。&lt;/p&gt;
&lt;h3 id="topolopy-含义"&gt;Topolopy-含义&lt;/h3&gt;
&lt;p&gt;首先了解一下拓扑是什么意思：这里所说的拓扑是 K8s 集群中为管理的 nodes 划分的一种“位置”关系，意思为：可以通过在 node 的 labels 信息里面填写某一个 node 属于某一个拓扑。&lt;/p&gt;
&lt;p&gt;常见的有三种，这三种在使用时经常会遇到的：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第一种，在使用云存储服务的时候，经常会遇到 &lt;strong&gt;region&lt;/strong&gt;，也就是地区的概念，在 K8s 中常通过 label failure-domain.beta.kubernetes.io/region 来标识。这个是为了标识单个 K8s 集群管理的跨 region 的 nodes 到底属于哪个地区；&lt;/li&gt;
&lt;li&gt;第二种，比较常用的是可用区，也就是 available &lt;strong&gt;zone&lt;/strong&gt;，在 K8s 中常通过 label failure-domain.beta.kubernetes.io/zone 来标识。这个是为了标识单个 K8s 集群管理的跨 zone 的 nodes 到底属于哪个可用区；&lt;/li&gt;
&lt;li&gt;第三种，是 &lt;strong&gt;hostname，&lt;/strong&gt;就是单机维度，是拓扑域为 node 范围，在 K8s 中常通过 label kubernetes.io/hostname 来标识，这个在文章的最后讲 local pv 的时候，会再详细描述。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;上面讲到的三个拓扑是比较常用的，而拓扑其实是可以自己定义的。可以定义一个字符串来表示一个拓扑域，这个 key 所对应的值其实就是拓扑域下不同的拓扑位置。&lt;/p&gt;</description></item><item><title>11 可观测性：你的应用健康吗？（莫源）</title><link>https://go.botsarena.tech/docs/resources/cloud-native-web3-fulltext/cncf-alibaba-cloud-native-course/011/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://go.botsarena.tech/docs/resources/cloud-native-web3-fulltext/cncf-alibaba-cloud-native-course/011/</guid><description>&lt;div class="goclub-source-note"&gt;来源：&lt;a href="https://study.disign.me/document/CNCF%20X%20%e9%98%bf%e9%87%8c%e5%b7%b4%e5%b7%b4%e4%ba%91%e5%8e%9f%e7%94%9f%e6%8a%80%e6%9c%af%e5%85%ac%e5%bc%80%e8%af%be/11%20%e5%8f%af%e8%a7%82%e6%b5%8b%e6%80%a7%ef%bc%9a%e4%bd%a0%e7%9a%84%e5%ba%94%e7%94%a8%e5%81%a5%e5%ba%b7%e5%90%97%ef%bc%9f%ef%bc%88%e8%8e%ab%e6%ba%90%ef%bc%89.md" target="_blank" rel="noopener noreferrer"&gt;技术书栈原文&lt;/a&gt;。本页按授权迁移至 GoClub。&lt;/div&gt;
&lt;h1 id="11-可观测性-你的应用健康吗-莫源"&gt;11 可观测性：你的应用健康吗？（莫源）&lt;/h1&gt;
&lt;p&gt;本次课程的分享主要围绕以下五个部分：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;介绍一些整体需求的来源；&lt;/li&gt;
&lt;li&gt;介绍在 K8s 中 Liveness 和 Readiness 的使用方式；&lt;/li&gt;
&lt;li&gt;介绍在 K8s 中常见问题的诊断；&lt;/li&gt;
&lt;li&gt;应用的远程调试的方式；&lt;/li&gt;
&lt;li&gt;课程的总结与实践；&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="需求来源"&gt;需求来源&lt;/h2&gt;
&lt;p&gt;首先来看一下，整个需求的来源：当把应用迁移到 Kubernetes 之后，要如何去保障应用的健康与稳定呢？其实很简单，可以从两个方面来进行增强：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;首先是提高应用的可观测性；&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;第二是提高应用的可恢复能力。
从可观测性上来讲，可以在三个方面来去做增强：&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;首先是应用的健康状态上面，可以实时地进行观测；&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;第二个是可以获取应用的资源使用情况；&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;第三个是可以拿到应用的实时日志，进行问题的诊断与分析。
当出现了问题之后，首先要做的事情是要降低影响的范围，进行问题的调试与诊断。最后当出现问题的时候，理想的状况是：可以通过和 K8s 集成的自愈机制进行完整的恢复。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="liveness-与-readiness"&gt;Liveness 与 Readiness&lt;/h2&gt;
&lt;p&gt;本小节为大家介绍 Liveness probe 和 eadiness probe。&lt;/p&gt;
&lt;h3 id="应用健康状态-初识-liveness-与-readiness"&gt;应用健康状态-初识 Liveness 与 Readiness&lt;/h3&gt;
&lt;p&gt;Liveness probe 也叫就绪指针，用来判断一个 pod 是否处在就绪状态。当一个 pod 处在就绪状态的时候，它才能够对外提供相应的服务，也就是说接入层的流量才能打到相应的 pod。当这个 pod 不处在就绪状态的时候，接入层会把相应的流量从这个 pod 上面进行摘除。&lt;/p&gt;
&lt;p&gt;来看一下简单的一个例子：&lt;/p&gt;
&lt;p&gt;如下图其实就是一个 Readiness 就绪的一个例子：&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://go.botsarena.tech/pictures/study-disign/e2fda3722911575d8e55.webp" alt="avatar"&gt;&lt;/p&gt;
&lt;p&gt;当这个 pod 指针判断一直处在失败状态的时候，其实接入层的流量不会打到现在这个 pod 上。&lt;/p&gt;</description></item><item><title>12 可观测性-监控与日志（莫源）</title><link>https://go.botsarena.tech/docs/resources/cloud-native-web3-fulltext/cncf-alibaba-cloud-native-course/012/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://go.botsarena.tech/docs/resources/cloud-native-web3-fulltext/cncf-alibaba-cloud-native-course/012/</guid><description>&lt;div class="goclub-source-note"&gt;来源：&lt;a href="https://study.disign.me/document/CNCF%20X%20%e9%98%bf%e9%87%8c%e5%b7%b4%e5%b7%b4%e4%ba%91%e5%8e%9f%e7%94%9f%e6%8a%80%e6%9c%af%e5%85%ac%e5%bc%80%e8%af%be/12%20%e5%8f%af%e8%a7%82%e6%b5%8b%e6%80%a7-%e7%9b%91%e6%8e%a7%e4%b8%8e%e6%97%a5%e5%bf%97%ef%bc%88%e8%8e%ab%e6%ba%90%ef%bc%89.md" target="_blank" rel="noopener noreferrer"&gt;技术书栈原文&lt;/a&gt;。本页按授权迁移至 GoClub。&lt;/div&gt;
&lt;h1 id="12-可观测性-监控与日志-莫源"&gt;12 可观测性-监控与日志（莫源）&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;本文主要分为四个部分：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在 K8s 中监控和日志的背景信息；&lt;/li&gt;
&lt;li&gt;在 K8s 中监控方案的演进，以及常见的监控方案的提供；&lt;/li&gt;
&lt;li&gt;日志采集的一些细节以及常见的日志的开源系统；&lt;/li&gt;
&lt;li&gt;课程总结，介绍一下阿里云容器服务上面监控和日志的最佳实践。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;p&gt;监控和日志是大型分布式系统的重要&lt;strong&gt;基础设施&lt;/strong&gt;，监控可以帮助开发者查看系统的运行状态，而日志可以协助问题的排查和诊断。&lt;/p&gt;
&lt;p&gt;在 Kubernetes 中，监控和日志属于生态的一部分，它并不是核心组件，因此大部分的能力依赖上层的云厂商的适配。Kubernetes 定义了介入的接口标准和规范，任何符合接口标准的组件都可以快速集成。&lt;/p&gt;
&lt;h2 id="监控"&gt;监控&lt;/h2&gt;
&lt;h3 id="监控类型"&gt;监控类型&lt;/h3&gt;
&lt;p&gt;先看一下监控，从监控类型上划分，在 K8s 中可以分成四个不同的类型：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;资源监控&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;比较常见的像 CPU、内存、网络这种资源类的一个指标，通常这些指标会以数值、百分比的单位进行统计，是最常见的一个监控方式。这种监控方式在常规的监控里面，类似项目 zabbix telegraph，这些系统都是可以做到的。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;性能监控&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;性能监控指的就是 APM 监控，也就是说常见的一些应用性能类的监控指标的检查。通常是通过一些 Hook 的机制在虚拟机层、字节码执行层通过隐式调用，或者是在应用层显示注入，获取更深层次的一个监控指标，一般是用来应用的调优和诊断的。比较常见的类似像 jvm 或者 php 的 Zend Engine，通过一些常见的 Hook 机制，拿到类似像 jvm 里面的 GC 的次数，各种内存代的一个分布以及网络连接数的一些指标，通过这种方式来进行应用的性能诊断和调优。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;安全监控&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;安全监控主要是对安全进行的一系列的监控策略，类似像越权管理、安全漏洞扫描等等。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;事件监控&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;事件监控是 K8s 中比较另类的一种监控方式。在上一节课中给大家介绍了在 K8s 中的一个设计理念，就是基于状态机的一个状态转换。从正常的状态转换成另一个正常的状态的时候，会发生一个 normal 的事件，而从一个正常状态转换成一个异常状态的时候，会发生一个 warning 的事件。通常情况下，warning 的事件是我们比较关心的，而事件监控就是可以把 normal 的事件或者是 warning 事件离线到一个数据中心，然后通过数据中心的分析以及报警，把相应的一些异常通过像钉钉或者是短信、邮件的方式进行暴露，弥补常规监控的一些缺陷和弊端。&lt;/p&gt;
&lt;h3 id="kubernetes-的监控演进"&gt;Kubernetes 的监控演进&lt;/h3&gt;
&lt;p&gt;在早期，也就是 1.10 以前的 K8s 版本。大家都会使用类似像 Heapster 这样的组件来去进行监控的采集，Heapster 的设计原理其实也比较简单。&lt;/p&gt;</description></item><item><title>13 Kubernetes 网络概念及策略控制（叶磊）</title><link>https://go.botsarena.tech/docs/resources/cloud-native-web3-fulltext/cncf-alibaba-cloud-native-course/013/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://go.botsarena.tech/docs/resources/cloud-native-web3-fulltext/cncf-alibaba-cloud-native-course/013/</guid><description>&lt;div class="goclub-source-note"&gt;来源：&lt;a href="https://study.disign.me/document/CNCF%20X%20%e9%98%bf%e9%87%8c%e5%b7%b4%e5%b7%b4%e4%ba%91%e5%8e%9f%e7%94%9f%e6%8a%80%e6%9c%af%e5%85%ac%e5%bc%80%e8%af%be/13%20Kubernetes%20%e7%bd%91%e7%bb%9c%e6%a6%82%e5%bf%b5%e5%8f%8a%e7%ad%96%e7%95%a5%e6%8e%a7%e5%88%b6%ef%bc%88%e5%8f%b6%e7%a3%8a%ef%bc%89.md" target="_blank" rel="noopener noreferrer"&gt;技术书栈原文&lt;/a&gt;。本页按授权迁移至 GoClub。&lt;/div&gt;
&lt;h1 id="13-kubernetes-网络概念及策略控制-叶磊"&gt;13 Kubernetes 网络概念及策略控制（叶磊）&lt;/h1&gt;
&lt;p&gt;本文将主要分享以下 5 方面的内容：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Kubernetes 基本网络模型；&lt;/li&gt;
&lt;li&gt;Netns 探秘；&lt;/li&gt;
&lt;li&gt;主流网络方案简介；&lt;/li&gt;
&lt;li&gt;Network Policy 的用处；&lt;/li&gt;
&lt;li&gt;思考时间。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="kubernetes-基本网络模型"&gt;Kubernetes 基本网络模型&lt;/h2&gt;
&lt;p&gt;本节来介绍一下 Kubernetes 对网络模型的一些想法。大家知道 Kubernetes 对于网络具体实现方案，没有什么限制，也没有给出特别好的参考案例。Kubernetes 对一个容器网络是否合格做出了限制，也就是 Kubernetes 的容器网络模型。可以把它归结为约法三章和四大目标。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;约法三章的意思是：在评价一个容器网络或者设计容器网络的时候，它的准入条件。它需要满足哪三条？ 才能认为它是一个合格的网络方案。&lt;/li&gt;
&lt;li&gt;四大目标意思是在设计这个网络的拓扑，设计网络的具体功能的实现的时候，要去想清楚，能不能达成连通性等这几大指标。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="约法三章"&gt;约法三章&lt;/h3&gt;
&lt;p&gt;先来看下约法三章：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第一条：任意两个 pod 之间其实是可以直接通信的，无需经过显式地使用 NAT 来接收数据和地址的转换；&lt;/li&gt;
&lt;li&gt;第二条：node 与 pod 之间是可以直接通信的，无需使用明显的地址转换；&lt;/li&gt;
&lt;li&gt;第三条：pod 看到自己的 IP 跟别人看见它所用的IP是一样的，中间不能经过转换。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;后文中会讲一下我个人的理解，为什么 Kubernetes 对容器网络会有一些看起来武断的模型和要求。&lt;/p&gt;
&lt;h3 id="四大目标"&gt;四大目标&lt;/h3&gt;
&lt;p&gt;四大目标其实是在设计一个 K8s 的系统为外部世界提供服务的时候，从网络的角度要想清楚，外部世界如何一步一步连接到容器内部的应用？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;外部世界和 service 之间是怎么通信的？&lt;/strong&gt;就是有一个互联网或者是公司外部的一个用户，怎么用到 service？service 特指 K8s 里面的服务概念。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;service 如何与它后端的 pod 通讯？&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;pod 和 pod 之间调用是怎么做到通信的？&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;最后就是 pod 内部容器与容器之间的通信？&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最终要达到目标，就是外部世界可以连接到最里面，对容器提供服务。&lt;/p&gt;</description></item><item><title>14 Kubernetes Service（溪恒）</title><link>https://go.botsarena.tech/docs/resources/cloud-native-web3-fulltext/cncf-alibaba-cloud-native-course/014/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://go.botsarena.tech/docs/resources/cloud-native-web3-fulltext/cncf-alibaba-cloud-native-course/014/</guid><description>&lt;div class="goclub-source-note"&gt;来源：&lt;a href="https://study.disign.me/document/CNCF%20X%20%e9%98%bf%e9%87%8c%e5%b7%b4%e5%b7%b4%e4%ba%91%e5%8e%9f%e7%94%9f%e6%8a%80%e6%9c%af%e5%85%ac%e5%bc%80%e8%af%be/14%20Kubernetes%20Service%ef%bc%88%e6%ba%aa%e6%81%92%ef%bc%89.md" target="_blank" rel="noopener noreferrer"&gt;技术书栈原文&lt;/a&gt;。本页按授权迁移至 GoClub。&lt;/div&gt;
&lt;h1 id="14-kubernetes-service-溪恒"&gt;14 Kubernetes Service（溪恒）&lt;/h1&gt;
&lt;h2 id="需求来源"&gt;需求来源&lt;/h2&gt;
&lt;h3 id="为什么需要服务发现"&gt;为什么需要服务发现&lt;/h3&gt;
&lt;p&gt;在 K8s 集群里面会通过 pod 去部署应用，与传统的应用部署不同，传统应用部署在给定的机器上面去部署，我们知道怎么去调用别的机器的 IP 地址。但是在 K8s 集群里面应用是通过 pod 去部署的， 而 pod 生命周期是短暂的。在 pod 的生命周期过程中，比如它创建或销毁，它的 IP 地址都会发生变化，这样就不能使用传统的部署方式，不能指定 IP 去访问指定的应用。&lt;/p&gt;
&lt;p&gt;另外在 K8s 的应用部署里，之前虽然学习了 deployment 的应用部署模式，但还是需要创建一个 pod 组，然后这些 pod 组需要提供一个统一的访问入口，以及怎么去控制流量负载均衡到这个组里面。比如说测试环境、预发环境和线上环境，其实在部署的过程中需要保持同样的一个部署模板以及访问方式。因为这样就可以用同一套应用的模板在不同的环境中直接发布。&lt;/p&gt;
&lt;h3 id="service-kubernetes-中的服务返现与负载均衡"&gt;Service：Kubernetes 中的服务返现与负载均衡&lt;/h3&gt;
&lt;p&gt;最后应用服务需要暴露到外部去访问，需要提供给外部的用户去调用的。我们上节了解到 pod 的网络跟机器不是同一个段的网络，那怎么让 pod 网络暴露到去给外部访问呢？这时就需要服务发现。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://go.botsarena.tech/pictures/study-disign/4b49a5cdc29cf6ad1517.webp" alt="avatar"&gt;&lt;/p&gt;
&lt;p&gt;在 K8s 里面，服务发现与负载均衡就是 K8s Service。上图就是在 K8s 里 Service 的架构，K8s Service 向上提供了外部网络以及 pod 网络的访问，即外部网络可以通过 service 去访问，pod 网络也可以通过 K8s Service 去访问。&lt;/p&gt;
&lt;p&gt;向下，K8s 对接了另外一组 pod，即可以通过 K8s Service 的方式去负载均衡到一组 pod 上面去，这样相当于解决了前面所说的复发性问题，或者提供了统一的访问入口去做服务发现，然后又可以给外部网络访问，解决不同的 pod 之间的访问，提供统一的访问地址。&lt;/p&gt;</description></item><item><title>15 从 0 开始创作云原生应用（殷达）</title><link>https://go.botsarena.tech/docs/resources/cloud-native-web3-fulltext/cncf-alibaba-cloud-native-course/015/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://go.botsarena.tech/docs/resources/cloud-native-web3-fulltext/cncf-alibaba-cloud-native-course/015/</guid><description>&lt;div class="goclub-source-note"&gt;来源：&lt;a href="https://study.disign.me/document/CNCF%20X%20%e9%98%bf%e9%87%8c%e5%b7%b4%e5%b7%b4%e4%ba%91%e5%8e%9f%e7%94%9f%e6%8a%80%e6%9c%af%e5%85%ac%e5%bc%80%e8%af%be/15%20%e4%bb%8e%200%20%e5%bc%80%e5%a7%8b%e5%88%9b%e4%bd%9c%e4%ba%91%e5%8e%9f%e7%94%9f%e5%ba%94%e7%94%a8%ef%bc%88%e6%ae%b7%e8%be%be%ef%bc%89.md" target="_blank" rel="noopener noreferrer"&gt;技术书栈原文&lt;/a&gt;。本页按授权迁移至 GoClub。&lt;/div&gt;
&lt;h1 id="15-从-0-开始创作云原生应用-殷达"&gt;15 从 0 开始创作云原生应用（殷达）&lt;/h1&gt;
&lt;h2 id="一-云原生应用是什么"&gt;一、 云原生应用是什么？&lt;/h2&gt;
&lt;p&gt;首先我们来思考一个问题：云原生应用是什么？&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://go.botsarena.tech/pictures/study-disign/7ca23b6962335dea8e28.webp" alt="avatar"&gt;&lt;/p&gt;
&lt;p&gt;在生活中我们会和各种各样的应用打交道，有时候会在移动端上使用淘宝购物、使用高德导航，在 PC 端使用 word 编辑文稿、使用 Photoshop 处理相片······这些在各类平台上的应用程序对用户而言，大多数都只需要用户点击安装就可以使用了。那么对于云上的应用，或者说在我们今天的云上、在 Kubernetes 上的应用，是什么样子的呢？&lt;/p&gt;
&lt;p&gt;想象一下，如果我们要把一个应用程序部署到云上都需要做什么呢？&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://go.botsarena.tech/pictures/study-disign/f3571862cded37acc8fc.webp" alt="avatar"&gt;&lt;/p&gt;
&lt;p&gt;首先我们要准备好它所需的环境，打包成一个 docker 镜像，把这个镜像放到 deployment 中。部署服务、应用所需要的账户、权限、匿名空间、秘钥信息，还有可持久化存储，这些 Kubernetes 的资源，简而言之就是要把一堆 yaml 配置文件布置在 Kubernetes 上。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://go.botsarena.tech/pictures/study-disign/b549a504db38200632d7.webp" alt="avatar"&gt;&lt;/p&gt;
&lt;p&gt;虽然应用的开发者可以把这些镜像存放在公共的仓库中，然后把部署所需要的 yaml 的资源文件提供给用户，当然用户仍然需要自己去寻找这些资源文件在哪里，并把它们一一部署起来。倘若用户希望修改开发者提供的默认资源，比如说想使用更多的副本数，或者是修改服务端口，那他还需要自己去查：在这些资源文件中，哪些地方需要相应的修改。同时版本更替和维护，也会给开发者和用户造成很大的麻烦，所以可以看到最原始的这种 Kubernetes 的应用形态并不是非常的便利。&lt;/p&gt;
&lt;h2 id="二-helm-与-helm-chart"&gt;二、Helm 与 Helm Chart&lt;/h2&gt;
&lt;h3 id="helm-是什么"&gt;Helm 是什么？&lt;/h3&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://go.botsarena.tech/pictures/study-disign/9a7ed2cb57b7f6ca939b.webp" alt="avatar"&gt;&lt;/p&gt;
&lt;p&gt;我们今天的主角：Helm，就在这样的环境下应用而生。开发者安装 Helm Chart 的格式，将应用所需要的资源文件都包装起来，通过模板化的方法，将一些可变的字段，比如说我们之前提到的要暴露哪一个端口、使用多少副本数量，把这些信息都暴露给用户，最后将封装好的应用包，也就是我们所说的 Helm Chart 集中存放在统一的仓库里面供用户浏览下载。&lt;/p&gt;
&lt;p&gt;那么对于用户而言，使用 Helm 一条简单的命令就可以完成应用的安装、卸载和升级，我们可以在安装完成之后使用 kubectl 来查看一下应用安装后的 pod 的运行状态。需要注意的是，我们证明使用的是 Helm v3 的一个命令，与目前相对较为成熟的 Helm v2 是有一定的区别的。我们推荐大家在进行学习尝鲜的过程中使用这个最新的 v3 版本。&lt;/p&gt;
&lt;h3 id="如何去创作一个-helm-应用"&gt;如何去创作一个 Helm 应用&lt;/h3&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://go.botsarena.tech/pictures/study-disign/43727a23815a035645c0.webp" alt="avatar"&gt;&lt;/p&gt;</description></item><item><title>16 深入解析 Linux 容器（华敏）</title><link>https://go.botsarena.tech/docs/resources/cloud-native-web3-fulltext/cncf-alibaba-cloud-native-course/016/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://go.botsarena.tech/docs/resources/cloud-native-web3-fulltext/cncf-alibaba-cloud-native-course/016/</guid><description>&lt;div class="goclub-source-note"&gt;来源：&lt;a href="https://study.disign.me/document/CNCF%20X%20%e9%98%bf%e9%87%8c%e5%b7%b4%e5%b7%b4%e4%ba%91%e5%8e%9f%e7%94%9f%e6%8a%80%e6%9c%af%e5%85%ac%e5%bc%80%e8%af%be/16%20%e6%b7%b1%e5%85%a5%e8%a7%a3%e6%9e%90%20Linux%20%e5%ae%b9%e5%99%a8%ef%bc%88%e5%8d%8e%e6%95%8f%ef%bc%89.md" target="_blank" rel="noopener noreferrer"&gt;技术书栈原文&lt;/a&gt;。本页按授权迁移至 GoClub。&lt;/div&gt;
&lt;h1 id="16-深入解析-linux-容器-华敏"&gt;16 深入解析 Linux 容器（华敏）&lt;/h1&gt;
&lt;p&gt;前两个部分就是资源隔离和限制还有容器镜像的构成，第三部分会以一个业界比较成熟的容器引擎为例去讲解一下容器引擎的构成。&lt;/p&gt;
&lt;h2 id="容器"&gt;容器&lt;/h2&gt;
&lt;p&gt;容器是一种轻量级的虚拟化技术，因为它跟虚拟机比起来，它少了一层 hypervisor 层。先看一下下面这张图，这张图简单描述了一个容器的启动过程。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://go.botsarena.tech/pictures/study-disign/09b33a52e7b66d3572b5.webp" alt="avatar"&gt;&lt;/p&gt;
&lt;p&gt;最下面是一个磁盘，容器的镜像是存储在磁盘上面的。上层是一个容器引擎，容器引擎可以是 docker，也可以是其它的容器引擎。引擎向下发一个请求，比如说创建容器，然后这时候它就把磁盘上面的容器镜像，运行成在宿主机上的一个进程。&lt;/p&gt;
&lt;p&gt;对于容器来说，最重要的是怎么保证这个进程所用到的资源是被隔离和被限制住的，在 Linux 内核上面是由 cgroup 和 namespace 这两个技术来保证的。接下来以 docker 为例，来详细介绍一下资源隔离和容器镜像这两部分内容。&lt;/p&gt;
&lt;h2 id="一-资源隔离和限制"&gt;一、资源隔离和限制&lt;/h2&gt;
&lt;h3 id="namespace"&gt;namespace&lt;/h3&gt;
&lt;p&gt;namespace 是用来做资源隔离的，在 Linux 内核上有七种 namespace，docker 中用到了前六种。第七种 cgroup namespace 在 docker 本身并没有用到，但是在 runC 实现中实现了 cgroup namespace。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://go.botsarena.tech/pictures/study-disign/8d74361cddc3c713ecfa.webp" alt="avatar"&gt;&lt;/p&gt;
&lt;p&gt;我们先从头看一下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第一个是 mout namespace。mout namespace 就是保证容器看到的文件系统的视图，是容器镜像提供的一个文件系统，也就是说它看不见宿主机上的其他文件，除了通过 -v 参数 bound 的那种模式，是可以把宿主机上面的一些目录和文件，让它在容器里面可见的。&lt;/li&gt;
&lt;li&gt;第二个是 uts namespace，这个 namespace 主要是隔离了 hostname 和 domain。&lt;/li&gt;
&lt;li&gt;第三个是 pid namespace，这个 namespace 是保证了容器的 init 进程是以 1 号进程来启动的。&lt;/li&gt;
&lt;li&gt;第四个是网络 namespace，除了容器用 host 网络这种模式之外，其他所有的网络模式都有一个自己的 network namespace 的文件。&lt;/li&gt;
&lt;li&gt;第五个是 user namespace，这个 namespace 是控制用户 UID 和 GID 在容器内部和宿主机上的一个映射，不过这个 namespace 用的比较少。&lt;/li&gt;
&lt;li&gt;第六个是 IPC namespace，这个 namespace 是控制了进程兼通信的一些东西，比方说信号量。&lt;/li&gt;
&lt;li&gt;第七个是 cgroup namespace，上图右边有两张示意图，分别是表示开启和关闭 cgroup namespace。用 cgroup namespace 带来的一个好处是容器中看到的 cgroup 视图是以根的形式来呈现的，这样的话就和宿主机上面进程看到的 cgroup namespace 的一个视图方式是相同的。另外一个好处是让容器内部使用 cgroup 会变得更安全。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这里我们简单用 unshare 示例一下 namespace 创立的过程。容器中 namespace 的创建其实都是用 unshare 这个系统调用来创建的。&lt;/p&gt;</description></item><item><title>07 应用编排与管理：Job &amp; DaemonSet</title><link>https://go.botsarena.tech/docs/resources/cloud-native-web3-fulltext/cncf-alibaba-cloud-native-course/017/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://go.botsarena.tech/docs/resources/cloud-native-web3-fulltext/cncf-alibaba-cloud-native-course/017/</guid><description>&lt;div class="goclub-source-note"&gt;来源：&lt;a href="https://study.disign.me/document/CNCF%20X%20%E9%98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4%E4%BA%91%E5%8E%9F%E7%94%9F%E6%8A%80%E6%9C%AF%E5%85%AC%E5%BC%80%E8%AF%BE/07%20%E5%BA%94%E7%94%A8%E7%BC%96%E6%8E%92%E4%B8%8E%E7%AE%A1%E7%90%86%EF%BC%9AJob%20%26%20DaemonSet.md" target="_blank" rel="noopener noreferrer"&gt;技术书栈原文&lt;/a&gt;。本页按授权迁移至 GoClub。&lt;/div&gt;
&lt;h1 id="07-应用编排与管理-job-amp-daemonset"&gt;07 应用编排与管理：Job &amp;amp; DaemonSet&lt;/h1&gt;
&lt;h2 id="job"&gt;Job&lt;/h2&gt;
&lt;h3 id="需求来源"&gt;需求来源&lt;/h3&gt;
&lt;h4 id="job-背景问题"&gt;Job 背景问题&lt;/h4&gt;
&lt;p&gt;首先我们来看一下 Job 的需求来源。我们知道 K8s 里面，最小的调度单元是 Pod，我们可以直接通过 Pod 来运行任务进程。这样做将会产生以下几种问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;我们如何保证 Pod 内进程正确的结束？&lt;/li&gt;
&lt;li&gt;如何保证进程运行失败后重试？&lt;/li&gt;
&lt;li&gt;如何管理多个任务，且任务之间有依赖关系？&lt;/li&gt;
&lt;li&gt;如何并行地运行任务，并管理任务的队列大小？&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="job-管理任务的控制器"&gt;Job：管理任务的控制器&lt;/h4&gt;
&lt;p&gt;我们来看一下 Kubernetes 的 Job 为我们提供了什么功能：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;首先 kubernetes 的 Job 是一个管理任务的控制器，它可以创建一个或多个 Pod 来指定 Pod 的数量，并可以监控它是否成功地运行或终止；&lt;/li&gt;
&lt;li&gt;我们可以根据 Pod 的状态来给 Job 设置重置的方式及重试的次数；&lt;/li&gt;
&lt;li&gt;我们还可以根据依赖关系，保证上一个任务运行完成之后再运行下一个任务；&lt;/li&gt;
&lt;li&gt;同时还可以控制任务的并行度，根据并行度来确保 Pod 运行过程中的并行次数和总体完成大小。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="用例解读"&gt;用例解读&lt;/h3&gt;
&lt;p&gt;我们根据一个实例来看一下Job是如何来完成下面的应用的。&lt;/p&gt;
&lt;h4 id="job-语法"&gt;Job 语法&lt;/h4&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://go.botsarena.tech/pictures/study-disign/b640adccf558c2d49885.webp" alt="avatar"&gt;&lt;/p&gt;
&lt;p&gt;上图是 Job 最简单的一个 yaml 格式，这里主要新引入了一个 kind 叫 Job，这个 Job 其实就是 job-controller 里面的一种类型。 然后 metadata 里面的 name 来指定这个 Job 的名称，下面 spec.template 里面其实就是 pod 的 spec。&lt;/p&gt;</description></item></channel></rss>