您现在的位置是:首页 >技术交流 >【云原生Kubernetes】01-Kubernetes简介网站首页技术交流
【云原生Kubernetes】01-Kubernetes简介
【云原生Kubernetes】01-Kubernetes简介
文章目录
前言
我们在说Kubernetes之前已经详细说了docker的相关内容,在说docker的时候,大多数情况下都是在单机使用,这显然不符合实际生产需求,因此需要使用集群,前面说过docker官方的多机编排docker-swarm,接下来我们将说另外的容器多机编排系统-Kubernetes。
kubernets概述
Kubernetes 是一个可移植、可扩展的开源平台,用于管理容器化工作负载和服务,可促进声明式配置和自动化。它有一个庞大的、快速发展的生态系统。Kubernetes 服务、支持和工具广泛可用。
Kubernetes 这个名字来源于希腊语,意思是舵手或领航员。K8s 是缩写,由计算“K”和“s”之间的八个字母得出。谷歌于 2014 年开源了 Kubernetes 项目。Kubernetes 结合了 谷歌超过 15 年的大规模运行生产工作负载的经验以及来自社区的最佳创意和实践。
为什么要使用Kubernetes?
让我们通过时间倒流来看看为什么 Kubernetes 如此有用。
- 传统部署时代
早期,企业在物理服务器上运行应用程序。无法在物理服务器中为应用程序定义资源边界,这导致了资源分配问题。例如,如果多个应用程序在一台物理服务器上运行,可能会出现一个应用程序占用大部分资源的情况,结果导致其他应用程序性能不佳。一个解决方案是在不同的物理服务器上运行每个应用程序。但这并没有扩展,因为资源没有得到充分利用,而且企业在维护许多物理服务器的成本很高。
- 虚拟化部署时代
作为一种解决方案,引入了虚拟化。它允许您在单个物理服务器的 CPU 上运行多个虚拟机 (VM)。虚拟化允许应用程序在 VM 之间隔离,并提供一定程度的安全性,因为一个应用程序的信息不能被另一个应用程序自由访问。
虚拟化允许更好地利用物理服务器中的资源并允许更好的可扩展性,因为可以轻松添加或更新应用程序,降低硬件成本等等。通过虚拟化,您可以将一组物理资源呈现为一次性虚拟机集群。
每个 VM 都是一个完整的机器,在虚拟化硬件之上运行所有组件,包括它自己的操作系统。
- 容器部署时代
容器类似于虚拟机,但它们具有宽松的隔离属性以在应用程序之间共享操作系统(OS)。因此,容器被认为是轻量级的。与 VM 类似,容器有自己的文件系统、CPU 份额、内存、进程空间等。由于它们与底层基础设施分离,因此它们可以跨云和操作系统分布移植。
容器之所以流行,是因为它们提供了额外的好处,例如:
- 敏捷的应用程序创建和部署:与使用 VM 映像相比,容器映像创建的简便性和效率更高。
- 持续开发、集成和部署:提供可靠和频繁的容器镜像构建和部署,并具有快速高效的回滚(由于镜像不可变性)。
- Dev 和 Ops 关注点分离:在构建/发布时而不是部署时创建应用程序容器映像,从而将应用程序与基础架构解耦。
- 可观察性:不仅显示操作系统级别的信息和指标,还显示应用程序运行状况和其他信号。
- 跨开发、测试和生产的环境一致性:在笔记本电脑上运行与在云中运行相同。
- 云和操作系统分发的可移植性:在 Ubuntu、RHEL、CoreOS、本地、主要公共云和其他任何地方运行。
- 以应用程序为中心的管理:将抽象级别从在虚拟硬件上运行操作系统提高到使用逻辑资源在操作系统上运行应用程序。
- 松散耦合、分布式、弹性、自由的微服务:应用程序被分解成更小的、独立的部分,可以动态部署和管理——而不是在一台大型单一用途机器上运行的整体堆栈。
- 资源隔离:可预测的应用程序性能。
- 资源利用:高效率、高密度。
Kubernetes能做什么?
容器是捆绑和运行应用程序的好方法。在生产环境中,您需要管理运行应用程序的容器并确保没有停机时间。例如,如果一个容器宕机,则需要启动另一个容器。如果这种行为由系统处理会不会更容易?
这就是 Kubernetes 的救援方式!Kubernetes 为您提供了一个框架来弹性地运行分布式系统。它负责应用程序的扩展和故障转移,提供部署模式等。例如:Kubernetes 可以轻松地为您的系统管理金丝雀部署。
Kubernetes 为您提供:
- 服务发现和负载平衡 Kubernetes 可以使用 DNS 名称或使用自己的 IP 地址公开容器。如果容器的流量很高,Kubernetes 能够负载平衡和分配网络流量,从而使部署稳定。
- 存储编排 Kubernetes 允许您自动挂载您选择的存储系统,例如本地存储、公共云提供商等。
- 自动推出和回滚 您可以使用 Kubernetes 描述已部署容器的所需状态,它可以以受控的速率将实际状态更改为所需状态。例如,您可以自动化 Kubernetes 为您的部署创建新容器,删除现有容器并将其所有资源采用到新容器中。
- 自动装箱 您为 Kubernetes 提供了一个节点集群,它可以用来运行容器化任务。您告诉 Kubernetes 每个容器需要多少 CPU 和内存 (RAM)。Kubernetes 可以将容器安装到您的节点上,以充分利用您的资源。
- 自我修复的 Kubernetes 会重启失败的容器,替换容器,杀死不响应用户定义的健康检查的容器,并且在它们准备好服务之前不会向客户端公布它们。
- 秘密和配置管理 Kubernetes 允许您存储和管理敏感信息,例如密码、OAuth 令牌和 SSH 密钥。您可以部署和更新机密和应用程序配置,而无需重建容器映像,也无需在堆栈配置中公开机密
Kubernetes 不是传统的、包罗万象的 PaaS(平台即服务)系统。由于 Kubernetes 在容器级别而非硬件级别运行,因此它提供了一些 PaaS 产品共有的普遍适用的功能,例如部署、扩展、负载平衡,并允许用户集成他们的日志记录、监控和警报解决方案。然而,Kubernetes 并不是单一的,这些默认解决方案是可选的和可插入的。Kubernetes 为构建开发人员平台提供了构建块,但在重要的地方保留了用户的选择和灵活性。
- 不限制支持的应用程序类型。Kubernetes 旨在支持极其多样化的工作负载,包括无状态、有状态和数据处理工作负载。如果一个应用程序可以在容器中运行,它应该在 Kubernetes 上运行良好。
- 不部署源代码,也不构建您的应用程序。持续集成、交付和部署 (CI/CD) 工作流由组织文化和偏好以及技术要求决定。
- 不提供应用程序级服务,例如中间件(例如消息总线)、数据处理框架(例如 Spark)、数据库(例如 MySQL)、缓存或集群存储系统(例如 Ceph)作为内置服务。这些组件可以在 Kubernetes 上运行,和/或可以由在 Kubernetes 上运行的应用程序通过可移植机制(例如Open Service Broker)访问。
- 不规定日志记录、监控或警报解决方案。它提供了一些集成作为概念证明,以及收集和导出指标的机制。
- 不提供也不强制要求配置语言/系统(例如,Jsonnet)。它提供了一个声明性 API,可以以任意形式的声明性规范为目标。
- 不提供也不采用任何完善的机器配置、维护、管理或自愈系统。
- 此外,Kubernetes 不仅仅是一个编排系统。事实上,它消除了编排的需要。编排的技术定义是执行定义的工作流:先做 A,然后做 B,然后做 C。相比之下,Kubernetes 包含一组独立的、可组合的控制过程,这些过程不断地将当前状态驱动到提供的期望状态。从 A 到 C 的方式无关紧要。也不需要集中控制。这导致系统更易于使用且功能更强大、健壮、有弹性且可扩展
Kubenets架构
架构图
kubernetes集群中的大致架构是:
- 一个或者多个master(管理节点)
- 一个或者多个node(工作节点)+
- 一个或者多个数据库节点(数据库节点可以与master节点合成一个)
架构组件说明
Master节点
Kubernetes集群的控制节点,主要职责是调度,即决定应用放在哪里运行。为了实现高可用,可以运行多个Master。Master节点由三个组件组成:
**kube-apiserve: ** 提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制;
kube-scheduler: 负责监视新创建的、未指定运行节点(node)的 Pods,选择节点让 Pod 在上面运行。
调度决策考虑的因素包括单个 Pod 和 Pod 集合的资源需求、硬件/软件/策略约束、亲和性和反亲和性规范、数据位置、工作负载间的干扰和最后时限。(集群调度器,负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上)
kube-controller-manager:
集群控制器,它运行着所有处理集群日常任务的控制器。包括了节点控制器、副本控制器、端点(endpoint)控制器以及服务账户和令牌控制器。每一个控制器都独立工作以维护其所需的状态。简单讲,就是负责维护集群的状态,比如故障检测、自动扩展、滚动更新等
从逻辑上讲,每个控制器都是一个单独的进程, 但是为了降低复杂性,它们都被编译到同一个可执行文件,并在一个进程中运行。
这些控制器包括:
- 节点控制器(Node Controller): 负责在节点出现故障时进行通知和响应
- 任务控制器(Job controller): 监测代表一次性任务的 Job 对象,然后创建 Pods 来运行这些任务直至完成
- 端点控制器(Endpoints Controller): 填充端点(Endpoints)对象(即加入 Service 与 Pod)
- 服务帐户和令牌控制器(Service Account & Token Controllers): 为新的命名空间创建默认帐户和 API 访问令牌
cloud-controller-manager:
云控制器管理器是指嵌入特定云的控制逻辑的Master组件。 云控制器管理器使得你可以将你的集群连接到云提供商的 API 之上, 并将与该云平台交互的组件同与你的集群交互的组件分离开来。
cloud-controller-manager
仅运行特定于云平台的控制回路。 如果你在自己的环境中运行 Kubernetes,或者在本地计算机中运行学习环境, 所部署的环境中不需要云控制器管理器。与
kube-controller-manager
类似,cloud-controller-manager
将若干逻辑上独立的 控制回路组合到同一个可执行文件中,供你以同一进程的方式运行。 你可以对其执行水平扩容(运行不止一个副本)以提升性能或者增强容错能力。下面的控制器都包含对云平台驱动的依赖:
- 节点控制器(Node Controller): 用于在节点终止响应后检查云提供商以确定节点是否已被删除
- 路由控制器(Route Controller): 用于在底层云基础架构中设置路由
- 服务控制器(Service Controller): 用于创建、更新和删除云提供商负载均衡器
Node节点
- Kubernetes集群的工作节点,负责容器应用的运行,由Master管理,Node负责监控并汇报容器状态,同时根据Master的要求管理容器的生命周期。
- kubelet: 负责管控docker容器,如启动、停止、监控运行状态等。它会定期从apiserver获取分配到本机的pod,并根据pod信息启动或停止相应的容器。同时,它也会接收apiserver的http请求,汇报pod的运行状态。也负责Volume(CVI)和网络(CNI)的管理。
- kube-proxy: 负责为pod提供代理。它会定期从apiserver获取所有的service,并根据service信息创建代理。当某个客户pod要访问其他pod时,访问请求会经过本机的proxy做转发。同时负责为Service提供cluster内部的服务发现和负载均衡
- Docker Engine(Docker): Docker引擎,负责本机容器的创建和管理工作。在kubernetes的v.124版本开始,就默认不在使用docker
Etcd节点
- Etcd: k/v数据库(数据存储格式是key/vaue的形式),用于存储Kubernetes集群相关信息,包括节点信息,Pod信息,Service信息等,只与apiserver交互.
组件间的工作流程
- 如上图所示,注意除了api-server与etcd之间是双向箭头(互相访问),api-server与其他组件之间都是单向箭头(单向访问)
- 通过上图可以清楚的了解到api-server在中间起到关键性的作用,各个组件都需要与api-server进行通信,而api-server并不会主动的许其他组件进行沟通(与etcd之间除外,会主动将接受的相关信息记录到etcd之中),都是其他组件主动向api-server发起请求。
- 假如我们在kubernetes集群中运行一个nginx的容器,我们整个集群是怎么将容器运行起来的呢?
- 用户通过连接api-server(cli命令或ui图形交互)向kubernetes集群下发指令,说我现在需要创建一个nginx的容器;
- 这时候api-server接受到该指令之后,就会将该指令记录到etcd中;
- 与此同时scheduler(调度器)和controller-manager(集群调度器)都在时刻监控着api-server,不间断的向api-server询问我现在有事情要做吗?
- 此时api-server会告诉scheduler(资源调度器)现在需要在集群中启动一个nginx容器;scheduler就会通过计算将容器运行到那个node上,并将信息告诉给api-server;
- api-server接受到scheduler返回来的信息之后就会将该信息存储到etcd中,并记录说将nginx容器运行在node2节点上;存储之后api server就处于休息状态,因为它不会主动的去连接其他组件,但是api-server想休息也没办法休息的很舒服,因为scheduler(调度器)和controller-manager(集群调度器)在不停的向api server询问我是否有事情需要去做,以及kubelet向其报告节点以及pod的信息以及健康状态。
- 当controller-manager(集群调度器)询问api-server是否有事情做的时候,api-server就会说,现在有一个事情你快去将nginx容器运行到node2节点上去。当controller-manager(集群调度器)接受到该指令之后会很痛快的答应说好的,但是实际上并没真正的去做事情,而是一如既往的监控着api-server同时也一直询问该容器创建了吗?没创建抓紧创建啊。
- 因为每个node节点中kubelet会每隔一定时间就会想api server反馈自己的健康状态以及其他相关的自身信息,并且询问我是否有新的任务去做。
- 当node2节点连接api-server的时候就会告诉node2节点,要在你这里运行一个nginx的容器,内存呀,cpu是多少等等,这时候kubelet就会按照要求去创建。
Kubernetes的核心技术
Pod
在Kubernetes中,Pod是最小的部署单元,它是一个或多个容器的集合,它们共享同一台主机和网络命名空间。Pod提供了一个封装应用程序容器的方式,并允许它们在一个共享环境中运行。在Kubernetes中,Pod是调度器的基本单位,调度器负责将Pod放置在可用的节点上。
Pod有以下特点:
- 最小部署单元:Pod是Kubernetes中最小的部署单元,可以包含一个或多个容器,它们共享同一个主机和网络命名空间。
- 共享网络和存储:Pod中的容器可以共享网络和存储资源。每个Pod都有一个唯一的IP地址,并且容器可以使用相同的端口号来通信。
- 生命周期:Pod拥有自己的生命周期,当Pod被创建时,它会被调度到一个节点上,并在节点上运行。当Pod被删除时,其包含的容器也会被删除。
- 存在理由:Pod是由Kubernetes管理的,它们具有一个或多个容器,并且通常用于运行一个应用程序或一组相关的应用程序。
- 调度:Pod是由调度器进行调度的,调度器根据Pod的资源需求、节点可用性、调度策略等因素进行决策。
副本控制器(Replication Controller,RC)
Kubernetes中的Replication Controller(RC)是一种控制器,用于确保在Kubernetes集群中运行指定数量的Pod副本。RC是Kubernetes最早的控制器之一,后来被Deployment控制器取代。
RC的主要目的是确保在Kubernetes集群中运行指定数量的Pod副本。如果一个Pod失败或被删除,RC会自动创建一个新的Pod副本来替代它,以确保指定数量的Pod副本一直在运行。RC还可以在Pod的标签匹配的情况下,实现自动扩缩容。
在创建RC时,必须指定以下参数:
- 副本数量:需要运行的Pod副本数量。
- Pod模板:用于创建Pod的模板,包括容器、卷等信息。
- 标签选择器:用于选择要由RC管理的Pod。
在RC中,可以通过以下方式更新和管理Pod:
- 手动更新:可以手动更新Pod的标签或模板,以便RC可以管理新版本的Pod。
- 自动更新:可以通过设置滚动更新策略来自动更新Pod,以确保在不影响服务的情况下进行更新。
- 手动扩缩容:可以手动增加或减少Pod的数量,以调整服务的负载。
尽管RC已经被Deployment控制器取代,但它仍然是Kubernetes中重要的控制器之一,特别是在需要使用标签选择器管理Pod时。
Deployment
在Kubernetes中,Deployment是一种控制器,用于管理Pod的创建、更新和删除。Deployment提供了一种声明式的方法来管理Pod,可以自动地创建和更新Pod以满足指定的要求,同时保证应用程序的可用性。Deployment是Kubernetes中最常用的控制器之一,用于部署和维护应用程序。
Deployment的特点包括:
- 控制器:Deployment是一种控制器,用于管理Pod的创建、更新和删除。
- 声明式配置:Deployment提供了一种声明式的方法来管理Pod,可以通过YAML文件指定Pod的副本数、容器镜像、标签等信息。
- 滚动更新:Deployment可以执行滚动更新,即逐步更新Pod的版本,以确保应用程序的可用性。
- 回滚操作:Deployment支持回滚操作,即在更新失败或应用程序出现问题时,可以回滚到之前的版本。
- 版本控制:Deployment可以对应用程序进行版本控制,可以轻松地回退或升级应用程序的版本。
- 自动扩缩容:Deployment可以根据CPU和内存使用情况自动扩缩容,以满足应用程序的负载需求。
使用Deployment可以简化应用程序的部署和维护,提高应用程序的可用性和稳定性。Deployment是Kubernetes中最常用的控制器之一,被广泛用于生产环境中的应用程序部署和维护。
Service
在Kubernetes中,Service是一种抽象的逻辑概念,用于定义一组Pod的访问方式。Service为一组Pod提供了一个稳定的IP地址和DNS名称,使得其他应用程序可以通过这个IP地址和DNS名称来访问这组Pod,而不需要关心其具体的IP地址和端口号。
Service的主要特点包括:
- 稳定的IP地址和DNS名称:Service为一组Pod提供了一个稳定的IP地址和DNS名称,使得其他应用程序可以通过这个IP地址和DNS名称来访问这组Pod。
- 透明的负载均衡:Service提供了透明的负载均衡功能,将请求均衡地分发到后端的Pod上。
- 服务发现:Service可以通过DNS或环境变量的方式,自动地将Pod的IP地址和端口号注册到服务发现系统中。
- 支持多种服务类型:Service支持多种服务类型,包括ClusterIP、NodePort和LoadBalancer等。
- 支持标签选择器:Service可以根据标签选择器选择要管理的Pod。
在Kubernetes中,Service通常与Deployment或ReplicaSet等控制器配合使用,为部署的应用程序提供服务发现和负载均衡功能。Service是Kubernetes中一个基本的网络抽象,为应用程序提供了一个稳定的网络入口,使得应用程序更容易扩展和升级。
任务(Job)
在Kubernetes中,Job是一种控制器,用于管理批处理作业。Job的主要作用是运行一次性任务,如数据处理、批量计算、备份恢复等。
Job的特点包括:
- 一次性任务:Job用于运行一次性任务,任务完成后会自动退出。
- 并行处理:Job可以并行处理多个任务,以提高作业的执行效率。
- 完成保证:Job保证批处理作业的完成,如果任务失败则会重新启动,直到任务成功完成。
- 生命周期管理:Job可以管理作业的生命周期,包括创建、更新和删除等操作。
- 任务状态监控:Job可以监控任务的状态,包括运行状态、成功状态和失败状态等。
- 计划性任务:Job还支持计划性任务,可以按照指定的时间间隔自动运行任务。
在Kubernetes中,Job通常与Pod模板配合使用,用于运行一次性的任务。Job按照指定的副本数创建Pod,当所有任务完成后,Pod会自动删除。如果任务失败,则Job会重新启动Pod,直到任务成功完成。Job是Kubernetes中常用的控制器之一,被广泛用于批处理作业的管理和维护。
后台支撑服务集(DaemonSet)
在Kubernetes中,DaemonSet是一种控制器,用于确保每个节点上都运行一个Pod副本。与Replication Controller和Deployment控制器不同,DaemonSet不是为了运行多个副本,而是为了确保在每个节点上运行一个副本。
DaemonSet的主要特点包括:
- 运行在每个节点上:DaemonSet用于确保在每个节点上运行一个Pod副本,无论节点的数量是多少。
- 自动调度:DaemonSet可以自动调度Pod到所有的节点上,以确保每个节点都有一个Pod副本。
- 生命周期管理:DaemonSet可以管理Pod的生命周期,包括创建、更新和删除等操作。
- 节点标签选择器:DaemonSet可以根据节点标签选择器,选择要管理的节点。
- 守护进程:DaemonSet通常用于运行守护进程,如日志收集、监控、网络代理等。
在Kubernetes中,DaemonSet通常用于运行在每个节点上的守护进程,以确保每个节点都有一个Pod副本运行。例如,用于日志收集、监控、网络代理等任务。DaemonSet是Kubernetes中一个重要的控制器之一,被广泛用于生产环境中的应用程序部署和维护
有状态服务集(StatefulSet)
在Kubernetes中,StatefulSet是一种控制器,用于管理有状态的应用程序。StatefulSet与Deployment类似,但是支持有状态的应用程序,如数据库、缓存等。
StatefulSet的主要特点包括:
- 稳定的网络标识:StatefulSet为每个Pod提供了一个稳定的网络标识,包括DNS名称和网络标识符等,以便应用程序可以通过这个标识符访问特定的Pod。
- 有序部署和扩展:StatefulSet可以有序地部署和扩展有状态的应用程序,保证每个Pod的部署和扩展顺序不变。
- 持久化存储:StatefulSet可以使用持久化存储,如Persistent Volume和Persistent Volume Claim,以保证有状态的应用程序数据的持久性和可靠性。
- 生命周期管理:StatefulSet可以管理Pod的生命周期,包括创建、更新和删除等操作。
- 有状态的Pod名称:StatefulSet可以为每个Pod指定一个有状态的名称,例如db-0、db-1等,以便应用程序可以通过这个名称来访问特定的Pod。
在Kubernetes中,StatefulSet通常与有状态的应用程序配合使用,如数据库、缓存等。StatefulSet保证每个Pod都有一个稳定的网络标识符,并且可以有序地部署和扩展有状态的应用程序,保证数据的持久性和可靠性。StatefulSet是Kubernetes中一个重要的控制器之一,被广泛用于生产环境中的有状态应用程序部署和维护。
集群联邦(Federation)
Kubernetes Federation是一组工具和API,用于管理多个Kubernetes集群的联合。它允许用户将多个Kubernetes集群视为一个虚拟集群,从而使应用程序可以在多个集群之间移动和调度,以实现更好的高可用性和负载均衡。
Federation的主要特点包括:
- 跨集群服务发现和负载均衡:Federation提供了跨集群的服务发现和负载均衡功能,使得应用程序可以在多个集群之间移动和调度,以实现更好的高可用性和负载均衡。
- 基于策略的部署:Federation支持基于策略的部署,可以根据应用程序的需求,将应用程序部署到最适合的集群中。
- 多集群资源配额管理:Federation支持多集群资源配额管理,可以根据应用程序的需求,动态地分配和管理资源配额。
- 集群自动扩展和缩放:Federation支持集群自动扩展和缩放,可以根据应用程序的负载情况,自动地增加或减少集群的规模。
- 多集群监控和日志:Federation支持多集群监控和日志,可以集中管理多个集群的监控和日志数据。
总的来说,Kubernetes Federation是一种多集群管理的解决方案,可以帮助用户轻松地管理多个Kubernetes集群,并将它们视为一个虚拟集群,从而实现更好的高可用性和负载均衡。Federation是Kubernetes生态系统中重要的一个组成部分,但在最近的版本中已经被停止维护,建议使用Kubernetes的多集群管理工具,如Kubernetes Cluster API和Kubernetes Multi-Cluster Management API。
存储卷(Volume)
在Kubernetes中,Volume是一种抽象概念,用于表示容器中的持久化存储。Volume实际上是一个目录,可以被容器挂载并用于存储数据。容器可以使用Volume来读取和写入数据,而不会受到底层存储的影响。
Kubernetes支持多种类型的Volume,包括:
- EmptyDir:一个空目录,用于在容器之间共享临时数据。
- HostPath:将本地主机文件系统中的目录或文件挂载到容器中。
- ConfigMap:将配置文件挂载到容器中,用于配置应用程序。
- Secret:将加密的敏感数据,如密码和证书,挂载到容器中。
- PersistentVolumeClaim:将持久化存储卷挂载到容器中,以实现数据的持久化和可靠性。
Volume可以在Pod级别定义,也可以在容器级别定义。在Pod级别定义的Volume可以被Pod中的所有容器共享,而在容器级别定义的Volume只能被定义Volume的容器访问。
总的来说,Kubernetes的Volume提供了一种灵活而可扩展的存储解决方案,可以满足不同类型应用程序的存储需求。通过将Volume挂载到容器中,应用程序可以读取和写入数据,而不会受到底层存储的影响。Kubernetes的Volume是Kubernetes生态系统中一个重要的组成部分,被广泛用于生产环境中的应用程序部署和维护。
密钥对象(Secret)
在Kubernetes中,Secret是一种用于存储和管理敏感数据的对象。Secret可以保存诸如密码、证书、API密钥等敏感信息,这些信息通常需要在容器中使用,但又不能以明文形式暴露给其他人。
Kubernetes中的Secret对象使用Base64编码进行加密,但这种加密方式并不安全,因此建议使用TLS证书等更安全的加密方式来保护敏感数据。Secret可以在Pod级别或命名空间级别定义,并可以被Pod中的容器挂载和使用。
Kubernetes支持多种类型的Secret,包括:
- Opaque:用于存储任意类型的数据,可以是字符串、二进制数据等。
- TLS:用于存储TLS证书和私钥,以便在Pod中进行安全通信。
- Docker registry:用于存储Docker镜像仓库的认证信息,以便在Pod中拉取镜像。
- Generic:用于存储任意类型的敏感数据,可以是密码、API密钥等。
Secret的使用方式与Volume类似,可以在Pod的配置文件中指定Secret,并将其挂载到容器中。容器可以从Secret中读取敏感数据,并在使用后将其清除,从而确保数据的安全性。
总的来说,Kubernetes中的Secret是一种用于存储和管理敏感数据的对象,可以用于保存密码、证书、API密钥等敏感信息。Secret使用Base64编码进行加密,但建议使用更安全的加密方式来保护敏感数据。Secret可以在Pod级别或命名空间级别定义,并可以被Pod中的容器挂载和使用,从而实现安全地存储和使用敏感数据。
EmptyDir
在Kubernetes中,EmptyDir是一种类型的Volume,用于在容器之间共享临时数据。EmptyDir是一个空目录,可以在Pod级别或容器级别定义,并且在Pod中的所有容器之间共享。
当Pod中的容器启动时,Kubernetes会在Node上创建一个空目录,并将其挂载到每个容器的文件系统中。容器可以在EmptyDir中读取和写入数据。当Pod中的所有容器都终止时,EmptyDir将被删除。
EmptyDir可以用于多种用途,例如:
- 在容器之间共享临时数据。
- 在容器中存储缓存数据,以提高应用程序的性能。
- 在容器中存储临时文件,以便在应用程序中使用。
HostPath
在Kubernetes中,HostPath是一种类型的Volume,用于将主机节点(Node)上的文件或目录挂载到Pod中的容器中。HostPath允许容器访问主机上的文件系统,从而实现与主机的数据共享和交互。
HostPath Volume可以在Pod级别或容器级别定义,并且可以指定要挂载的主机文件或目录的路径。当Pod中的容器启动时,Kubernetes会将指定的主机文件或目录挂载到容器的文件系统中。容器可以在挂载的文件或目录中读取和写入数据。当Pod中的所有容器都终止时,主机文件或目录将从容器的文件系统卸载。
ConfigMap
在Kubernetes中,ConfigMap是一种类型的Volume,用于存储应用程序的配置数据,例如环境变量、命令行参数等。ConfigMap可以在Pod级别或容器级别定义,并且可以被Pod中的容器挂载和使用。
ConfigMap可以从多个来源创建,包括:
- 直接在Pod的配置文件中定义。
- 从文件中创建,例如使用kubectl命令将文件转换为ConfigMap。
- 从环境变量中创建,例如使用kubectl create configmap命令将环境变量转换为ConfigMap。
PersistentVolumeClaim
在Kubernetes中,PersistentVolumeClaim(PVC)是一种类型的Volume,用于将持久化存储(例如云磁盘或本地存储)挂载到Pod中的容器中。PVC可以在Pod级别或容器级别定义,并且允许容器在不同的节点和Pod之间共享数据。
PVC通过向Kubernetes集群请求一定数量和大小的存储来创建。管理员可以通过在集群中创建PersistentVolume(PV)来预先配置存储,并将其分配给PVC。当Pod中的容器启动时,Kubernetes会动态地将PV挂载到容器中,并将容器的数据持久化到PV中。当Pod中的所有容器都终止时,PV将被卸载。
节点(Node)
在Kubernetes中,Node是指一个物理或虚拟机器,用于运行Kubernetes Pod。每个Node都运行着Kubernetes Node组件,包括kubelet和kube-proxy等,这些组件负责管理Node上的Pod,并与Kubernetes Master通信,以便协调Pod的调度和管理。
Node可以由Kubernetes自动创建和销毁,也可以手动添加到Kubernetes集群中。每个Node都具有一些属性,如CPU、内存、存储等,这些属性用于帮助Kubernetes调度Pod并分配资源。Kubernetes还可以为每个Node分配标签,以便更好地管理和调度Pod。
Kubernetes中的Pod是运行在Node上的最小单元,每个Pod都运行在一个Node上。Kubernetes使用调度器(Scheduler)来确定Pod应该运行在哪个Node上。调度器根据Pod的资源需求和Node的资源可用性,选择最合适的Node来运行Pod。
总的来说,Node是Kubernetes中的一个重要概念,用于表示运行Kubernetes Pod的物理或虚拟机器。每个Node都运行着Kubernetes Node组件,这些组件负责管理Node上的Pod,并与Kubernetes Master通信,以便协调Pod的调度和管理。Node的属性和标签用于帮助Kubernetes调度Pod并分配资源,从而实现高效的资源利用和管理.
用户账户(User Account)和服务账户(Service Account)
在Kubernetes中,有两种类型的账户:用户账户(User Account)和服务账户(Service Account)。
用户账户是指Kubernetes集群中的用户。每个用户账户包含一个用户名和一组身份验证凭据,例如密码或证书。用户账户可以用于登录到Kubernetes集群中,或者用于在命令行界面或Web界面中执行操作。
服务账户是指Kubernetes集群中的服务。每个服务账户包含一个服务名和一组身份验证凭据,例如Token。服务账户通常用于在Pod中的容器中运行的应用程序中,以便应用程序可以访问Kubernetes API,或者与其他服务进行通信。
Kubernetes中的服务账户是由API Server创建的,每个命名空间都有一个默认的服务账户。当Pod中的容器需要访问Kubernetes API时,可以使用该命名空间的默认服务账户。管理员也可以创建自定义的服务账户,并将其分配给Pod中的容器使用。
需要注意的是,Kubernetes中的服务账户不同于操作系统中的服务账户。在操作系统中,服务账户通常用于在后台运行的服务中,例如Web服务器或数据库。而在Kubernetes中,服务账户主要用于容器中的应用程序,以便它们可以访问Kubernetes API或其他服务。
总的来说,Kubernetes中有两种类型的账户:用户账户和服务账户。用户账户用于登录到Kubernetes集群中或执行操作,而服务账户用于容器中的应用程序,以便它们可以访问Kubernetes API或其他服务。Kubernetes中的服务账户不同于操作系统中的服务账户。
命名空间(Namespace)
在Kubernetes中,Namespace(命名空间)是一种虚拟的集群,在其中可以创建和管理Kubernetes对象。Namespace将集群分割成多个虚拟集群,使得不同的用户、团队或项目可以在同一个Kubernetes集群中独立地创建和管理资源。
默认情况下,Kubernetes集群中有一个名为"default"的Namespace。管理员可以创建其他的Namespace,并将不同的对象分配给不同的Namespace。例如,可以将不同的应用程序、不同的团队或不同的环境放置在不同的Namespace中,以便更好地管理它们。
RBAC访问授权
在Kubernetes中,Role-Based Access Control(RBAC,基于角色的访问控制)是一种用于控制用户和服务账户对Kubernetes API的访问权限的访问控制机制。RBAC允许管理员定义一组角色和权限,以及将这些角色分配给用户或服务账户。
RBAC的核心是角色(Role)和角色绑定(RoleBinding)。其中,角色定义了一组权限,例如可以读取或写入某些资源,而角色绑定将用户或服务账户与角色相关联。Kubernetes还提供了ClusterRole和ClusterRoleBinding,它们可以用于控制对集群级别资源的访问。
espace。例如,可以将不同的应用程序、不同的团队或不同的环境放置在不同的Namespace中,以便更好地管理它们。
RBAC访问授权
在Kubernetes中,Role-Based Access Control(RBAC,基于角色的访问控制)是一种用于控制用户和服务账户对Kubernetes API的访问权限的访问控制机制。RBAC允许管理员定义一组角色和权限,以及将这些角色分配给用户或服务账户。
RBAC的核心是角色(Role)和角色绑定(RoleBinding)。其中,角色定义了一组权限,例如可以读取或写入某些资源,而角色绑定将用户或服务账户与角色相关联。Kubernetes还提供了ClusterRole和ClusterRoleBinding,它们可以用于控制对集群级别资源的访问。
我们将在后面章节中逐个详细的介绍上述内容