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

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.xdnf.cn/news/18246.html

相关文章:

  • 服务器硬盘进行分区和挂载
  • SLAM文献之-Globally Consistent and Tightly Coupled 3D LiDAR Inertial Mapping
  • AI +金融 = 七大核心维度+ 落地典型困难
  • 【Golang实战】Go Module 双段 require 配置深度解析
  • Lecture 5 GPUs课程笔记
  • C语言---编译的最小单位---令牌(Token)
  • 认识Node.js及其与 Nginx 前端项目区别
  • KubeBlocks AI:AI时代的云原生数据库运维探索
  • Notepad++批量转UTF-8脚本
  • Flink Stream API - 顶层Operator接口StreamOperator源码超详细讲解
  • 结合SAT-3D,运动+饮食双重养腰新方式
  • Java:将视频上传到腾讯云并通过腾讯云点播播放
  • STM32F407VGT6从零建立一个标准库工程模板+VSCode或Keil5
  • 详解MySQL中的多表查询:多表查询分类讲解、七种JOIN操作的实现
  • 《Linux运维总结:Shell脚本位置参数的具体使用》
  • 【笔记】动手学Ollama 第五章 Ollama 在 LangChain 中的使用 - Python 集成
  • 存储系统中清空日志文件的常用方法总结
  • vue3 el-select 默认选中第一个
  • 链表-24.两两交换链表中的结点-力扣(LeetCode)
  • 绕过 C 标准库限制执行系统命令:系统调用、Shellcode 和裸机二进制
  • 税务专业人员能力构建与发展路径指南
  • Qt5多线程编程详细讲解
  • [递归回溯]679. 24 点游戏
  • 基于RK3568/J6412的EMU多网口控制主机,助力储能工业互联管理和运维
  • PyTorch 社区贡献 和 设计原则
  • 第5课_Rust生命周期和泛型
  • Android MVVM(Model-View-ViewModel)架构
  • 从零开始的云计算生活——第四十七天,细水长流,kubernetes模块之ingress资源对象
  • 23TaskExecutor初始化
  • 【ansible】4.实施任务控制