Kubernetes
一、基础知识
1. 概念和术语
2. Kubernetes特性
3. 集群组件
4. 抽象对象
5. 镜像加速下载
二、安装部署kubeadm
1. 基础环境准备
2. 安装runtime容器(Docker)
3. 安装runtime容器(Contained)
4. Containerd进阶使用
5. 部署kubernets集群
6. 部署calico网络组件
7. 部署NFS文件存储
8. 部署ingress-nginx代理
9. 部署helm包管理工具
10. 部署traefik代理
11. 部署dashboard管理面板(官方)
12. 部署kubesphere管理面板(推荐)
12. 部署metrics监控组件
13. 部署Prometheus监控
14. 部署elk日志收集
15. 部署Harbor私有镜像仓库
16. 部署minIO对象存储
17. 部署jenkins持续集成工具
三、kubectl命令
1. 命令格式
2.node操作常用命令
3. pod常用命令
4.控制器常用命令
5.service常用命令
6.存储常用命令
7.日常命令总结
8. kubectl常用命令
四、资源对象
1. K8S中的资源对象
2. yuml文件
3. Kuberbetes YAML 字段大全
4. 管理Namespace资源
5. 标签与标签选择器
6. Pod资源对象
7. Pod生命周期与探针
8. 资源需求与限制
9. Pod服务质量(优先级)
五、资源控制器
1. Pod控制器
2. ReplicaSet控制器
3. Deployment控制器
4. DaemonSet控制器
5. Job控制器
6. CronJob控制器
7. StatefulSet控制器
8. PDB中断预算
六、Service和Ingress
1. Service资源介绍
2. 服务发现
3. Service(ClusterIP)
4. Service(NodePort)
5. Service(LoadBalancer)
6. Service(ExternalName)
7. 自定义Endpoints
8. HeadlessService
9. Ingress资源
10. nginx-Ingress案例
七、Traefik
1. 知识点梳理
2. 简介
3. 部署与配置
4. 路由(IngressRoute)
5. 中间件(Middleware)
6. 服务(TraefikService)
7. 插件
8. traefikhub
9. 配置发现(Consul)
10. 配置发现(Etcd)
八、存储
1. 配置集合ConfigMap
6. downwardAPI存储卷
3. 临时存储emptyDir
2. 敏感信息Secret
5. 持久存储卷
4. 节点存储hostPath
7. 本地持久化存储localpv
九、rook
1. rook简介
2. ceph
3. rook部署
4. rbd块存储服务
5. cephfs共享文件存储
6. RGW对象存储服务
7. 维护rook存储
十、网络
1. 网络概述
2. 网络类型
3. flannel网络插件
4. 网络策略
5. 网络与策略实例
十一、安全
1. 安全上下文
2. 访问控制
3. 认证
4. 鉴权
5. 准入控制
6. 示例
十二、pod调度
1. 调度器概述
2. label标签调度
3. node亲和调度
4. pod亲和调度
5. 污点和容忍度
6. 固定节点调度
十三、系统扩展
1. 自定义资源类型(CRD)
2. 自定义控制器
十四、资源指标与HPA
1. 资源监控及资源指标
2. 监控组件安装
3. 资源指标及其应用
4. 自动弹性缩放
十五、helm
1. helm基础
2. helm安装
3. helm常用命令
4. HelmCharts
5. 自定义Charts
6. helm导出yaml文件
十六、k8s高可用部署
1. kubeadm高可用部署
2. 离线二进制部署k8s
3. 其他高可用部署方式
十七、日常维护
1. 修改节点pod个数上限
2. 集群证书过期更换
3. 更改证书有效期
4. k8s版本升级
5. 添加work节点
6. master节点启用pod调度
7. 集群以外节点控制k8s集群
8. 删除本地集群
9. 日常错误排查
10. 节点维护状态
11. kustomize多环境管理
12. ETCD节点故障修复
13. 集群hosts记录
14. 利用Velero对K8S集群备份还原与迁移
15. 解决K8s Namespace无法正常删除的问题
16. 删除含指定名称的所有资源
十八、k8s考题
1. 准备工作
2. 故障排除
3. 工作负载和调度
4. 服务和网络
5. 存储
6. 集群架构、安装和配置
本文档使用 MrDoc 发布
-
+
home page
5. 持久存储卷
# 概念 ## PersistentVolume(PV) 是由管理员设置的存储,它是群集的一部分。它是对底层共享存储的抽象,将共享存储作为一种可由用户申请使用的资源。PV 是Volume 之类的卷插件,但具有独立于使用 PV 的 Pod的生命周期。PV是集群级别的资源,不属于任何名称空间 ## pv与volume区别 - PV只能是网络存储(区别于上述的hostPath本地存储),不属于任何Node,但可以在每个Node上访问。 - PV并不是定义在Pod上的,而是独立于Pod之外定义。 - PV的生命周期与Pod是独立的。 ## PersistentVolumeClaim(PVC) 是用户存储的请求。它与 Pod 相似。Pod 消耗节点资源,PVC 消耗 PV 资源。Pod可以请求特定级别的资源(CPU和内存)。声明可以请求特定的大小和访问模式(例如,可以以读/写一次或只读多次模式挂载)<br />静态 pv:集群管理员创建一些 PV。它们带有可供群集用户使用的实际存储的细节。它们存在于Kubernetes API 中,可用于消费<br />动态pv:当管理员创建的静态 PV都不匹配用户的PersistentVolumeClaim时,集群可能会尝试动态地为 PVC创建卷。此配置基于StorageClasses:PVC 必须请求存储类,并且管理员必须创建并配置该类才能进行动态创建。声明该类为""可以有效地禁用其动态配置要启用基于存储级别的动态存储配置,集群管理员需要启用 API server上的DefaultStorageClass[准入控制器]。例如,通过确保DefaultStorageClass位于API server组件的--admission-control标志,使用逗号分隔的有序值列表中,可以完成此操作 ## pv与pvc绑定 master 中的控制环路监视新的 PVC,寻找匹配的PV(如果可能),并将它们绑定在一起。如果为新的 PVC 动态调配PV,则该环路将始终将该 PV 绑定到PVC。否则,用户总会得到他们所请求的存储,但是容量可能超出要求的数量。一旦 PV和 PVC 绑定后,PersistentVolumeClaim绑定是排他性的,不管它们是如何绑定的。PVC 跟PV 绑定是一对一的映射 ## 持久化卷声明的保护 PVC 保护的目的是确保由 pod 正在使用的 PVC不会从系统中移除,因为如果被移除的话可能会导致数据丢失当启用PVC 保护 alpha功能时,如果用户删除了一个 pod 正在使用的 PVC,则该 PVC 不会被立即删除。PVC的删除将被推迟,直到 PVC 不再被任何 pod 使用 ## PVC、PV、StorageClass关系  - PVC:Pod 想要使用的持久化存储的属性,比如存储的大小、读写权限等。 - PV :具体的 Volume 的属性,比如 Volume的类型、挂载目录、远程存储服务器地址等。 - StorageClass:充当 PV 的模板。并且,只有同属于一个 StorageClass 的 PV 和PVC,才可以绑定在一起。当然,StorageClass 的另一个重要作用,是指定 PV 的Provisioner(存储插件)。这时候,如果你的存储插件支持 Dynamic Provisioning的话,Kubernetes 就可以自动为你创建 PV 了。 # 创建PV ## PV容量(capacity) 设定当前PV的容量,单位为Gi、Mi ## 访问模式(accessModes) PersistentVolume可以以资源提供者支持的任何方式挂载到主机上。每个PV的访问模式都将被设置为该卷支持的特定模式。 | Volume Plugin | ReadWriteOnce | ReadOnlyMany | ReadWriteMany | | --- | --- | --- | --- | | AWSElasticBlockStore | ✓ | - | - | | AzureFile | ✓ | ✓ | ✓ | | AzureDisk | ✓ | - | - | | CephFS | ✓ | ✓ | ✓ | | Cinder | ✓ | - | - | | CSI | depends on the driver | depends on the driver | depends on the driver | | FC | ✓ | ✓ | - | | FlexVolume | ✓ | ✓ | depends on the driver | | Flocker | ✓ | - | - | | GCEPersistentDisk | ✓ | ✓ | - | | Glusterfs | ✓ | ✓ | ✓ | | HostPath | ✓ | - | - | | iSCSI | ✓ | ✓ | - | | Quobyte | ✓ | ✓ | ✓ | | NFS | ✓ | ✓ | ✓ | | RBD | ✓ | ✓ | - | | VsphereVolume | ✓ | - | - (works when Pods are collocated) | | PortworxVolume | ✓ | - | ✓ | | ScaleIO | ✓ | ✓ | - | | StorageOS | ✓ | - | - | - ReadWriteOnce:该卷可以被单个节点以读/写模式挂载 - ReadOnlyMany:该卷可以被多个节点以只读模式挂载 - ReadWriteMany:该卷可以被多个节点以读/写模式挂载 在命令行中,访问模式缩写为: - RWO:ReadWriteOnce - ROX :ReadOnlyMany - RWX:ReadWriteMany ## 回收策略(persistentVolumeReclaimPolicy) - Retain(保留):管理员手动回收 - Recycle(回收):基本擦除(rm -rf /thevolume/*),目前仅NFS和hostPath支持此操作。 - Delete(删除):关联的存储资产(例如 AWS EBS、GCE PD、Azure Disk 和OpenStack Cinder 卷)将被删除 ## storageClassName 当前PV所属的StorageClass的名称;pvc与pv绑定时根据此name值匹配 ## 卷可以处于以下的某种状态: - Available(可用):块空闲资源还没有被任何声明绑定 - Bound(已绑定):卷已经被声明绑定 - Released(已释放):声明被删除,但是资源还未被集群重新声明 - Failed(失败):该卷的自动回收失败命令行会显示绑定到 PV 的 PVC 的名称 ## 示例 - 定义了一个使用NFS存储后端的PV,空间大小为10GB,支持多路的读写操作。  - 查看创建的pv信息  # 创建pvc ## 简介 1. PersistentVolumeClaim是存储卷类型的资源,它通过申请占用某个PersistentVolume而创建,它与PV是一对一的关系,用户无须关心其底层实现细节。申请时,用户只需要指定目标空间的大小、访问模式、PV标签选择器和StorageClass等相关信息即可。 2. PVC的Spec字段的可嵌套字段具体如下。 - accessMode:当前PVC的访问模式,其可用模式与PV相同。 - resources:当前PVC存储卷需要占用的资源量最小值 - selector:绑定时对PV应用的标签选择器(matchLabels)或匹配条件表达式(matchEx-pressions),用于挑选要绑定的PV;如果同时指定了两种挑选机制,则必须同时满足两种选择机制的PV才能被选出。 - storageClassName:所依赖的存储类的名称。 - volumeName:用于直接指定要绑定的PV的卷名。 ## 示例 - 安装nfs服务器 ```bash # 安装nfs服务 dnf install -y nfs-utils systemctl start nfs-server systemctl enable nfs-server # 创建目录授权 mkdir -p /data/nfs chmod 666 /data/nfs chown nfsnobody /data/nfs # 导出文件系统 cat /etc/exports /data/nfs *(rw,no_root_squash,no_all_squash,sync) # 查看验证 # exportfs -rv exporting *:/data/nfs ``` - 客户端测试 `yum install nfs-utils`<br />`showmount -e 192.168.8.100` <br />`mount -t nfs 192.168.8.100:/data/nfs /mnt` - 创建pvc资源清单,绑定release为stable且storageClassName为slow的pv ```yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-nfs spec: accessModes: - ReadWriteMany volumeMode: Filesystem resources: requests: storage: 5Gi storageClassName: slow selector: matchLabels: release: "stable" ``` - 查看pvc详细信息  # pod中使用pvc ## 创建说明 创建pvc时,如果使用nfs存储,storageClassName默认是nfs-client<br />在Pod资源中调用PVC资源,只需要在定义volumes时使用persistentVolumeClaims字段嵌套指定两个字段即可,具体如下。 - claimName:要调用的PVC存储卷的名称,PVC卷要与Pod在同一名称空间中。 - readOnly:是否将存储卷强制挂载为只读模式,默认为false。 ## 示例 具体参考文档:[https://www.cuiliangblog.cn/detail/section/116191364](https://www.cuiliangblog.cn/detail/section/116191364) # statefulset使用pvc ## 创建说明 statefulset可以使用volumeClaimTemplates直接指定pvc,其可以帮助我们自动创建pvc,不需要我们手动定义pvc ## 示例 资源清单如下所示: ```yaml apiVersion: v1 kind: Service metadata: name: nginx labels: app: nginx spec: ports: - port: 80 name: web clusterIP: None selector: app: nginx --- apiVersion: apps/v1 kind: StatefulSet metadata: name: web spec: selector: matchLabels: app: nginx serviceName: nginx replicas: 3 template: metadata: labels: app: nginx spec: terminationGracePeriodSeconds: 10 containers: - name: nginx image: harbor.local.com/app/myapp:v1 ports: - containerPort: 80 name: web volumeMounts: - name: www mountPath: /usr/share/nginx/html volumeClaimTemplates: - metadata: name: www spec: accessModes: [ "ReadWriteOnce" ] storageClassName: "nfs-client" resources: requests: storage: 1Gi ``` 创建资源并查看 ```bash [root@tiaoban ~]# kubectl apply -f test.yaml service/nginx created statefulset.apps/web created [root@tiaoban ~]# kubectl get pod NAME READY STATUS RESTARTS AGE rockylinux 1/1 Running 20 (35m ago) 20d web-0 1/1 Running 0 34s web-1 1/1 Running 0 29s web-2 1/1 Running 0 25s [root@tiaoban ~]# kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE www-web-0 Bound pvc-5c1c35e1-84b7-4845-bc82-55e5cae9dd60 1Gi RWO nfs-client 41s www-web-1 Bound pvc-0fad5855-e349-4967-a182-1456de5c619a 1Gi RWO nfs-client 36s www-web-2 Bound pvc-6d03354a-094b-436e-b69f-f2257e66d9a4 1Gi RWO nfs-client 32s [root@tiaoban ~]# kubectl get pv | grep web pvc-0fad5855-e349-4967-a182-1456de5c619a 1Gi RWO Delete Bound default/www-web-1 nfs-client 45s pvc-5c1c35e1-84b7-4845-bc82-55e5cae9dd60 1Gi RWO Delete Bound default/www-web-0 nfs-client 50s pvc-6d03354a-094b-436e-b69f-f2257e66d9a4 1Gi RWO Delete Bound default/www-web-2 nfs-client 41s ``` # PV和PVC的生命周期 1. 存储供给<br />存储供给(Provisioning)是指为PVC准备可用PV的机制。Kubernetes支持静态供给和动态供给。 - 静态供给<br />静态供给是指由集群管理员手动创建一定数量的PV的资源供应方式。这些PV负责处理存储系统的细节,并将其抽象成易用的存储资源供用户使用。 - 动态供给<br />不存在某静态的PV匹配到用户的PVC申请时,Kubernetes集群会尝试为PVC动态创建符合需求的PV,此即为动态供给。这种方式依赖于存储类的辅助,PVC必须向一个事先存在的存储类发起动态分配PV的请求,没有指定存储类的PVC请求会被禁止使用动态创建PV的方式。另外,为了支持使用动态供给机制,集群管理员需要为准入控制器(admission controller)启用“DefaultStorageClass”选项 2. 存储绑定<br />用户基于一系列存储需求和访问模式定义好PVC后,Kubernetes系统的控制器即会为其查找匹配的PV,并于找到之后在此二者之间建立起关联关系,而后它们二者之间的状态即转为“绑定”(Binding)。若PV是为PVC而动态创建的,则该PV专用于其PVC。<br />若是无法为PVC找到可匹配的PV,则PVC将一直处于未绑定(unbound)状态,直到有符合条件的PV出现并完成绑定方才可用。 - 存储使用(Using)<br />Pod资源基于persistenVolumeClaim卷类型的定义,将选定的PVC关联为存储卷,而后即可为内部的容器所使用。对于支持多种访问模式的存储卷来说,用户需要额外指定要使用的模式。一旦完成将存储卷挂载至Pod对象内的容器中,其应用即可使用关联的PV提供的存储空间。 - PVC保护(Protection)<br />为了避免使用中的存储卷被移除而导致数据丢失,Kubernetes自1.9版本起引入了“PVC保护机制”。启用了此特性后,万一有用户删除了仍处于某Pod资源使用中的PVC时,Kubernetes不会立即予以移除,而是推迟到不再被任何Pod资源使用后方才执行删除操作。处于此种阶段的PVC资源的status字段为“Termination”,并且其Finalizers字段中包含“kubernetes.io/pvc-protection”。 3. 存储回收(Reclaiming)<br />完成存储卷的使用目标之后,即可删除PVC对象以便进行资源回收。不过,至于如何操作则取决于PV的回收策略。目前,可用的回收策略有三种:Retained、Recycled和Deleted。 - 留存(Retain)<br />留存策略意味着在删除PVC之后,Kubernetes系统不会自动删除PV,而仅仅是将它置于“释放”(released)状态。不过,此种状态的PV尚且不能被其他PVC申请所绑定,因为此前的申请生成的数据仍然存在,需要由管理员手动决定其后续处理方案。这就意味着,如果想要再次使用此类的PV资源,则需要由管理员按下面的步骤手动执行删除操作。<br />1)删除PV,这之后,此PV的数据依然留存于外部的存储之上。<br />2)手工清理存储系统上依然留存的数据。<br />3)手工删除存储系统级的存储卷(例如,RBD存储系统上的image)以释放空间,以便再次创建,或者直接将其重新创建为PV。 - 回收(Recycle)<br />如果可被底层存储插件支持,资源回收策略会在存储卷上执行数据删除操作并让PV资源再次变为可被Claim。另外,管理员也可以配置一个自定义的回收器Pod模板,以便执行自定义的回收操作。不过,此种回收策略行将废弃。 - 删除(Delete)<br />对于支持Deleted回收策略的存储插件来说,在PVC被删除后会直接移除PV对象,同时移除的还有PV相关的外部存储系统上的存储资产(asset)。支持这种操作的存储系统有AWS<br />EBS、GCE PD、Azure<br />Disk或Cinder。动态创建的PV资源的回收策略取决于相关存储类上的定义,存储类上相关的默认策略为Delete,大多数情况下,管理员都需要按用户期望的处理机制修改此默认策略,以免导致数据非计划内的误删除。 4. 扩展PVC<br />Kubernetes自1.8版本起增加了扩展PV空间的特性,截至目前,它所支持的扩展PVC机制的存储卷共有以下几种。 - gcePersistentDisk - awsElasticBlockStore - Cinder - glusterfs - rbd<br />“PersistentVolumeClaimResize”准入插件负责对支持空间大小变动的存储卷执行更多的验证操作,管理员需要事先启用此插件才能使用PVC扩展机制,那些将“allowVolume<br />Expansion”字段的值设置为“true”的存储类即可动态扩展存储卷空间。随后,用户改动Claim请求更大的空间即能触发底层PV空间扩展从而带来PVC存储卷的扩展。<br />对于包含文件系统的存储卷来说,只有在有新的Pod资源基于读写模式开始使用PVC时才会执行文件系统的大小调整操作。换句话说,如果某被扩展的存储卷已经由Pod资源所使用,则需要重建此Pod对象才能触发文件系统大小的调整操作。支持空间调整的文件系统仅有XFS和EXT3/EXT4。
Nathan
June 22, 2024, 12:46 p.m.
转发文档
Collection documents
Last
Next
手机扫码
Copy link
手机扫一扫转发分享
Copy link
Markdown文件
PDF文件
Docx文件
share
link
type
password
Update password