当前位置: 首页 > web >正文

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              # 始终保持3Pod运行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         # 副本数量,确保至少有 2Pod 运行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的结合,推动运维范式从 手动干预向 状态自愈演进,为构建 弹性、可观测的云原生体系提供标准路径。

http://www.xdnf.cn/news/3192.html

相关文章:

  • 同时启动俩个tomcat压缩版
  • C# 在VS2022中开发常用设置
  • Python 爬取微店商品列表接口(item_search)的实战指南
  • 如何在Windows上实现MacOS中的open命令
  • 网工_ICMP协议
  • Linux-04-用户管理命令
  • Java List分页工具
  • 排序算法——选择排序
  • 微格式:为Web内容赋予语义的力量
  • 【Linux 网络】网络工具ifconfig和iproute/iproute2工具详解
  • 端到端观测分析:从前端负载均衡到后端服务
  • 进程、线程、进程间通信Unix Domain Sockets (UDS)
  • 《操作系统真象还原》第十一章——用户进程
  • Spring 框架中的常见注解讲解
  • Qt窗口关闭特效:自底而上逐渐消失
  • google colab设置python环境为python3.7
  • 提高程序灵活性和效率的利器:Natasha动态编译库【.Net】
  • 【学习笔记】Shell编程--Bash变量
  • HBuider中Uniapp去除顶部导航栏-小程序、H5、APP适用
  • 线上婚恋相亲小程序源码介绍
  • Learning vtkjs之ImageMarchingSquares
  • 国内免费连接claude-3-7大模型操作教程
  • 数据库系统综合应用与深度实践指南
  • VINS-FUSION:配置参数说明与配置自己的参数
  • 【XR】MR芯片 和 VR芯片之争
  • Linux:文件操作
  • FEKO许可配置
  • C++负载均衡远程调用学习之Reactor事件触发机制
  • Python3(19)数据结构
  • 第 11 届蓝桥杯 C++ 青少组中 / 高级组省赛 2020 年真题