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 只需引用名字。
### 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 年 2 月 28 日 ``` - **利用标准化库简化操作** 使用第三方日期处理库(如 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 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值