k8sday15

今天的学习主要是针对上一组学习,也就是k8s数据存储的补充,因为现在网络上的学习各有不同,所以我在对比了几类课程后,再进行融合等等操作,当然,今天的补充知识,我之后会将其更新回k8sday12---k8sday14

补充一、PV和PVC的动态供给

​ 之前我们在PV和PVC章节所讲的是静态供给策略,用户将需要的资源要求发送给PVC来进行PV的匹配,如果有符合的就绑定,没有就不绑定,如用户要2.88GI,现在有的PV只有3GI且没有和其他的PVC绑定,这个3GI的PV就会和2.88GI的PVC绑定,但是如果这时候又有用户要0.18GI,当前没有和他匹配的PV,就不会进行绑定。

​ 现在所讲的动态供给策略就是对静态供给的一种优化,因为静态补给是我们管理员已经提前创建好了PV,但不一定是用户所需要的,所以可能导致PV和PVC不绑定,即使满足绑定要求,也不一定是最好的,如3GI的PV和2.88GI的PVC绑定。而动态供给是用户提出需求给PVC,PVC和云供应商在集群内的抽象(存储类)沟通,这时候按照请求来"定制"一个PV,使之绑定。

精简总结:++静态PV是管理员提前创建好的,动态PV是等提出需求后按照需求创建的++

StorageClass 是 Kubernetes 用来 "抽象并自动化持久存储供给(Provisioning)" 的一组对象。一句话:告诉集群"我需要什么类型、什么性能、多少副本的存储",集群就按这个模板自动给你创建 PV。

存储类核心功能 说明
动态供给 PVC(PersistentVolumeClaim)一旦声明 StorageClass,集群会自动创建匹配的 PV,无需管理员手工建 PV。
参数模板 存储类型、IOPS、副本数、加密、磁盘格式等全部写在 StorageClass 里,PVC 只需引用名字。
回收策略 可指定 PV 释放后 Delete / Retain / Recycle 的行为。

提供一个简单StorageClass的示例:

复制代码
  apiVersion: storage.k8s.io/v1
  kind: StorageClass
  metadata:
    name: sc-test                      # PVC 通过这个名字引用(可自定义)
  provisioner: kubernetes.io/aws-ebs   # 底层存储驱动
  parameters:
    type: gp3                          # AWS EBS 的 gp3 SSD
    iops: "3000"
    encrypted: "true"
  reclaimPolicy: Delete                # PVC 删除后自动回收 EBS

常见命令:

bash 复制代码
  # 查看集群有哪些 StorageClass
  kubectl get sc
  ​
  # 查看详情
  kubectl describe sc <你的存储类名称>
  ​
  # 设置默认 StorageClass
  kubectl patch sc fast-ssd -p '{"metadata":{"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
常见云厂商 provisioner 示例
AWS kubernetes.io/aws-ebs
GCP kubernetes.io/gce-pd
Azure kubernetes.io/azure-disk / azurefile
阿里云 diskplugin.csi.alibabacloud.com
腾讯云 com.tencent.cloud.csi.cbs
本地 rancher.io/local-path, openebs.io/local, rook-ceph.rbd.csi.ceph.com ...

想使用动态供给还需要我们完成k8s集群安全机制的学习,进行授权管理等等,所以现在就不演示

补充二、元数据投影 Volume

Downward API 是 Kubernetes 提供的一种 "自省" 机制:把 Pod / 容器自身的元数据(而不是用户配置)以"文件"或"环境变量"的形式注入到容器内部,方便应用动态获取当前运行上下文,而无需调用 Kubernetes API。

精简总结:++把 Kubernetes 自己知道的 Pod 信息告诉容器------ 不是存储,只是 只读投影。++

Downward API也是注入的策略

Ⅰ、使用(消费)方式

①、作为环境变量(不支持热更新)
bash 复制代码
  apiVersion: v1
  kind: Pod
  metadata:
    name: demo                            # 定义一个Pod,名字叫demo
  spec:
    containers:
    - name: app
      image: busybox:1.36.1               # 镜像版本
      command: ["sh","-c","echo Running as $MY_POD_NAME in $MY_NODE"]
      # command命令 指容器启动后打印环境变量 MY_POD_NAME 和 MY_NODE 的值
      
      # 将当前Pod 的元数据注入容器
      env:
      - name: MY_POD_NAME                 # 容器内已有变量
        valueFrom:                      # 值来源
          fieldRef:
            fieldPath: metadata.name      # 将当前 Pod 的metadata.name 即demo给 MY_POD_NAME 变量
      - name: MY_NODE                     # 容器内已有变量
        valueFrom:                        # 值来源
          fieldRef:
            fieldPath: spec.nodeName      # 将当前Pod 的spec.nodeName 给 MY_POD_NAME 变量
②、作为卷挂载(支持热更新)
bash 复制代码
  apiVersion: v1
  kind: Pod
  metadata:
    name: demo
    labels:
      myname: downwardapitest          # 该容器的 labels 标签,将被写入下方生成的 labels 文件
  spec:
    containers:
    - name: app
      image: busybox:1.36.1
      command: ["sh","-c","cat /etc/podinfo/labels && sleep 3600"]
      # 容器启动后,把标签文件打印出来再保持运行
      volumeMounts:
      - name: podinfo                   # 要挂载的卷的名称
        mountPath: /etc/podinfo         # 要挂载到的路径
        readOnly: true                  # 只读
    volumes:
    - name: podinfo                     # 定义一个叫 podinfo 卷
      downwardAPI:                      # 卷的类型是 DownwardAPI
        items:
        - path: "labels"                # 在mountPath路径下生成一个labels文件
          fieldRef:                     # 文件内容来源
            fieldPath: metadata.labels  # 将该容器的 labels 标签全部写入刚刚生成的 labels 文件
        - path: "cpu_limit"             # 在 mountPath 路径下生成一个 cpu_limit 文件
          resourceFieldRef:             # 文件内容来源
            containerName: app          # 指定 containerName 叫 app 的容器
            resource: limits.cpu        # 将 CPU 的 limit 指写入刚刚生成的 cpu_limit 文件
            
  # 当你对文件进行更新修改后,其对应的文件回进行热更新,同步你的更新

完成了今天的补充工作,下周将继续我们调度器,安全机制等等的学习,学了安全机制后,我们会将现在的downward API和动态PV供给进行授权管理以完成完整学习