这3个概念是K8s的入门基石,纯大白话解释,没有任何专业术语,必须先记住:
K8s的集群,是由两类完全不同的「服务器节点」组成的,这两类节点分工明确,缺一不可,就像「厂长」和「工人」,一个负责指挥,一个负责干活。
所有组件讲解都包含:【大白话名称】+【核心作用】+【通俗比喻】+【详细解释】,保证看懂。
一句话总结:Master节点是整个集群的「总指挥、总管家、总决策人」,只负责发号施令,不运行任何业务软件(容器),所有的管理、调度、配置、存储,都由Master节点完成。
运行要求:集群里至少要有1台Master节点,生产环境为了防止故障,一般会有3台/5台做备份。
一句话总结:Worker节点是整个集群的「执行单元、干活的主力」,不做任何决策,只负责执行Master节点下达的命令,所有的业务软件(容器、Pod),最终都运行在Worker节点上。
运行要求:集群里可以有1台、多台甚至几十台Worker节点,节点越多,能运行的软件就越多,集群的能力就越强。
这部分是小白实操的核心,所有对K8s集群的操作,都只能通过一个命令工具完成:kubectl(读音:k8s-ctl)。
所有内容都是纯小白视角:命令格式+大白话用途+执行效果+完整示例+结果解读,没有任何省略,学完就能直接用!
kubectl [操作指令] [资源类型] [资源名称] [可选参数]
大白话用途:查看集群的健康状态、有多少台服务器、服务器是否正常运行,是你操作集群的「第一步」,每次操作前都要先看这个。
# 命令1:查看集群里所有的节点(Master+Worker),最常用!
kubectl get nodes
# 执行效果:显示节点名称、状态、角色、版本、启动时间
# 小白必看结果:STATUS列显示【Ready】就是正常,显示其他都是故障!
# 命令2:查看节点的【详细信息】,节点故障时必用
kubectl describe node 节点名称
# 命令3:查看Master节点的核心组件状态,验证集群是否健康
kubectl get cs
大白话用途:Pod是运行容器的载体,所有业务软件都在Pod里,所以这部分命令是你最常用的命令,学会这些,就能应对90%的实操需求!
# 命令1:查看集群里所有运行的Pod,最最最常用!
kubectl get pods
# 命令2:查看指定Pod的【详细信息】,Pod启动失败/报错 必用!救命命令!
kubectl describe pod Pod的名称
# 命令3:查看Pod的【运行日志】,容器运行报错 必用!核心排错命令!
kubectl logs Pod的名称 -c 容器名
# 命令4:进入Pod里的容器【交互式操作】,调试/修改配置 必用!
kubectl exec -it Pod的名称 -c 容器名 /bin/bash
# 命令5:删除指定的Pod,不用了就删掉
kubectl delete pod Pod的名称
# 命令6:通过YAML文件创建/更新Pod(最核心的创建方式)
kubectl apply -f YAML文件的路径
# 查看集群所有的服务(外部访问用),新增重点
kubectl get svc
# 查看持久化存储卷和存储申请单,新增重点
kubectl get pv
kubectl get pvc
# 查看弹性伸缩控制器Deployment,新增重点
kubectl get deploy
# 扩容/缩容容器数量,一行命令实现弹性伸缩
kubectl scale deploy 控制器名称 --replicas=5
# 查看指定资源的完整YAML配置,学习必备
kubectl get 资源类型 资源名称 -o yaml
# 万能帮助命令,忘记任何命令都能用它救急
kubectl --help
这部分是本次讲解的核心,最全最细,包含你要求的:标签配置、存储配置、数据持久化、外部访问配置、容器弹性伸缩配置,全部补充完整!
✅ 每一个字段:大白话含义+写法规则+作用+不写后果+示例
✅ 样式升级:注释(灰色)、关键字(青色)、字符串值(黄色)、数字(粉色) 颜色区分,一眼看清
✅ 纯小白视角,无专业黑话,所有内容掰开揉碎讲解!
# 所有K8s YAML文件的必写4大字段,固定骨架
apiVersion: v1 # 字段1:K8s的API版本,Pod固定写v1
kind: Pod # 字段2:要创建的资源类型,Pod/Service/Deployment
metadata: {} # 字段3:资源的基础信息(名称、标签)
spec: {} # 字段4:资源的核心详细配置
metadata:
name: nginx-pod
labels: # 核心:给当前Pod打标签,键值对格式,可写多个
app: nginx # 标签1:应用名称是nginx
env: test # 标签2:运行环境是测试环境
type: web # 标签3:类型是网站服务
key: value 格式的键值对,可写任意多个。kubectl get pods -l app=nginx)、绑定资源(服务通过标签找到对应的Pod)。spec:
selector: # 核心:标签选择器,根据标签匹配对应的Pod
matchLabels:
app: nginx # 只匹配 带有app:nginx标签的Pod
spec:
volumes: # 第一步:定义存储卷,数组格式,可写多个
- name: nginx-data # 存储卷名称,自定义
emptyDir: {} # 类型:临时存储卷
containers:
- name: nginx-container
image: nginx:latest
volumeMounts: # 第二步:给容器挂载存储卷
- name: nginx-data # 要挂载的存储卷名称(和上面一致)
mountPath: /usr/share/nginx/html # 容器内的挂载目录
spec:
volumes:
- name: mysql-data
hostPath: # 类型:挂载宿主机本地文件夹
path: /data/mysql # 宿主机的文件夹路径
containers:
- name: mysql-container
image: mysql:8.0
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql # MySQL的数据存储目录
apiVersion: v1
kind: PersistentVolume # 资源类型:持久化存储卷
metadata:
name: mysql-pv
spec:
capacity:
storage: 10Gi # 存储大小:10G
accessModes:
- ReadWriteOnce # 访问模式:单节点读写
hostPath:
path: /data/pv/mysql # 存储的实际路径
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi # 申请5G存储,K8s自动匹配≥5G的PV
spec:
volumes:
- name: mysql-pvc-volume
persistentVolumeClaim:
claimName: mysql-pvc # 绑定上面创建的PVC
containers:
- name: mysql-container
image: mysql:8.0
volumeMounts:
- name: mysql-pvc-volume
mountPath: /var/lib/mysql
apiVersion: v1
kind: Service # 资源类型:服务
metadata:
name: nginx-service
spec:
selector: # 核心:通过标签找到要访问的Pod
app: nginx
type: NodePort # 访问类型:外部可访问
ports:
- port: 80 # Service的端口
targetPort: 80 # Pod的端口
nodePort: 30080 # 集群节点的外部端口(30000-32767)
任意Worker节点IP:30080 ,比如 192.168.1.100:30080,直接在浏览器打开就能访问Nginx!apiVersion: apps/v1 # Deployment的固定版本
kind: Deployment # 资源类型:弹性伸缩控制器
metadata:
name: nginx-deploy
spec:
replicas: 3 # 核心:运行的Pod副本数,弹性伸缩的核心配置
selector: # 通过标签匹配要管理的Pod
matchLabels:
app: nginx
template: # Pod的模板,里面就是之前写的Pod配置
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx-container
image: nginx:latest
ports:
- containerPort: 80
replicas: 3 改为 replicas: 5,执行 kubectl apply -f deploy.yaml 自动扩容到5个Pod;kubectl scale deploy nginx-deploy --replicas=5,瞬间生效!spec:
containers:
- name: mysql-container
image: mysql:8.0
ports:
- containerPort: 3306
env: # 环境变量,配置容器运行参数
- name: MYSQL_ROOT_PASSWORD
value: "123456"