K8S - 从单机到集群 - 核心对象与实战解析
引言
容器技术的兴起极大地提升了应用的交付与运行效率,Docker 解决了“开发环境与生产环境一致性”的问题,但在大规模生产环境中仍然面临诸多挑战:
• 如何实现数百个容器的协同调度?
• 怎样保证服务中断时秒级自愈?
这正是 Kubernetes(K8S)的核心价值所在。
作为容器编排的事实标准,K8S 通过抽象化基础设施,将应用部署从单机维度提升到集群维度。理解其核心对象(Pod、Deployment、Service等)是掌握 K8S 的关键。
一、基础概念
1.1 Pod:容器的逻辑主机
Pod是 Kubernetes 管理和调度容器的最小单位。它本质上是一组容器的封装,核心特性:
共享环境
• 同一 Pod 内的容器共享网络(IP、端口)。
• 可通过 共享存储卷进行文件传递(如 /data目录)。
统一生命周期
• Pod内所有容器 同时启动/终止(适用于同一应用的不同组件)。
调度基础单位
• Kubernetes 通过 Pod实现 容器的自动扩缩容、故障恢复等能力。
Pod、容器与虚拟机的对比
技术 | 特点 |
---|---|
虚拟机 | 运行完整的操作系统,资源开销大,提供强隔离性 |
Docker容器 | 共享主机内核,比VM更轻量级,启动速度快 |
Kubernetes Pod | 组织和管理容器组,提供共享网络和存储空间,支持容器间的高效通信 |
1.2 声明式配置(Manifest)
Manifest 是 Kubernetes 资源的蓝图文件(YAML 格式),通过描述期望状态实现自动化管理。
核心特点:
• 声明式管理:仅需定义 目标状态(如“保持3个Pod运行”),无需关心具体操作步骤。
• 版本可控:YAML 文件可纳入 Git 管理,实现 基础设施即代码(IaC)。
示例:Deployment 配置 (详解见后面章节)
# Deployment示例:定义Web服务器的理想状态
apiVersion: apps/v1 # 使用K8S的Apps API
kind: Deployment # 资源类型(管理Pod的控制器)
metadata:name: web-server # 部署名称(集群内唯一标识)
spec:replicas: 3 # 始终保持3个Pod运行selector: # 筛选需要管理的PodmatchLabels: app: nginxtemplate: # Pod的创建模板metadata:labels:app: nginx # Pod标签(用于被Deployment识别)spec:containers: # 容器列表- name: main # 容器名称image: nginx:1.25 # 使用指定镜像ports:- containerPort: 80 # 容器监听端口
1.3 Kubernetes 关键对象关系
在 Kubernetes 中,资源之间存在明确的层次结构,如下所示:
graph TDK8S集群-->NamespaceNamespace-->DeploymentDeployment-->ReplicaSetReplicaSet-->PodPod-->Container[容器1, 容器2...]Service-->Pod
• 集群(Cluster):Kubernetes 运行环境的整体单位。
• 命名空间(Namespace):用于隔离不同应用或环境的逻辑空间。
• Deployment:管理 Pod 的创建、更新和扩缩容。
•ReplicaSet:确保一定数量的 Pod 副本持续运行。
• Pod:承载一个或多个容器,是 Kubernetes 的基本调度单位。
• Service:提供稳定的访问方式,让外部或内部服务发现 Pod。
二、镜像部署到K8S 实战
2.1 集群环境准备
1. 工具安装
核心工具安装与验证
# 安装 Docker 并验证
brew install docker
docker --version # 预期输出:Docker version 20.10.x
docker run hello-world # 验证基础功能# 安装 kubectl 并验证
brew install kubectl
kubectl version --client # 预期输出:Client Version: v1.28.x# 安装 kind 并验证
brew install kind
kind version # 预期输出:kind v0.20.x
2. 工具说明
Docker:容器化应用的构建与运行引擎
• 核心功能:镜像打包、容器生命周期管理。
kubectl:Kubernetes 集群的 “控制终端”
kubectl 是 Kubernetes 的命令行管理工具,主要功能如下:
• 部署应用(apply/create)
• 查看资源状态(get/describe)
• 调试排障(logs/exec)
• 集群管理(config/scale)
kind:轻量级 Kubernetes 集群工具
kind(Kubernetes IN Docker)是基于 Docker 容器的轻量级 K8S 本地集群,优势如下:
• 单机快速搭建多节点集群
• 无需虚拟机或云资源
• 完美兼容标准 Kubernetes API
3. 本地集群搭建
步骤1:创建集群配置文件(kind-cluster.yaml)
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane# 端口映射:容器 5000 → 宿主机 8000extraPortMappings:- containerPort: 5000hostPort: 8000
配置解析
• nodes:定义 1 个控制平面节点(必选)
• extraPortMappings:实现宿主机到 Pod 的直接访问
• apiVersion:匹配 kind 版本规范
步骤2: 创建集群
# 创建集群(指定配置)
kind create cluster --name local-k8s --config kind-cluster.yaml# 验证节点状态
kubectl get nodes
# 预期输出:显示一个 control-plane 节点为 Ready 状态
集群创建成功,终端输出类似如下:
Creating cluster "local-k8s" ...✓ Ensuring node image (kindest/node:v1.27.0) 🖼✓ Preparing nodes 📦 ✓ Writing configuration 📜 ✓ Starting control-plane 🕹 ✓ Installing CNI 🔌 ✓ Installing StorageClass 💾
Set kubectl context to "kind-local-k8s"
You can now use your cluster with:
kubectl cluster-info --context kind-local-k8s
查看集群中的节点状态,输出示例:
NAME STATUS ROLES AGE VERSION
local-k8s-control-plane Ready control-plane 1m v1.27.0
2.2 项目结构与业务代码 (python 示例)
1. 项目结构
flask-k8s-demo/
├── app/
│ ├── app.py # Flask 应用主程序
│ └── requirements.txt # Python 依赖清单
├── Dockerfile # 镜像构建文件
└── k8s/├── deployment.yaml # K8s 部署配置├── service.yaml # K8s 服务暴露配置└── kind-cluster.yaml # Kind 本地集群配置
2. 核心业务代码
app/app.pyfrom flask import Flask
app = Flask(__name__)@app.route('/')
def hello():return "Hello from K8S Pod!"@app.route('/healthz')
def health_check():return "OK", 200if __name__ == '__main__':app.run(host='0.0.0.0', port=5000)
app/requirements.txtFlask==2.2.2
DockerfileFROM python:3.8-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "app.py"]
2.3 镜像构建与加载
# 构建docker 镜像(在项目根目录执行)
docker build -t flask-k8s:v1 ./app# 加载镜像到集群(未使用镜像仓库)
kind load docker-image flask-k8s:v1 --name local-k8s# 验证镜像加载
kubectl get nodes -o jsonpath='{range .items[*]}{.status.images[*].names[*]}{"\n"}{end}' | grep flask-k8s
docker build命令详解:1.-t flask-k8s:v1:• -t(--tag):为构建的镜像指定名称和标签(tag)。• flask-k8s:v1:镜像名称为 flask-k8s,标签为 v1。如不指定 :v1,默认标签是 latest。2../app:Dockerfile 所在的上下文目录。即在 ./app目录下寻找 Dockerfile并构建镜像。
2.4 部署镜像到K8S集群并验证
步骤1:生成部署配置(k8s/deployment.yaml)
apiVersion: apps/v1
kind: Deployment
metadata:name: flask-app
spec:replicas: 2selector:matchLabels:app: flasktemplate:metadata:labels:app: flaskspec:containers:- name: webimage: flask-k8s:v1 # 与加载的镜像名一致ports:- containerPort: 5000livenessProbe:httpGet:path: /healthzport: 5000initialDelaySeconds: 10
步骤2:执行部署
kubectl apply -f k8s/deployment.yaml# 监控部署进度
kubectl rollout status deployment/flask-app
# 预期输出:deployment "flask-app" successfully rolled out
解析1.kubectl apply:用于创建或更新 Kubernetes 资源。2.-f k8s/deployment.yaml:• -f(--filename):指定 YAML 文件路径。• k8s/deployment.yaml:定义了 Deployment(部署)资源,通常包含 Pod 副本数、镜像、环境变量、资源限制等信息。
步骤3:服务访问验证
# 临时端口转发
kubectl port-forward deployment/flask-app 8000:5000# 新终端测试访问
curl http://localhost:8000
# 预期输出:Hello from K8S Pod!
到这里你的第一个应用镜像已经部署到K8S 上 并运行成功。
三、K8S 集群创建实践指南
3.1 集群创建路径规范
1. 配置文件路径处理
情景 1:在配置目录执行
cd ~/project/k8s-config # 进入配置目录
kind create cluster --config kind-cluster.yaml
情景 2:指定绝对路径
kind create cluster \--config /Users/yourname/project/k8s-config/kind-cluster.yaml
原则:• 使用相对路径时,确保当前目录包含配置文件。• 使用绝对路径可避免路径歧义,提高可移植性。
3.2 集群连接管理
1. 自动上下文配置
执行 kind create 创建集群后,它会自动配置kubectl 和kind 集群的链接。即自动完成以下配置:# 查看当前上下文
kubectl config current-context
# 预期输出:kind-<cluster-name># 查看集群列表
kubectl config get-contexts
2. 手动上下文切换
当存在多个集群(如多个 Kind 集群同时运行)时,可手动切换上下文:# 导出指定集群的 kubeconfig
kind export kubeconfig --name dev-cluster# 强制切换上下文
kubectl config use-context kind-dev-cluster
3.3 操作验证流程
1. 集群健康检查
# 检查节点状态
kubectl get nodes -o wide
# 预期输出:所有节点 STATUS=Ready# 查看系统 Pod 状态
kubectl get pods -n kube-system
# 预期输出:CoreDNS 等系统组件 Running
2. 网络连通性测试
# 创建测试 Pod
kubectl run test --image=busybox --restart=Never -- sleep 3600# 验证跨节点通信
kubectl exec test -- ping <worker-node-ip>
3.4 故障排查手册
1. 常见错误处理
2. 日志收集命令
# 导出集群诊断信息
kind export logs --name dev-cluster ./diagnostics# 查看控制平面日志
docker logs dev-cluster-control-plane
3.5 生产级配置建议
1. 多节点集群配置模板
multi-node-cluster.yaml示例:
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-planekubeadmConfigPatches:- |kind: ClusterConfigurationapiServer:extraArgs:enable-admission-plugins: "NodeRestriction"
- role: worker
- role: workerextraMounts: # 挂载本地目录- hostPath: /datacontainerPath: /mnt/data
2. 集群生命周期管理
# 暂停集群(保留配置)
kind stop cluster --name dev-cluster# 完整删除集群
kind delete cluster --name dev-cluste
四、Kubernetes Manifest 详解
4.1 Manifest 设计哲学
在 K8S 中,编排配置可以采用命令式或声明式:
• 命令式(Imperative):关注操作过程,例如 kubectl run nginx --image=nginx。
• 声明式(Declarative):关注目标状态,通过 YAML 描述期望状态,由控制器自动实现状态收敛。
4.2 Manifest 资源分类
Kubernetes 资源类型按功能分为几大类,支撑不同场景需求:
4.3 Manifest 深度解析
以 Deployment 为例解析核心字段:
apiVersion: apps/v1 # 使用 apps/v1 版本的 API 进行 Deployment 资源管理
kind: Deployment
metadata:name: frontend-app # Deployment 名称,需在同一命名空间内唯一labels:app: frontend # 定义标签,便于管理和筛选资源
spec:replicas: 2 # 副本数量,确保至少有 2 个 Pod 运行selector:matchLabels:app: frontend # 选择匹配 app=frontend 的 Podtemplate: # Pod 模板,定义 Pod 具体的运行配置metadata:labels:app: frontend # 确保 Pod 继承相同的标签spec:containers:- name: web-frontend # 容器名称image: myrepo/frontend-app:v1.0 # 替换为实际镜像仓库(示例镜像)imagePullPolicy: Always # 每次拉取最新镜像(适用于 CI/CD 更新)ports:- containerPort: 3000 # 暴露容器内部运行的端口resources:requests: # 资源请求,保证最小运行需求memory: "512Mi"cpu: "100m"limits: # 资源限制,防止过载memory: "1024Mi"cpu: "250m"
Deployment 的构成:
1.基本定义
• apiVersion指定 Deployment 资源的 API 版本。
• kind: Deployment,该资源是一个 Deployment。
2.元数据(metadata)
• name指定 Deployment 的名称。
• labels定义标签,方便管理和筛选相关资源。
3.spec 说明(核心配置)
• replicas设定 Pod 副本数量,确保高可用性。
• selector指定 Deployment 需要管理的 Pod,确保只有匹配该标签的 Pod 会受其控制。
4.Pod 模板(template)
• Deployment 需要管理的 Pod 由 template定义,包括 metadata和 spec两部分。
• metadata.labels确保新建 Pod 时自动带上指定的标签。
5.容器(containers)
• name定义容器名称。
• image指定要运行的镜像仓库。
• imagePullPolicy设置拉取策略,确保获取最新版本或仅在需要时拉取。
• ports说明容器监听的端口。
• resources设置 CPU 和内存的 requests(最低需求)和 limits(最大允许使用量)。
Deployment 主要用于管理 Pod 的部署、更新和扩缩容,它的 spec结构清晰,核心由 replicas、selector、template以及 container组成,后续可以基于此添加更复杂的功能,如滚动更新、探针等等。
4.4 manifest 文件生成
1. 可生成 Manifest 的资源类型
资源类型与生成命令示例
类型1:基础工作负载
kubectl create deployment [NAME]
kubectl create job [NAME]
适用场景:快速生成无状态应用/定时任务配置
局限性:无法生成复杂配置(如资源限制、探针)
类型2:服务暴露
kubectl expose deployment [NAME] --port=80 --target-port=5000 --dry-run=client -o yaml
适用场景:快速生成 Service 配置
局限性:仅支持 ClusterIP/NodePort 类型,无法生成 Ingress 或 LoadBalancer 高级配置。
类型3:配置资源
生成命令示例:
kubectl create configmap [NAME] --from-file=config.properties --dry-run=client -o yaml
适用场景:从文件生成 ConfigMap
局限性:无法直接生成复杂结构(如嵌套 Key-Value)
2. 不可直接生成的资源类型
3. Manifest 生成的最佳实践
方法1:基础资源快速生成
生成 Deployment(带基础探针)
# 先生成基础资源:
kubectl create deploy frontend \--image=myapp:v1.0 \--replicas=3 \--dry-run=client -o yaml > deploy.yaml
说明:
• --image指定容器镜像。
• --replicas指定副本数量。
• --dry-run=client仅生成 YAML 文件,不执行部署。
• -o yaml > deployment.yaml将输出重定向到文件。
# 追加探针配置(需手动编辑 deploy.yaml)
spec:template:spec:containers:- name: frontendlivenessProbe:httpGet:path: /healthzport: 8080
方法2:复合资源分步生成
# 先生成 Deployment
kubectl create deploy backend --image=redis:6.0 --dry-run=client -o yaml > backend.yaml
# 再生成 Service
kubectl expose deploy backend --port=6379 --target-port=6379 --dry-run=client -o yaml >> backend.yaml
# 手动合并为一个文件(注意用 `---` 分隔资源)
方法3: 使用 kubectl run 生成 Pod 模板
# 生成带资源限制的 Pod 模板
kubectl run debug-pod \--image=busybox \--limits='cpu=500m,memory=256Mi' \--dry-run=client -o yaml > pod.yaml
4. 补充工具推荐
工具1:kustomize
用途:基于基础模板生成多环境配置
示例命令:
kustomize build overlays/prod
工具2 :helm
用途:通过 Chart 模板生成复杂应用配置。
示例命令:
helm create my-chart
helm template my-chart > manifests.yaml
工具3:kubeval
用途:验证生成的 YAML 是否符合 Kubernetes Schema。
示例命令:
kubeval deploy.yaml
关键总结
• 简单资源(Deployment/Service/ConfigMap)可通过 kubectl create+ --dry-run快速生成模板。
• 复杂资源(Ingress/StatefulSet)需手动编写或借助模板工具。
• 组合使用:生成基础模板后手动补充高级配置,效率最高。
4.5 最佳实践
1. 标签管理
建议在资源元数据中配置标准标签,提升资源管理的可读性和一致性:
metadata:labels:app: flask # 应用名称tier: backend # 层级(如 frontend/backend)env: prod # 环境标识(dev/stage/prod)
建议使用标准标签(如 app.kubernetes.io/name)进行统一管理。
2. 探针配置
合理配置探针确保应用稳定性:
livenessProbe: # 存活探针(探测失败则重启 Pod)httpGet:path: /healthzport: 5000initialDelaySeconds: 15readinessProbe: # 就绪探针(探测失败则从 Service 中摘除)exec:command: ["pgrep", "python"]
3. 多环境适配
建议使用 kustomize 或 Helm 实现配置的差异化管理,采用 base/overlays 结构组织不同环境下的配置。
五、总结
5.1 核心重点
• Kubernetes 通过 声明式资源编排和 分层抽象模型,将基础设施转化为可编程接口,实现 容器调度(Pod)、应用部署(Deployment)、服务治理(Service)等的全生命周期管理。
• 基于 YAML 的 Manifest 代码化,不仅支持 版本化运维和 自动化扩缩容,更为 GitOps 实践奠定基础 - 通过 Git 仓库统一管理集群状态,实现 审计追踪、灰度发布等生产级能力。
• 本地化工具链(如 Kind)与 声明式 API的结合,推动运维范式从 手动干预向 状态自愈演进,为构建 弹性、可观测的云原生体系提供标准路径。