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

Kubernetes 核心资源:Service 与 Pod 解析

Kubernetes 核心资源:Service 与 Pod 解析

一、Service 资源:Pod 的访问入口与负载均衡

Service 是 Kubernetes 中用于暴露 Pod 网络访问的核心资源,解决了 Pod IP 动态变化和外部访问的问题,同时提供负载均衡能力。

1.1 为什么需要 Service?

当通过 Deployment 创建 Pod 时,存在两个关键问题:

  • Pod IP 动态变化:Pod 重建(如故障重启、扩缩容)后,IP 会改变;
  • 外部无法直接访问:Pod IP 仅在集群内部可见,外部网络无法直接访问。

Service 通过以下方式解决:

  • 为一组同类 Pod 提供固定访问地址(ClusterIP);
  • 自动关联 Pod(通过 Label 匹配),实现负载均衡
  • 支持多种访问类型,满足集群内外访问需求。

1.2 Service 类型与操作示例

1.2.1 1. ClusterIP:集群内部访问(默认类型)

仅集群内可通过固定 IP 访问,适用于内部服务通信。

操作命令

# 基于 Deployment 创建 ClusterIP 类型 Service# 参数说明:--name 服务名,--type 类型,--port 服务端口,--target-port Pod 端口,-n 命名空间kubectl expose deploy nginx --name=svc-nginx1 --type=ClusterIP --port=80 --target-port=80 -n dev# 查看 Service 详情(含 ClusterIP 和关联的 Pod 标签)kubectl get svc svc-nginx1 -n dev -o wide# 示例输出:# NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR# svc-nginx1 ClusterIP 10.96.206.177 <none> 80/TCP 28s app=nginx# 集群内访问测试(通过 ClusterIP)curl 10.96.206.177 # 返回 Nginx 默认页面
1.2.2 2. NodePort:外部网络访问

在每个节点上开放一个静态端口,外部可通过 “节点 IP:NodePort” 访问,适用于开发测试环境。

操作命令

# 创建 NodePort 类型 Servicekubectl expose deploy nginx --name=svc-nginx2 --type=NodePort --port=80 --target-port=80 -n dev# 查看 Service(关注 PORT(S) 列的 80:30810/TCP,30810 为节点开放的端口)kubectl get svc svc-nginx2 -n dev -o wide# 示例输出:# NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR# svc-nginx2 NodePort 10.108.115.7 <none> 80:30810/TCP 10s app=nginx# 外部访问(集群任意节点 IP + NodePort)# 例如:http://192.168.100.100:30810(浏览器或 curl 访问)
1.2.3 3. 删除 Service
kubectl delete svc svc-nginx1 -n dev # 删除指定 Service

1.3 Service YAML 配置示例

创建 svc-nginx.yaml,定义 ClusterIP 类型 Service 并固定 IP:

apiVersion: v1 # Service 的 API 版本固定为 v1kind: Service # 资源类型为 Servicemetadata:name: svc-nginx # Service 名称namespace: dev # 所属命名空间spec:clusterIP: 10.109.179.231 # 固定集群内部 IP(可选,不指定则自动分配)ports:- port: 80 # Service 暴露的端口protocol: TCP # 协议(TCP/UDP,默认 TCP)targetPort: 80 # 关联 Pod 的端口(需与 Pod 监听端口一致)selector:app: nginx # 通过 Label 匹配 Pod(需与 Pod 的 labels 一致)type: ClusterIP # Service 类型

应用配置:

kubectl create -f svc-nginx.yaml # 创建 Service

1.4 核心原理

  • Label 关联:Service 通过 spec.selector 匹配具有相同 Label 的 Pod(如 app=nginx);
  • 负载均衡:当多个 Pod 匹配时,Service 自动将请求分发到不同 Pod;
  • 固定 IP:Service 的 ClusterIP 在生命周期内不变,避免因 Pod 重建导致访问失效。

二、Pod 资源深度解析:容器的载体

Pod 是 Kubernetes 最小部署单元,包含一个或多个容器,共享网络和存储环境。本节详细解析 Pod 的配置清单和核心属性。

2.1 Pod 资源清单结构

Pod 的 YAML 配置清单包含 5 个一级属性,所有 K8s 资源均遵循类似结构:

一级属性

说明

apiVersion

必选,API 版本(如 Pod 为 v1,可通过 kubectl api-versions 查询)

kind

必选,资源类型(如 Pod,可通过 kubectl api-resources 查询)

metadata

必选,元数据(名称、命名空间、标签等)

spec

必选,资源配置详情(容器、端口、资源限制等)

status

可选,状态信息(由 K8s 自动生成,无需手动配置)

2.2 核心配置详解(spec 字段)

spec 是 Pod 配置的核心,定义容器运行的详细规则,重点关注以下子属性:

2.2.1 1. containers:容器列表(必选)

一个 Pod 可包含多个容器,需定义每个容器的名称、镜像、启动命令等。

关键子属性

属性

说明

name

必选,容器名称(在 Pod 内唯一)

image

必选,容器镜像(如 nginx:1.17.1)

imagePullPolicy

镜像拉取策略(Always/IfNotPresent/Never)

command

容器启动命令(覆盖 Dockerfile 的 ENTRYPOINT)

args

启动命令参数(覆盖 Dockerfile 的 CMD)

env

环境变量配置

ports

暴露的端口列表

resources

资源限制(CPU / 内存的请求和上限)

示例 1:多容器 Pod 配置

创建 pod-two.yaml,包含 nginx 和 busybox 两个容器:

apiVersion: v1kind: Podmetadata:name: pod-basenamespace: devlabels:user: user1spec:containers:- name: nginx # 第一个容器:Nginx 服务image: nginx:1.17.1- name: busybox # 第二个容器:工具集(需保持运行)image: busybox:1.30

# 启动命令:创建文件并每隔 3 秒写入时间(避免容器退出)

command: ["/bin/sh", "-c", "touch /tmp/hello.txt; while true; do echo $(date +%T) >> /tmp/hello.txt; sleep 3; done;"]

应用并验证:

kubectl create -f pod-two.yamlkubectl get pod pod-base -n dev # 状态应为 2/2 Running# 进入 busybox 容器查看日志kubectl exec pod-base -n dev -it -c busybox -- /bin/sh/ # tail -f /tmp/hello.txt # 实时查看写入的时间
示例 2:imagePullPolicy 镜像拉取策略

策略

说明

Always

总是从远程仓库拉取镜像(无论本地是否存在)

IfNotPresent

本地有则使用本地镜像,否则远程拉取(默认,适用于固定版本标签如 v1.17.1)

Never

仅使用本地镜像,不存在则报错(适用于离线环境)

默认规则

  • 镜像标签为 latest 时,默认 Always;
  • 镜像标签为具体版本(如 v1.17.1)时,默认 IfNotPresent。
示例 3:command 与 args 命令参数

覆盖 Dockerfile 的启动命令,规则如下:

配置组合

生效命令

无 command 和 args

使用 Dockerfile 的 ENTRYPOINT+CMD

有 command 无 args

使用 command(覆盖 ENTRYPOINT)

无 command 有 args

使用 Dockerfile 的 ENTRYPOINT+args

有 command 和 args

使用 command+args

2.2.2 2. env:环境变量配置

为容器注入环境变量,支持直接定义或引用外部配置(如 ConfigMap/Secret)。

示例:pod-env.yaml

apiVersion: v1kind: Podmetadata:name: pod-envnamespace: devspec:containers:- name: busyboximage: busybox:1.30command: ["/bin/sh", "-c", "while true; do echo $(date +%T); sleep 60; done;"]env: # 定义环境变量- name: "username"value: "admin"- name: "password"value: "redhat"

验证环境变量:

kubectl create -f pod-env.yamlkubectl exec pod-env -n dev -it -c busybox -- /bin/sh/ # echo $username # 输出 admin/ # echo $password # 输出 redhat
2.2.3 3. ports:端口配置

定义容器暴露的端口,便于 Service 关联和网络访问。

关键子属性

属性

说明

name

端口名称(在 Pod 内唯一,可选)

containerPort

必选,容器内部监听的端口(1-65535)

protocol

协议(TCP/UDP/SCTP,默认 TCP)

hostPort

主机映射端口(不推荐,可能导致端口冲突)

示例:pod-ports.yaml

apiVersion: v1kind: Podmetadata:name: pod-portsnamespace: devspec:containers:- name: nginximage: nginx:1.17.1ports:- name: nginx-port # 端口名称containerPort: 80 # 容器端口protocol: TCP # 协议
2.2.4 4. resources:资源配额

限制容器的 CPU 和内存使用,避免资源争抢。

关键子属性

属性

说明

limits

资源上限(容器最多可使用的资源,超限时可能被终止重启)

requests

资源请求(容器启动所需的最小资源,节点资源不足时无法调度)

单位说明

  • CPU:核心数(如 1 表示 1 核,0.5 表示 0.5 核);
  • 内存:支持 Mi(兆字节)、Gi(千兆字节)等(如 1024Mi=1Gi)。

示例:pod-resources.yaml

apiVersion: v1kind: Podmetadata:name: pod-resourcesnamespace: devspec:containers:- name: nginximage: nginx:1.17.1resources:limits: # 资源上限cpu: "2" # 最多使用 2 核 CPUmemory: "10Gi" # 最多使用 10Gi 内存requests: # 资源请求cpu: "1" # 至少需要 1 核 CPUmemory: "10Mi" # 至少需要 10Mi 内存

2.3 其他重要配置

  • restartPolicy:重启策略(Always 总是重启,OnFailure 失败时重启,Never 从不重启,默认 Always);
  • nodeSelector:通过 Label 选择调度节点(如 nodeSelector: {env: dev} 调度到含 env=dev 标签的节点);
  • volumes:存储卷配置(如 emptyDir 临时存储、hostPath 主机目录挂载,用于容器间共享数据)。

2.4 查看 Pod 配置详情

通过 kubectl explain 命令查询配置项说明:

kubectl explain pod # 查看 Pod 一级属性kubectl explain pod.spec.containers # 查看容器配置详情kubectl explain pod.spec.resources # 查看资源配额配置

总结

  • Service 解决了 Pod 访问的稳定性和外部可达性问题,通过 ClusterIP 实现内部访问,NodePort 实现外部访问,核心是 Label 关联和负载均衡;
  • Pod 作为容器载体,其配置清单的 spec.containers 是核心,需重点掌握容器命令、环境变量、端口和资源配额的配置,理解多容器协同工作的机制。

掌握这两个资源是 Kubernetes 实战的基础,后续可深入学习更复杂的 Service 类型(如 LoadBalancer)和 Pod 高级特性(如健康检查、存储卷)。

http://www.dtcms.com/a/562216.html

相关文章:

  • 福安市网站建设广告发布平台
  • 关于Dynamics 365多选选项集在使用Contains-value时失效问题的分析与解决
  • 可以免费创建网站的软件数字化文化馆网站建设
  • 【C语言】选择结构和循环结构的进阶
  • 珠海网站建设制作青岛做网站的公司有哪些
  • 免费制作app的手机软件东莞seo建站广告费
  • ssm框架之Spring(上)
  • 【星闪】Hi2821 | USB HID设备类 + HID键盘例程
  • o2o网站建站wordpress json接口
  • 成都自助建站模板网站建设评审表
  • 边界扫描测试原理 15 -- BSDL 9 应用示例
  • 唐山专业网站建设公司阿里云虚拟主机和云服务器的区别
  • 济南旅游网站建设前程无忧网深圳网站建设类岗位
  • 查企业资质上什么网站东华软件是外包公司吗
  • 整体设计 全面梳理复盘 之15 :整体设计属性体系构建与实体表格落地
  • 自建服务器做网站要备案英文企业网站源码
  • 广州 营销型网站图书宣传推广方案
  • 网站设计教学网页站点设计
  • 东莞在哪里学网站建设嘉兴网站制作计划
  • 计算机图形学·4 OpenGL编程1 背景知识
  • 做外贸的有些什么网站wordpress编辑器不行
  • 各大网站logo图标wap站开发
  • 山西 网站制作旅游网站开发说明
  • springboot基于java的少数民族音乐网站的设计与实现(代码+数据库+LW)
  • 强化学习2.4 MDP作业汇总(持续更新)
  • 使用Requests和正则表达式实现塔读小说网小说爬取
  • Guava TreeRangeSet:区间运算的数学之美!
  • 双指针问题(同向)
  • seo公司哪家便宜宁波关键词排名优化平台
  • 安徽静安集团网站建设网站打不开了怎么办