20250707-4-Kubernetes 集群部署、配置和验证-kubeconfig_笔记
一、Kubernetes将弃用Docker
1. Docker被弃用的原因
- 性能问题: Docker内部调用链复杂,多层封装导致性能降低、故障率提升且不易排查
- 安全隐患: Docker会在宿主机创建网络规则和存储卷,增加了系统安全风险
- 功能冗余: 在Kubernetes环境中,Docker的镜像管理、网络规则等功能很少被使用,反而成为系统负担
- 架构演变: Kubernetes通过CRI(容器运行时接口)标准化了容器运行时交互方式,Docker的架构不再是最优选择
- 技术背景: Kubernetes早期通过dockershim组件与Docker Engine通信,但这种间接调用方式效率较低
- 标准接口: CRI的出现使Kubernetes可以支持更多容器运行时,不再局限于Docker
2. Docker弃用时间
- 版本计划: 预计在Kubernetes 1.23版本(当前为1.22)将移除对Docker的直接支持
- 官方态度: 实际是"移除支持"而非"弃用",国内媒体报道存在夸大成分
- 兼容方案: 旧版本Kubernetes仍可继续使用,不必强制升级到新版本
3. 应用案例
1)例题:Docker使用情况
- containerd:
- 与Docker完全兼容,从Docker中剥离出来的轻量级运行时
- 移除了Docker的镜像管理、网络管理等非核心功能
- 已被腾讯云、阿里云等主流云厂商广泛支持
- CRI-O/Podman:
- 红帽(RedHat)主导的项目,目前主推Podman
- 缺乏大厂支持可能影响其长期发展前景
- 过渡建议:
- 生产环境建议优先考虑containerd
- 学习环境仍可使用Docker,其单机容器功能依然优秀
- 不必盲目追求新版本,稳定运行的旧版本系统可以继续使用
二、容器引擎切换注意事项
1. 切换步骤
- 操作流程:
- 关闭docker服务
- 启动containerd服务
- 修改kubelet配置:vi /etc/sysconfig/kubelet,添加KUBELET_EXTRA_ARGS=--container-runtime=remote --container-runtime-endpoint=unix:///run/containerd/containerd.sock
- 重启kubelet服务:systemctl restart kubelet
2. 不能平滑升级
- 本质区别:docker和containerd是两个不同的容器运行时产品,不是版本升级关系
- 生产环境处理:
- 需要将节点设置为不可调度
- 驱逐节点上的容器
- 逐个节点进行维护升级
- 使用影响:切换后对k8s使用方式没有变化,因为k8s管理的是pod而非直接管理容器引擎
3. 测试环境验证
- 验证方案:
- 可以先部分节点使用containerd,部分使用docker
- 最终全部切换到containerd进行完整验证
- 共存说明:不同节点可以使用不同容器运行时,但不能在单个节点上同时运行docker和containerd
4. 镜像兼容性
- 镜像支持:containerd完全兼容docker创建的容器镜像
- 镜像仓库:
- 使用原有镜像仓库(如Harbor)
- 连接方式与docker相同,需要在containerd配置文件中配置认证信息
- 容器重建:切换后k8s会基于containerd重新拉起原有容器
5. 容器管理工具
- containerd工具:
- 自带ctr命令行工具,但功能简单
- 推荐使用crictl工具(k8s社区维护)
6. crictl工具介绍
- 项目地址:https://github.com/kubernetes-sigs/cri-tools/
- 功能特点:
- 支持多种容器运行时(containerd、cri-o等)
- 命令设计参考docker命令,便于迁移使用
7. crictl配置
- 配置文件路径:/etc/crictl.yaml
- 关键配置项:
8. crictl命令对照
- 镜像操作:
- docker images → crictl images
- docker pull → crictl pull
- docker rmi → crictl rmi
- 容器操作:
- docker ps → crictl ps
- docker exec → crictl exec
- docker logs → crictl logs
- 特殊功能:
- POD操作:crictl pods(docker无对应命令)
- 查看容器详情:crictl inspect
9. 镜像构建与推送
- 功能限制:crictl不支持镜像构建和推送
- 替代方案:
- 使用buildah等第三方工具构建镜像
- 在专用节点保留docker环境用于镜像构建
- 通过别名设置:alias docker='crictl'提高使用体验
三、容器运行时引擎对比
1. 容器相关功能
- 镜像操作:
- 删除镜像:docker rmi对应crictl rmi
- 查看详情:docker inspect IMAGE-ID对应crictl inspecti IMAGE-ID
- 容器生命周期:
- 列表查看:docker ps对应crictl ps
- 创建启动:docker create/start对应crictl create/start
- 停止删除:docker stop/rm对应crictl stop/rm
- 容器交互:
- 进入容器:docker attach/exec对应crictl attach/exec
- 日志监控:docker logs/stats对应crictl logs/stats
- POD特有功能:
- 列表查看:Containerd特有crictl pods命令
- 详情查看:crictl inspectp可查看POD详细信息(输出JSON格式)
- 运行控制:crictl runp/stopp用于POD的启停管理
2. 切换引擎Containerd
- 切换验证:
- 执行crictl ps可查看Containerd创建的容器(如calico-node、kube-proxy)
- 容器交互方式与Docker完全一致,如crictl exec进入容器,crictl logs查看日志
- 资源监控:
- crictl stats显示容器资源利用率,包括CPU%、内存、磁盘等指标
- 示例输出:calico-node容器占用3.02% CPU和27.08MB内存
- 回退操作:
- 修改kubelet配置参数移除Containerd相关设置
- 关闭Containerd服务后重启Docker服务
- 验证:kubectl get node -o wide显示运行时恢复为docker
- 注意事项:
- 实验环境建议保持Docker运行时避免兼容性问题
- 生产环境可搭建独立集群测试Containerd运行时
四、kubeconfig配置文件
1. kubeconfig文件概述
- 文件位置: 默认存储在用户家目录下的.kube/config文件中
- 核心功能: 作为kubectl连接Kubernetes集群的认证配置文件,包含集群连接信息和客户端认证凭据
- 生成方式: 可通过kubectl config指令生成配置文件
2. kubeconfig文件内容
- 基本结构: 采用YAML格式,包含clusters、contexts、users三个主要部分
- 关键字段:
- apiVersion: v1
- kind: Config
- current-context: 指定当前使用的上下文
3. kubeconfig文件用途
- 通用性: 不仅用于kubectl,也用于K8s其他组件连接API Server
- 连接原理: 通过配置文件中的集群地址(如https://192.168.31.61:6443)和证书信息建立连接
- 多集群管理: 单个配置文件可包含多个集群的连接信息
4. kubeconfig文件集群信息
- cluster字段:
- certificate-authority-data: 集群CA证书(base64编码)
- server: API Server地址(如https://192.168.31.71:6443)
- name: 集群名称标识
- 默认端口: API Server默认监听6443端口
5. kubeconfig文件上下文
- 作用: 建立用户、集群和命名空间之间的关联关系
- context字段:
- cluster: 关联的集群名称
- user: 关联的用户名称
- name: 上下文名称(如kubernetes-admin@kubernetes)
- 多集群场景: 当配置文件包含多个集群时,上下文用于区分不同集群的连接配置
6. kubeconfig文件用户认证
- user字段:
- client-certificate-data: 客户端证书(base64编码)
- client-key-data: 客户端私钥(base64编码)
- 认证类型: 支持多种认证方式,此处展示的是客户端证书认证
7. kubeconfig文件安全性
- 权限控制: 该文件包含管理员凭据,泄露会导致集群被完全控制
- 防护措施:
- 严格限制文件访问权限
- 按最小权限原则分配配置文件
- 可创建不同权限级别的kubeconfig文件
- 网络要求: 只要能够访问API Server的6443端口,任何位置都可使用该配置文件连接集群
五、练习
1. 使用kubeadm搭建K8s集群
- 当前任务重点:先搭建K8s集群,其他作业可暂缓
- 作业提交方式:将结果截图提交至腾讯文档指定链接
2. kubectl命令行工具
- 故障诊断命令:
- describe:显示资源详细信息
- logs:查看Pod日志(多容器需用-c指定)
- attach/exec:附加容器/执行命令
- port-forward:创建本地端口映射
- cp:容器内外文件拷贝
- 高级命令:
- apply:从文件创建/更新资源
- patch:补丁式更新字段
- replace:替换资源
- 设置命令:
- label:设置资源标签
- annotate:设置注解
- completion:配置命令自动补全
3. 列出指定标签的pod
- 操作要点:
- 命名空间:kube-system
- 标签筛选:k8s-app=kube-dns
- 技术储备:
- 强调技术预学习的重要性,不能等用时才学
- 项目通常要求快速上手,没有长期学习窗口期
4. Docker与Containerd命令对比
- 核心区别:
- docker inspect → crictl inspect(容器)
- docker inspect → crictl inspecti(镜像)
- POD操作是containerd特有功能
- 注意事项:
- 练习后建议切回Docker引擎
- V1.23后Docker可能被弃用
- 切换运行时相当于节点维护操作
5. 学习建议
- 问题处理态度:
- 遇到问题应坚持解决,不要轻易放弃
- 提倡在社群中积极交流提问
- 技术问题没有高低之分,新手老手都是同一起点
- 技术储备观念:
- IT行业需要持续学习积累
- 项目实践中往往没有充足学习时间
- 能力储备决定职业发展机会
六、知识小结
知识点 | 核心内容 | 考试重点/易混淆点 | 难度系数 |
Docker与K8s关系演变 | Docker功能冗余导致K8s弃用其作为默认运行时,转向轻量级方案 | 弃用≠不可用:仍可单机使用但需注意版本兼容性 | ⭐⭐⭐ |
容器运行时替代方案 | containerd(主流选择,大厂支持)、CRI-O(红帽方案)、Podman(新兴方案) | containerd与Docker镜像完全兼容但无镜像构建功能 | ⭐⭐ |
containerd迁移实操 | 需关闭Docker→配置containerd→修改kubelet参数→驱逐节点Pod | 非平滑升级:必须停机维护,需分批操作 | ⭐⭐⭐⭐ |
crictl工具使用 | 替代docker命令:crictl ps/exec/logs,不支持镜像推送 | 命令格式与docker相似但缺少build/push功能 | ⭐⭐ |
kubeconfig机制 | 存储集群连接凭证(API地址/证书),可跨节点分发实现管理 | 配置文件泄露=集群控制权泄露,需严格权限控制 | ⭐⭐⭐ |
技术演进趋势 | Docker转向单机场景,K8s生态更倾向标准化CRI运行时 | 注意1.23版本后Docker支持变化,但旧版本仍可用 | ⭐⭐ |