一、K8s中的那些事
1.1 挂载代码时建立的镜像
挂载代码时不需要那些很大的镜像,只需要用一个很小的镜像就可以了。因此选择alpine:latest镜像来运载你的代码。
- alipine镜像基于alpine linux项目,这是一个专门为容器内部使用而构建的操作系统。在很长一段时间里,这些是最受欢迎的镜像变体,因为它们的尺寸很小,其镜像是获取最小资源消耗的Linux环境的首选。
1.2 K8s中的基本概念
- 在Kubernetes中,节点是指集群中运行容器的实际主机(服务器)。每个节点可以运行一个或多个Pod,负责容器的生命周期管理、资源调度、容器网络和存储等操作。节点是集群的基础设施组成部分,共同协同工作以提供可靠且高效的容器部署环境。
- 容器:是一种轻量级的虚拟化技术,用于封装应用及其依赖。常见的工具有 Docker。
- K8s中的Pod: 在Kubernetes中,Pod是最小的可部署对象,它是一个或多个容器的组合。 Pod作为一组紧密关联的容器的封装,共享相同的网络命名空间和存储卷。 这意味着Pod中的所有容器可以直接通过localhost进行通信,无需进行网络地址转换 (NAT)。
- K8s中的命名空间(Namespace):Kubernetes中的Namespace是一种用于在集群内部组织和隔离资源的机制。一个Namespace可以看作是一个虚拟的集群,它将物理集群划分为多个逻辑部分,每个部分都有自己的一组资源(如Pod、Service、ConfigMap等)。Namespace 适合用于隔离不同用户创建的资源。用于给集群中的任何对象组进行分类、筛选和管理。每一个添加到Kubernetes集群的工作负载必须放在一个命名空间中。
- K8s中的数据卷(Volume):**为什么需要卷?答案:**而容器中的文件在磁盘上是临时存放的,这给容器中运行比较重要的应用程序带来一些问题。a): 数据持久化问题,当容器升级或者崩溃时,kubelet会重建容器,容器内文件会丢失。b): 数据共享问题,一个Pod中运行多个容器并需要共享文件。Kubernetes中的数据卷,也可以称为存储卷,能够解决这两个问题。**什么是卷?答案:**存储卷(PV)是用于持久化存储容器中数据的一种机制,可以提供容器内持久化存储的能力,使容器可以在不同的生命周期中保留数据。数据卷与容器相互独立,并且具有自己的生命周期。当容器被销毁或重启时,数据卷的内容仍然保持不变,从而确保了容器内数据的持久性(解决了问题1)。数据卷可以与一个或多个容器进行绑定,使它们可以共享数据(解决了问题2)。
- PV (储存卷) 是一个集群级别的资源,表示物理存储设备。在 Kubernetes 中,PV 可以被视为存储的抽象,它可以来自多个不同的存储系统,比如本地磁盘、NFS、云服务(如 AWS EBS、Google Cloud Persistent Disk 等)。每个 PV 都有其特定的容量、访问模式(例如 ReadWriteOnce、ReadOnlyMany、ReadWriteMany)以及存储类(StorageClass)等属性。
- PVC是对存储卷PV的请求或声明。它允许用户(如 Pod)向 Kubernetes 表示需要多少存储,以及需要什么样的访问模式。PVC 是一个用户级别的 API 对象,当用户创建 PVC 时,Kubernetes 会根据请求的存储大小和访问模式从可用的 PV 中匹配一个合适的 PV。
1.3 PV 和 PVC的关联
-
- 绑定:当 PVC 被创建后,Kubernetes 会查找一个符合 PVC 要求的 PV。如果找到匹配的 PV,Kubernetes 会将这个 PV 绑定到对应的 PVC。这个绑定是单向的,即一个 PV 只能绑定一个 PVC,而一个 PVC 可以绑定一个 PV。
-
- 使用:一旦 PVC 和 PV 成功绑定,用户可以在 Pod 中引用 PVC,并通过 PVC 使用与之绑定的存储。这样,Pod 就可以使用被抽象出来的持久存储,而无需直接与底层存储管理。
-
- 生命周期:PV 的生命周期独立于 PVC 的生命周期。当 PVC 被删除时,PV 仍然存在,具体行为取决于 PV 的回收策略(Reclaim Policy),可以设置为保留(Retain)、自动清理(Recycle)或删除(Delete)。
1.4 Kubernetes 中处理存储资源的方式
WHAT???什么是Kubernetes 中处理存储资源的方式,这么绕口的一句话,不懂!!!
下面用例子解释《什么是Kubernetes 中处理存储资源的方式》
在 Kubernetes 中,处理存储资源的方式主要有两种:提前准备存储(静态供给) 和 按需创建存储(动态供给)。
静态供给
例子:就好比你在家里的装修中,提前购买了一些家具(如沙发、桌子)并把它们搬进了房间。每个家具都有特定的地方,不需要再去购买。你在需要用某个家具时,只需要去那个地方找就行了。
在 Kubernetes 中,静态供给的过程是:
-
- 管理员准备存储:管理员提前创建好 Persistent Volumes(PV),比方说,准备了一些数据库使用的固定存储。
-
- 用户请求存储:用户通过 Persistent Volume Claim(PVC)请求一个特定的存储。Kubernetes 会查看管理员准备好的 PV,并根据 PVC 的要求找到合适的 PV 进行绑定。
动态供给
例子:而动态供给就像是在你需要新的家具时,直接通过网上下单,选择需要的款式和颜色,家具公司会根据你的要求直接为你制作并送到家里。
在 Kubernetes 中,动态供给的过程是:
-
- 用户请求存储:用户创建一个 PVC,并在其中指定他们需要的存储要求(如大小、访问速度等)。
-
- 自动创建存储:Kubernetes 会根据用户的请求,实时创建一个合适的 Persistent Volume(PV),而这些 PV 是根据存储类型(如 SSD、HDD)和性能要求动态生成的。
示例总结
静态供给 示例:管理员在集群中手动创建了几个 PV(例如:一个 100GB 的 SSD 存储和一个 200GB 的 HDD 存储),然后用户通过 PVC 请求这两个存储中的一个。
动态供给 示例:用户只需创建一个 PVC,比如请求一个“100GB 的 SSD 存储”。Kubernetes 检查到没有现成的 PV,于是自动向底层存储系统申请并创建一个符合此请求的新 PV。
1.4.1 动态创建储存卷(PV)
在 Kubernetes 中,StorageClass 就是动态供给。根据PVC的需求动态创建合适的PV资源,从而实现存储卷的按需创建。
下面是一个 StorageClass 的示例 YAML 定义:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: high-speed-storage
provisioner: kubernetes.io/abc-storage
parameters:
type: fast-ssd
iopsPerGB: "10"
reclaimPolicy: Delete
mountOptions:
- discard
在上面的示例中,StorageClass 定义了名为 high-speed-storage 的存储类型,指定了存储类型为快速 SSD,并设定了 IOPS 选项和回收策略为删除。 iopsPerGB: "10"表示的是每GB 存储空间支持 10 次每秒的 I/O 操作,值越大,读写速度越快。那Provisioner是个啥呢?其实就一个存储驱动,类似操作系统里的磁盘驱动。StorageClass 资源对象的定义主要包括:名称、Provisioner、存储的相关参数配置、回收策略。StorageClass一旦被创建,则无法修改,只能删除重新创建。
所以我们在创建PVC的时候步骤可以如下:
- 步骤 1: 创建 StorageClass来动态的创建PV。(就好比先申请了特定参数的内存大小【10GB,读写速度快】)
- 步骤 2: 使用 StorageClass创建 PVC
- 步骤 3: 使用 PVC
二、K8s
Kubernetes(简称k8s) 是一个用于自动化容器化应用程序的部署、扩展和管理的开源平台。它可以帮助你管理与调度容器,保证应用在不同环境间的可靠性和可扩展性。
2.1 主要组件
在 Kubernetes 中,集群通常由两类节点组成:控制节点(Control Plane)和工作节点(Worker Nodes)。这两者的角色和功能不同,我将详细解释它们的区别。
1. 控制节点(Control Plane)
控制节点负责管理整个 Kubernetes 集群的操作和状态。它包含多个组件,确保集群的健康,并处理用户的请求和调度。其主要功能包括:
- 管理集群状态:负责维护集群的整体状态,保障应用的正确部署和运行。
- 接收命令:处理来自用户和其他组件的请求。
- 调度:决定 Pod 的调度位置,即哪个工作节点运行哪些 Pod。
- 监控:持续监控节点和 Pod 的健康状态,并根据需要进行自我修复。
主要组件: - kube-apiserver:集群的 API 服务器,所有的操作请求(如创建、更新、删除等)都通过它进行。
- etcd:分布式键值存储,用于保存集群的元数据和状态。在控制节点发生故障时,etcd 确保集群状态的持久性。
- kube-scheduler:负责调度未分配的 Pod 到合适的工作节点上。
- kube-controller-manager:运行各种控制器,确保集群状态符合用户指定的期望状态。
- cloud-controller-manager(如果在云环境中使用):与云平台的 API 交互,管理云资源。
2. 工作节点(Worker Nodes)
工作节点是实际运行用户应用程序(即 Pod)的节点。每个工作节点可以运行多个 Pod,处理应用的请求和负载。它们与控制节点协作,确保应用的可靠性和性能。
主要组件:
- kubelet:工作节点上的主要代理,负责与控制平面通信,维持 Pod 及其容器的生命周期。
- kube-proxy:负责处理网络规则和负载均衡,将外部请求路由到适当的 Pod。
- Container Runtime:实际负责运行和管理容器的运行时环境,比如 Docker、containerd 等。
总结:
控制节点:负责管理和协调整个 Kubernetes 集群的状态和操作,包括调度、监控和自我修复等。
工作节点:实际运行用户的应用程序(Pod),处理请求和负载。