k8sday12数据存储(1/2)

目录

一、简单基本存储

1、EmptyDir

1.1概念

1.2作用

1.3配置文件

1.4测试

2、HostPath

2.1概念

2.2作用

2.3配置文件

2.4测试

①、数据共享

②、持久化存储

3、NFS

3.1概念

3.2作用

3.3NFS服务安装

①、设置主节点为NFS服务器

②、给副节点安装NFS客户端工具

3.4配置文件

3.4测试

①、数据共享

②、持久化存储


由于k8s中Pod的生命周期短暂,会被频繁的创建和销毁,容器的重启或迁移也会导致数据丢失,而有状态应用需求,如数据库、消息队列等需要持久化存储,确保数据在容器生命周期之外依然存在,方便用户调用,为了实现持久化保存数据,k8s引入Volume实现同一个Pod中的不同容器的数据共享和数据持久化,即使容器重启或迁移等等都不会导致Volume数据丢失。

常见Volume类型:

  • 简单基本存储:EmptyDir、HostPath、NFS

  • 高级核心存储:PV、PVC

  • 配置存储:ConfigMap、Secret

一、简单基本存储

1、EmptyDir

1.1概念

​ EmptyDir是在Pod被分配到Node时创建的,初始内容为空,无法指定宿主机对应的文件目录,一个EmptyDir相当于一个Host的空目录,当Pod销毁时,EmptyDir的数据也会被永久删除,即EmptyDir只在Pod的生命周期内有效。

1.2作用

由于EmptyDir只在Pod的生命周期内有效,故不适合做持久化的数据存储,只适合做临时存储

  • 作为临时空间,无须长久保留

  • 为同一个Pod内的不同容器实现数据共享

1.3配置文件
  apiVersion: v1
  kind: Pod
  metadata:
    name: nginx-busybox-log
    namespace: default
  spec:
    containers:
    # ---------- Nginx ----------
    - name: nginx
      image: nginx:1.24.0           # 体积小、镜像拉取快
      ports:
      - containerPort: 80
      volumeMounts:
      - name: logs-volume
        mountPath: /var/log/nginx   # Nginx 默认日志目录
    # ---------- BusyBox ----------
    - name: busybox
      image: busybox:1.36.1         # 推荐稳定版本
      command: ["/bin/sh","-c","tail -f /logs/access.log"]   # 初始命令,动态读取指定文件内容
      volumeMounts:
      - name: logs-volume
        mountPath: /logs            # BusyBox 内查看目录
    # ---------- 共享卷 ----------
    volumes:
    - name: logs-volume             # 共享卷名称
      emptyDir: {}                  # 数据卷类型,Pod 级临时目录,两容器共享
1.4测试

最终实现:每当我访问nginx,nginx会将访问的日志信息存储到/var/log/nginx目录下,而busybox可通过命令查看是否有日志生成,即实现同一个Pod中两个不同容器之间通过数据卷emptydir进行了数据共享。

  # 创建 Pod
  # 记住要在yaml文件目录下
  kubectl create -f nginx-busybox-emptydir.yaml
  ​
  # 查看是否创建 Pod 成功
   kubectl get po nginx-busybox-log -o wide
  ​
  # 访问 nginx 
  kubectl exec nginx-busybox-log -- curl http://localhost
  ​
  #-----------------双开终端--------------------------
  # 双开终端方便查看指定容器的标准输出
  # kubectl logs -f <你创建的数据卷名称> -n <你创建数据卷指定的命名空间> -c <指定容器>
  kubectl logs -f nginx-b
### JavaScript 中 Date 对象 `setMonth` 方法的行为分析 #### 1. `setMonth` 的行为描述 在 JavaScript 中,`Date` 对象的 `setMonth` 方法用于设置日期对象中的月份部分。需要注意的是,JavaScript 的月份是从零开始计数的,即 January 是第 0 个月,December 是第 11 个月[^2]。 当调用 `setMonth` 设置月份时,如果目标月份超出了当前日期的有效范围,则会自动调整到下一个合法的日期。这种行为可能导致意外的结果,尤其是在处理跨月或闰年的场景下[^3]。 --- #### 2. 导致日期不准确的具体原因 以下是导致日期计算错误的主要原因: - **月份从零开始** 如果开发者未注意到这一点并传递了一个基于常规逻辑(January 为 1)的数值给 `setMonth`,则会导致实际设定的月份比预期少一个月。例如,`date.setMonth(1)` 实际上设置了 February 而不是 January。 - **超出有效日期范围的自动调整** 当使用 `setMonth` 修改月份时,如果新月份无法容纳原日期值,则会向后滚动至下一月。例如: ```javascript let date = new Date(2023, 0, 31); // 创建一个表示 2023 年 1 月 31 日的对象 date.setMonth(1); // 尝试将月份改为 2 (February),但二月最多有 28 天 console.log(date); // 输出结果为 2023 年 3 月 3 日 ``` 上述例子中,因为 February 只能容纳 28 或 29 天,而初始日期是 31 日,因此最终日期被调整到了 March 3rd。 --- #### 3. 解决方法 为了避免上述问题的发生,可以采取以下措施之一: - **手动验证日期合法性** 在修改月份之前先确认该月份是否有足够的天数来保存现有的日期值。如果不满足条件,则显式地将其重置为月末最后一天。例如: ```javascript function safeSetMonth(date, month) { const daysInCurrentMonth = new Date(date.getFullYear(), month + 1, 0).getDate(); if (date.getDate() > daysInCurrentMonth) { return new Date(date.getFullYear(), month, daysInCurrentMonth); } return new Date(date.getFullYear(), month, date.getDate()); } let originalDate = new Date(2023, 0, 31); // 2023 年 1 月 31 日 let adjustedDate = safeSetMonth(originalDate, 1); // 安全地切换到 2 月 console.log(adjustedDate); // 输出:2023 年 228 日 ``` - **利用标准化库简化操作** 使用第三方日期处理库(如 Moment.js 或 Day.js),这些工具提供了更直观的方法来进行复杂的日期运算,并能够更好地应对边界情况。例如,在 Day.js 中可以通过链式调用来安全更改月份而不必担心溢出问题: ```javascript const dayjs = require('dayjs'); const result = dayjs('2023-01-31').add(1, 'month'); // 自动修正为目标月份的最后一日 console.log(result.format('YYYY-MM-DD')); // 输出:2023-02-28 ``` --- #### 4. 示例代码展示 下面是一个完整的示例程序演示如何正确应用 `setMonth` 来避免潜在陷阱: ```javascript // 初始化日期为 2023 年 1 月 31 日 let initialDate = new Date(2023, 0, 31); console.log(`Original Date: ${initialDate.toISOString().split('T')[0]}`); try { // 不加校验直接尝试改变月份 initialDate.setMonth(1); } catch (e) {} console.log(`After unsafe setMonth: ${initialDate.toISOString().split('T')[0]}`); // 应用改进后的函数重新执行相同动作 function adjustSafeMonth(d, m) { const maxDays = new Date(d.getFullYear(), m + 1, 0).getDate(); d.setDate(Math.min(maxDays, d.getDate())); d.setMonth(m); } adjustSafeMonth(initialDate, 1); console.log(`After safe adjustment: ${initialDate.toISOString().split('T')[0]}`); ``` 运行以上脚本将会得到如下输出: ``` Original Date: 2023-01-31 After unsafe setMonth: 2023-03-03 After safe adjustment: 2023-02-28 ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值