一、K8s 核心概念(逐个拆解,从基础到核心)
先明确一个前提:K8s的核心目标是「自动化管理容器化应用」,所有概念都是围绕这个目标设计的。我们从最基础的"集群"开始,逐个讲解。
1. 集群(Cluster)
这是K8s的"根基",也是最基础的概念。集群是由一组节点(Node)组成的集合,用于统一运行容器化应用,可以把它理解为一个"大机房",里面有很多台服务器(节点),所有容器化应用都运行在这个"大机房"里。
一个完整的K8s集群分为两个核心部分,缺一不可:
- 控制平面(Control Plane):相当于"大机房的中控室",负责管理和调度整个集群,决定哪个容器跑在哪个节点上、监控容器状态、处理故障等,是集群的"大脑"。
- 工作节点(Worker Node):相当于"大机房里的服务器",是实际运行容器的地方,接收中控室的指令,执行容器的创建、启动、停止等操作。
补充:K8s集群不支持单点运行(生产环境),控制平面通常会部署多个节点,避免单点故障;工作节点可以根据业务需求横向扩展,节点越多,能运行的容器就越多。
2. 节点(Node)
节点是集群的"最小硬件单元",本质上是一台物理机(服务器)或虚拟机,是容器运行的载体。无论是控制平面节点还是工作节点,都需要安装K8s的核心组件,才能加入集群。
工作节点上必须安装的3个核心组件(重点):
- Kubelet:节点的"代理人",负责和控制平面通信,接收控制平面的指令(比如"启动一个容器"),同时监控容器和节点的状态,把状态上报给控制平面,确保容器按照要求运行。
- 容器运行时(Container Runtime):用于运行容器的软件,相当于"容器的发动机",K8s支持多种容器运行时,比如Docker、containerd等(目前主流是containerd,Docker已逐步被淘汰)。
- Kube-proxy:节点的"网络代理",负责处理节点上的网络通信,实现Pod之间、Pod与外部的网络互通,同时提供简单的负载均衡功能。
简单说:节点是"容器的宿主",没有节点,容器就没有运行的地方;而Kubelet、容器运行时、Kube-proxy,是节点能"干活"的必备工具。
3. Pod
这是K8s中「最小的可部署、可管理单元」,也是新手最容易混淆的概念------Pod不是容器,而是容器的"包装器",一个Pod可以包含一个或多个紧密相关的容器。
举个例子:一个Web应用,需要一个运行Web服务的容器,还需要一个运行日志收集的容器,这两个容器必须紧密配合(日志收集容器要收集Web容器的日志),就可以把它们打包在同一个Pod里。
Pod的核心特点(必记):
- 共享资源:同一个Pod里的所有容器,共享同一个网络命名空间(即同一个IP地址)和存储卷,容器之间可以通过localhost直接通信,无需额外配置网络。
- 生命周期短暂:Pod是"一次性"的,一旦被删除、故障或节点宕机,Pod会直接消失,不会自动恢复(需要借助控制器管理)。
- 不可直接扩容:不能直接给一个Pod增加副本,要扩容只能通过控制器创建多个相同的Pod。
补充:K8s中,所有容器都必须运行在Pod里,没有"脱离Pod的容器"------这是K8s的核心设计原则之一。
4. 控制器(Controller)
前面说过,Pod的生命周期很短暂,一旦故障就会消失,而控制器的作用就是「保障Pod的运行状态符合预期」,相当于Pod的"管家",自动处理Pod的创建、删除、扩容、故障恢复等操作。
K8s有多种控制器,重点掌握4种最常用的(新手必懂),逐个说明:
(1)Deployment:最常用的无状态控制器
用于管理「无状态应用」(比如Web服务、API接口),是新手最常使用的控制器,核心功能是:
- 确保指定数量的Pod副本运行(比如指定3个副本,控制器会自动维持3个Pod,少了就补,多了就删);
- 支持滚动更新(比如升级应用版本时,先启动新Pod,再删除旧Pod,不中断服务);
- 支持回滚(如果升级失败,能快速回滚到上一个稳定版本)。
示例:通过Deployment创建3个Web服务Pod,即使其中1个Pod故障,控制器会自动再创建1个,确保始终有3个Pod在运行。
(2)StatefulSet:有状态应用控制器
用于管理「有状态应用」(比如数据库、Redis集群、ZooKeeper),这类应用的特点是:需要固定的网络标识(IP、主机名)、固定的存储(数据不能丢失)、有序的启动/停止。
StatefulSet的核心优势:给每个Pod分配固定的名称和网络标识,即使Pod重建,名称和IP也不会变;同时绑定固定的存储卷,确保数据不丢失。
注意:无状态应用和有状态应用的核心区别------无状态应用不需要保存数据,多个Pod完全一致,可以随意替换;有状态应用需要保存数据,每个Pod有自己的独特标识,不能随意替换。
(3)DaemonSet:全局守护控制器
核心功能:确保集群中的每个节点(或符合条件的节点)上,都运行一个相同的Pod副本,常用于部署"集群级别的公共服务"。
常用场景:日志收集(比如Fluentd、Logstash)、监控代理(比如Prometheus Node Exporter)、网络插件(比如Calico)------这些服务需要在每个节点上都运行,才能覆盖整个集群。
(4)Job/CronJob:任务类控制器
用于运行「一次性任务」或「定时任务」,区别于前面的"长期运行服务":
- Job:一次性任务,比如数据备份、批量处理(比如批量导入数据),任务执行完成后,Pod会自动终止,不会继续运行;
- CronJob:定时任务,类似Linux的crontab,比如每天凌晨3点执行数据备份,按照指定的时间周期重复执行任务。
5. 服务(Service)
前面说过,Pod的生命周期短暂,一旦重建,IP地址会发生变化------如果其他Pod需要访问这个Pod,IP变了就无法通信,Service就是为了解决这个问题而设计的。
简单说:Service是Pod的"固定访问入口",它定义了一组Pod的逻辑集合,为这组Pod提供一个固定的IP地址和访问端口,无论Pod如何重建、IP如何变化,其他Pod或外部服务,都可以通过Service的固定地址访问到目标Pod。
Service的核心原理:通过"标签选择器"(Label Selector)匹配Pod,只要Pod的标签和Service的标签一致,就会被纳入Service的管理范围;当Pod的IP变化时,Service会自动更新内部的Pod列表,确保访问不中断。
新手必懂的4种Service类型:
- ClusterIP(默认):只能在集群内部访问,外部无法访问,适合集群内部Pod之间的通信(比如Web Pod访问数据库Pod);
- NodePort:在每个节点上开放一个固定端口,外部可以通过"节点IP+节点端口"访问Service,适合测试环境(比如本地调试);
- LoadBalancer:适用于云环境(比如阿里云、腾讯云),会自动创建云厂商的负载均衡器,外部通过负载均衡器的IP访问Service,适合生产环境;
- ExternalName:将Service映射到外部域名(比如映射到www.baidu.com),适合集群内部Pod访问外部服务。
6. 标签(Label)与标签选择器(Label Selector)
这是K8s中「用于分组和筛选资源」的核心机制,相当于给资源(Pod、Service、Deployment等)贴"标签",再通过"标签选择器"筛选出需要的资源。
举个例子:给3个Web Pod贴上标签「app: web」,给2个数据库Pod贴上标签「app: db」;然后创建一个Service,通过标签选择器「app: web」,就能精准匹配到3个Web Pod,实现对Web Pod的统一访问。
核心特点:
- 标签是键值对(比如app: web、env: test、version: v1),可以随意定义,灵活分组;
- 一个资源可以贴多个标签,一个标签选择器可以匹配多个标签;
- K8s的很多核心功能都依赖标签选择器(比如Service匹配Pod、Deployment管理Pod)。
7. 存储卷(Volume)
容器的存储是"临时的"------如果容器被删除,容器内的数据会丢失(比如数据库容器,删除后数据就没了),Volume就是为了解决「容器数据持久化」而设计的。
简单说:Volume是一个"共享存储目录",可以挂载到Pod的容器中,容器可以读写这个目录里的数据,即使容器被删除,Volume里的数据也不会丢失(Volume的生命周期和Pod无关,由K8s统一管理)。
新手常用的2种Volume类型:
- EmptyDir:临时存储,和Pod的生命周期一致,Pod删除,EmptyDir里的数据也会删除,适合临时缓存数据(比如容器之间共享临时文件);
- PersistentVolume(PV)+ PersistentVolumeClaim(PVC):持久化存储,PV是集群级别的存储资源(比如云盘、本地磁盘),PVC是Pod对存储资源的"申请"------Pod通过PVC申请存储,PVC绑定PV,实现数据持久化(适合数据库、Redis等需要保存数据的应用)。
8. 命名空间(Namespace)
用于「隔离集群资源」,相当于给集群划分"不同的房间",每个房间里有自己的Pod、Service、Deployment等资源,房间之间的资源相互隔离,不会相互影响。
核心作用:解决多团队、多环境的资源隔离问题------比如开发环境、测试环境、生产环境,分别创建不同的命名空间(dev、test、prod),每个环境的资源放在对应的命名空间里,避免开发环境的Pod影响生产环境。
补充:K8s默认有3个命名空间:default(默认命名空间,未指定命名空间的资源都会放在这里)、kube-system(K8s核心组件所在的命名空间)、kube-public(公共资源命名空间)。
9. 配置与密钥(ConfigMap、Secret)
用于管理Pod的配置信息,避免把配置硬编码到容器镜像中(比如数据库地址、端口、密钥等),方便配置的修改和管理。
两者的区别(重点):
- ConfigMap:用于存储「非敏感配置」,比如数据库地址、端口、应用的配置参数(比如日志级别),数据以明文形式存储;
- Secret:用于存储「敏感配置」,比如数据库密码、API密钥、证书等,数据会进行Base64编码(注意:Base64是编码,不是加密,生产环境需要配合加密插件使用)。
使用方式:将ConfigMap/Secret挂载到Pod的容器中,容器可以直接读取里面的配置,修改ConfigMap/Secret后,Pod无需重启(部分场景需要重启)就能加载新配置。
二、K8s 常用工具(新手必备,提升效率)
掌握了核心概念后,光靠命令行操作K8s会很繁琐,下面介绍几款新手必备的常用工具,覆盖"集群部署、日常操作、可视化、监控"等场景,帮你快速上手K8s。
1. kubectl:K8s 命令行工具(必备)
这是K8s的官方命令行工具,是操作K8s集群的"万能工具",所有集群操作都可以通过kubectl命令完成(比如创建Pod、查看Pod状态、删除Service等)。
新手必记的常用命令(高频):
- kubectl get pods:查看当前命名空间的所有Pod状态;
- kubectl get services:查看当前命名空间的所有Service;
- kubectl get deployment:查看当前命名空间的所有Deployment;
- kubectl create -f xxx.yaml:通过yaml文件创建资源(Pod、Service等);
- kubectl apply -f xxx.yaml:创建或更新资源(推荐使用,比create更灵活);
- kubectl delete pod <pod名称>:删除指定Pod;
- kubectl logs <pod名称>:查看Pod的日志(排查故障常用);
- kubectl exec -it <pod名称> -- /bin/bash:进入Pod的容器内部(调试常用)。
补充:kubectl的配置文件默认在~/.kube/config,里面存储了集群的访问地址、证书等信息,只要配置好这个文件,就能通过kubectl操作远程集群。
2. Minikube:本地K8s集群工具(新手入门首选)
对于新手而言,搭建一个真实的K8s集群(多节点)比较复杂,而Minikube可以在本地快速搭建一个「单节点的K8s集群」,用于学习、测试K8s功能,无需复杂配置。
核心特点:
- 轻量:占用资源少,支持Windows、Mac、Linux系统;
- 便捷:一键启动、停止、删除集群,比如minikube start就能启动集群;
- 功能完整:支持K8s的所有核心功能,能模拟真实集群的大部分场景。
使用场景:新手学习K8s概念、测试yaml配置文件、调试简单的容器化应用。
3. Helm:K8s 包管理工具(简化部署)
K8s中,部署一个应用往往需要创建多个资源(Pod、Service、Deployment、ConfigMap等),每个资源都需要写yaml文件,操作繁琐。Helm的作用就是「将多个资源打包成一个"包"(Chart)」,一键部署、升级、回滚应用,相当于K8s的"yum"或"npm"。
核心优势:
- 简化部署:一个Chart包含所有应用所需的资源,一键部署(helm install);
- 版本管理:支持Chart的版本控制,升级、回滚应用只需指定版本;
- 共享复用:社区有大量现成的Chart(比如MySQL、Redis、Nginx),可以直接下载使用,无需自己写yaml。
常用命令:helm install(部署应用)、helm upgrade(升级应用)、helm rollback(回滚应用)、helm repo add(添加Chart仓库)。
4. Dashboard:K8s 可视化管理工具(直观)
kubectl命令行操作不够直观,而Dashboard是K8s的官方可视化工具,通过Web界面可以直观地查看集群资源(Pod、Service、Deployment等)的状态,还能通过界面创建、删除、编辑资源,适合新手快速了解集群状态。
核心功能:
- 查看集群所有资源的状态(运行状态、资源占用等);
- 通过界面创建Pod、Service、Deployment等资源;
- 查看Pod日志、进入容器内部、执行命令;
- 管理命名空间、配置、密钥等资源。
补充:Dashboard默认不对外暴露,需要通过kubectl port-forward命令转发端口,才能访问Web界面。
5. 其他常用工具(按需选择)
- kube-ps1:K8s命令行提示符工具,能在终端显示当前所在的K8s集群和命名空间,避免操作错集群;
- k9s:终端版的K8s可视化工具,比kubectl更直观,操作更便捷,适合习惯终端操作的开发者;
- Prometheus + Grafana:K8s监控工具,Prometheus收集集群和应用的监控数据,Grafana可视化监控指标(比如CPU、内存占用、Pod运行状态),生产环境必备;
- Kompose:Docker Compose转K8s工具,如果你习惯用Docker Compose部署应用,可以通过Kompose将docker-compose.yml文件转换成K8s的yaml文件,快速迁移到K8s集群。
三、新手避坑指南(重点提醒)
- 不要混淆Pod和容器:Pod是容器的包装器,一个Pod可以有多个容器,容器不能脱离Pod运行;
- 不要直接操作Pod:生产环境中,不要直接创建、删除Pod,要通过Deployment、StatefulSet等控制器管理Pod,否则Pod故障后无法自动恢复;
- 标签和标签选择器要对应:Service要通过标签选择器匹配Pod,如果标签不匹配,Service无法访问到Pod;
- 区分无状态和有状态应用:无状态应用用Deployment,有状态应用用StatefulSet,不要用错控制器;
- 新手先从Minikube入手:不要一开始就搭建多节点集群,先用Minikube熟悉概念和操作,再逐步过渡到真实集群。
四、总结
K8s的核心概念看似繁杂,但只要抓住"自动化管理容器"这个核心目标,逐个拆解、理解每个概念的作用和配合关系,就能快速建立知识框架------从集群、节点,到Pod、控制器、Service,再到标签、存储、配置,每个概念都有其明确的用途,环环相扣。
而常用工具则是提升效率的关键:kubectl是基础,Minikube适合入门,Helm简化部署,Dashboard直观可视化,按需选择工具,能让你的K8s操作更高效。
对于新手而言,建议先通过Minikube搭建本地集群,结合kubectl命令,亲手操作每个概念(比如创建Pod、部署Deployment、配置Service),再尝试用Helm部署一个简单的应用,逐步积累实战经验。
最后,觉得本文对你有帮助的话,欢迎点赞、收藏、转发,你的支持是我更新的动力!