k8s笔记01
Kubernetes(K8s)核心能力学习笔记
一、服务发现和负载均衡
(一)核心原理
- 暴露方式:K8s 中不直接暴露工作负载实例的 IP,而是通过 Service 暴露容器,可使用 DNS 名称或 Service 自身 IP 访问。
- 负载均衡实现:K8s 内置 DNS 服务,应用负载不直接访问工作负载实例,而是访问 Service,由 Service 实现背后应用的负载均衡,类似部署 talk 应用时通过 agens 实现负载均衡的逻辑。
- 解决的问题:集群中工作负载的 IP 动态变化,Service 负载均衡能有效解决背后一组动态 IP 的访问问题,实现集群范围内通过 Service 进行服务通信与注册发现。
(二)配置与操作示例
- 配置要点:示例代码中“keep us core capability”对应核心能力配置,包含一个有两个实例的工作负载和一个对应的 Service,需通过 select 与工作负载中的 labels 关联,形成映射(工作负载实例和 Service 均有 IP,但通过 Service IP 访问)。
- 部署命令:
content play -f 两个配置文件
(推测为kubectl apply -f 两个配置文件
)。 - 查看资源:
- 查看 Deployment 和 Service:
kubectl get deployments
(Deployment 可简写为 depo)、kubectl get services
(Service 可简写为 svc)。 - 查看工作实例及 Service 的 IP:
kubectl get pods -o wide
、kubectl get svc -o wide
。
- 查看 Deployment 和 Service:
- 访问服务:通过
curl + Service IP
(如curl 10.105.143.105
)访问应用,也可通过 Pod IP 访问,但通常推荐通过 Service(应用内部的负载均衡器)访问。
二、存储编排
(一)核心原理与概念
- 存储支持范围:K8s 允许自动挂载用户选择的存储系统,包括本地存储、云存储等,存储类型有 hostPath、IFS 及云厂商提供的 cos 等,对存储进行抽象(后续课程详细介绍)。
- 关键对象:
- PV(Persistent Volume,持久卷):定义存储资源的供应,是集群中的一块存储资源。
- PVC(Persistent Volume Claim,持久卷声明):实现存储资源的获取,声明使用某块 PV 资源,PV 被 PVC 绑定后,仅能供该 PVC 使用。
- 存储挂载:应用通过定义 PVC 声明,绑定对应的 PVC,将存储资源挂载到容器内指定目录,实现数据持久化,解耦应用生命周期与存储生命周期(Pod 数据临时存在,Pod 销毁数据丢失,持久化存储可保留数据)。
(二)配置与操作示例
- 配置要点:示例配置定义本地存储(hostPath)及对应目录,同时定义 PVC,应用中定义 PVC 声明以获取存储资源,将宿主机目录挂载到容器内
/usr/share/nginx/html
目录(Nginx 1.14.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
内容与宿主机写入一致。
三、自动部署和回滚
(一)核心原理
- 部署方式:K8s 可通过描述文件定义已部署容器的所需状态,采用 滚动更新(Rolling Update) 方式以受控方式更新应用状态。
- 滚动更新原理:假设有旧版本(如 3 个实例),发布新版本(3 个实例)时,旧实例先保留,部署新实例;新实例部署成功一个,旧实例删除一个;直至所有新实例部署成功,旧实例全部下架,实现新旧版本交替替换。
- 优势:避免蓝绿部署的大量资源消耗,且更安全——若发布错误版本,错误版本无法正常更新,无法替换旧版本;可通过回滚命令快速回滚到上一个可用版本或指定版本,保障应用部署安全可靠。
(二)配置与操作示例
- 配置要点:示例配置部署无状态应用(Deployment 类型),定义 3 个副本,更新策略为滚动更新,可配置
maxSurge
(最大超出期望副本数)、maxUnavailable
(最大不可用副本数)等参数。 - 部署与操作步骤:
- 清理环境(退出之前容器,删除旧资源)。
- 部署应用:
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
,回滚成功。
- 回滚到上一版本(默认回滚到版本 2):
- 关键结论:仅当镜像可正确拉取和启动时,滚动更新才会替换旧版本,确保部署安全;若部署失败版本,可通过
kubectl rollout undo
命令快速回滚。
四、待补充核心能力
文档中提及 K8s 六大核心能力,除上述“服务发现和负载均衡”“存储编排”“自动部署和回滚”外,还有“自动完成专项计算”“自我修复”“密钥与配置管理”,后续需进一步学习补充相关内容。