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 # 输出 redhat2.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 高级特性(如健康检查、存储卷)。
