当前位置: 首页 > news >正文

k8s笔记01

Kubernetes(K8s)核心能力学习笔记

一、服务发现和负载均衡

(一)核心原理

  1. 暴露方式:K8s 中不直接暴露工作负载实例的 IP,而是通过 Service 暴露容器,可使用 DNS 名称或 Service 自身 IP 访问。
  2. 负载均衡实现:K8s 内置 DNS 服务,应用负载不直接访问工作负载实例,而是访问 Service,由 Service 实现背后应用的负载均衡,类似部署 talk 应用时通过 agens 实现负载均衡的逻辑。
  3. 解决的问题:集群中工作负载的 IP 动态变化,Service 负载均衡能有效解决背后一组动态 IP 的访问问题,实现集群范围内通过 Service 进行服务通信与注册发现。

(二)配置与操作示例

  1. 配置要点:示例代码中“keep us core capability”对应核心能力配置,包含一个有两个实例的工作负载和一个对应的 Service,需通过 select 与工作负载中的 labels 关联,形成映射(工作负载实例和 Service 均有 IP,但通过 Service IP 访问)。
  2. 部署命令content play -f 两个配置文件(推测为 kubectl apply -f 两个配置文件)。
  3. 查看资源
    • 查看 Deployment 和 Service:kubectl get deployments(Deployment 可简写为 depo)、kubectl get services(Service 可简写为 svc)。
    • 查看工作实例及 Service 的 IP:kubectl get pods -o widekubectl get svc -o wide
  4. 访问服务:通过 curl + Service IP(如 curl 10.105.143.105)访问应用,也可通过 Pod IP 访问,但通常推荐通过 Service(应用内部的负载均衡器)访问。

二、存储编排

(一)核心原理与概念

  1. 存储支持范围:K8s 允许自动挂载用户选择的存储系统,包括本地存储、云存储等,存储类型有 hostPath、IFS 及云厂商提供的 cos 等,对存储进行抽象(后续课程详细介绍)。
  2. 关键对象
    • PV(Persistent Volume,持久卷):定义存储资源的供应,是集群中的一块存储资源。
    • PVC(Persistent Volume Claim,持久卷声明):实现存储资源的获取,声明使用某块 PV 资源,PV 被 PVC 绑定后,仅能供该 PVC 使用。
    • 存储挂载:应用通过定义 PVC 声明,绑定对应的 PVC,将存储资源挂载到容器内指定目录,实现数据持久化,解耦应用生命周期与存储生命周期(Pod 数据临时存在,Pod 销毁数据丢失,持久化存储可保留数据)。

(二)配置与操作示例

  1. 配置要点:示例配置定义本地存储(hostPath)及对应目录,同时定义 PVC,应用中定义 PVC 声明以获取存储资源,将宿主机目录挂载到容器内 /usr/share/nginx/html 目录(Nginx 1.14.2 默认目录)。
  2. 部署与操作步骤
    • 清理环境(删除之前资源)。
    • 部署存储相关配置:kubectl apply -f 存储配置文件
    • 查看资源:kubectl get pv(查看 PV)、kubectl get pvc(查看 PVC,确认与 PV 绑定)、kubectl get pods(查看应用 Pod,如名为 agent-pv 的 Pod)。
    • 初始访问:获取 Pod IP(kubectl get pods -o wide),通过 curl + Pod IP 访问,此时无数据(因宿主机对应目录未创建数据文件)。
    • 写入数据:切换到宿主机,创建目录 mkdir -p /temp/nginx-beta,进入该目录创建 index.html 并写入数据(如 echo "Hello, welcome to CK course." > index.html)。
    • 再次访问:curl + Pod IP,可获取写入的数据(存储目录已挂载到容器)。
    • 进入容器验证:kubectl exec -it <Pod 名称> -- /bin/bash(如 kubectl exec -it agent-pv -- /bin/bash),进入 /usr/share/nginx/html 目录,查看 index.html 内容与宿主机写入一致。

三、自动部署和回滚

(一)核心原理

  1. 部署方式:K8s 可通过描述文件定义已部署容器的所需状态,采用 滚动更新(Rolling Update) 方式以受控方式更新应用状态。
  2. 滚动更新原理:假设有旧版本(如 3 个实例),发布新版本(3 个实例)时,旧实例先保留,部署新实例;新实例部署成功一个,旧实例删除一个;直至所有新实例部署成功,旧实例全部下架,实现新旧版本交替替换。
  3. 优势:避免蓝绿部署的大量资源消耗,且更安全——若发布错误版本,错误版本无法正常更新,无法替换旧版本;可通过回滚命令快速回滚到上一个可用版本或指定版本,保障应用部署安全可靠。

(二)配置与操作示例

  1. 配置要点:示例配置部署无状态应用(Deployment 类型),定义 3 个副本,更新策略为滚动更新,可配置 maxSurge(最大超出期望副本数)、maxUnavailable(最大不可用副本数)等参数。
  2. 部署与操作步骤
    • 清理环境(退出之前容器,删除旧资源)。
    • 部署应用:kubectl apply -f 应用配置文件,查看部署状态:kubectl get deployments(如应用名为 engines-roll,初始创建 3 个副本,逐步完成创建)。
    • 查看滚动更新状态:kubectl rollout status deployment <Deployment 名称>(如 kubectl rollout status deployment engines-roll)。
    • 扩展副本数:kubectl scale deployment <Deployment 名称> --replicas=<副本数>(如 kubectl scale deployment engines-roll --replicas=5),查看扩展结果:kubectl get deployment engines-roll,确认 5 个副本已扩展。
    • 查看版本历史:kubectl rollout history deployment <Deployment 名称>(如 kubectl rollout history deployment engines-roll,初始仅 1 个版本)。
    • 发布新版本(正常版本):通过修改镜像版本更新,命令为 kubectl set image deployment <Deployment 名称> <容器名称>=<镜像版本>(如 kubectl set image deployment engines-roll nginx=nginx:1.16.1,原版本为 1.14.2),查看版本历史,新增版本 2;查看配置确认更新:kubectl get deployment engines-roll -o yaml,镜像版本已变为 nginx:1.16.1
    • 发布错误版本:继续通过 kubectl set image 发布不存在的版本(如 nginx:1.161),查看版本历史,新增版本 3;查看更新状态:kubectl rollout status deployment engines-roll,更新会停滞(无法拉取不存在的镜像);查看 Pod 状态:kubectl get pods,新创建的 Pod 无法正常启动。
    • 回滚操作:
      • 回滚到上一版本(默认回滚到版本 2):kubectl rollout undo deployment <Deployment 名称>(如 kubectl rollout undo deployment engines-roll)。
      • 回滚到指定版本:kubectl rollout undo deployment <Deployment 名称> --to-revision=<版本号>(如 kubectl rollout undo deployment engines-roll --to-revision=2)。
      • 验证回滚:kubectl get deployment engines-roll -o yaml,确认镜像版本回滚到 nginx:1.16.1,回滚成功。
  3. 关键结论:仅当镜像可正确拉取和启动时,滚动更新才会替换旧版本,确保部署安全;若部署失败版本,可通过 kubectl rollout undo 命令快速回滚。

四、待补充核心能力

文档中提及 K8s 六大核心能力,除上述“服务发现和负载均衡”“存储编排”“自动部署和回滚”外,还有“自动完成专项计算”“自我修复”“密钥与配置管理”,后续需进一步学习补充相关内容。

http://www.dtcms.com/a/341475.html

相关文章:

  • WIFI国家码修改信道方法_高通平台
  • 如何将数据从 iPhone 转移到 vivo?
  • 基于Python的反诈知识科普平台 Python+Django+Vue.js
  • 道路车道线分割数据集左车道右车道中线labelme格式3494张4类别
  • 工业电脑选得好生产效率节节高稳定可靠之选
  • Pycharm-002 Pycharm 编译器运行器不显示,日志不打印
  • MySQL 事务(重点)
  • GThinker多模态大模型:线索引导式反思的突破
  • Oracle官方文档翻译《Database Concepts 23ai》第2章-容器数据库与可插入数据库
  • Qwen Image edit的ComfyUI工作流搭建
  • vue中动态设置class类名和style样式
  • Javascript面试题及详细答案150道之(121-135)
  • 医学影像分析中的持续学习:近期进展与未来展望综述|文献速递-深度学习人工智能医疗图像
  • 42-Python基础语法-2
  • Lecture 5 GPUs课程笔记
  • Leetcode 深度优先搜索 (9)
  • Kafka-Kraft
  • leetcode3 无重复字符的最长子串
  • vue2封装日期选择组件--有时间选择版本
  • 创建Vue项目的不同方式及项目规范化配置
  • Playwright 与 Scrapy 的实际应用场景能力分析
  • 深入理解 Spring 的 @ControllerAdvice
  • 【AI应用】修改向量数据库Milvus默认密码
  • KylinV10服务器版和桌面版SVN搭建步骤
  • python中view把矩阵维度降低的时候是什么一个排序顺序
  • 深度解析LangChain:LLM应用开发利器
  • Linux: network: arp: arp_accept
  • linux内核 - 内存管理单元(MMU)与地址翻译(二)
  • 直播预告|鸿蒙全场景开发指南
  • 【GPT入门】第50课 LlamaFacotory 客观评估模型效果