| 备注 | 修改日期 | 修改人 |
| 内容更新 | 2026-01-21 20:47:21[当前版本] | 文艺范儿 |
| 内容更新 | 2026-01-21 20:46:57 | 文艺范儿 |
| 创建版本 | 2026-01-03 22:54:01 | 文艺范儿 |
Service 是 Kubernetes 中暴露 Pod 稳定访问入口的资源对象,核心作用:
my-svc.default.svc.cluster.local)或 ClusterIP 访问后端 Pod,避免直接使用易变的 Pod IP。核心类型(本文聚焦):
| 类型 | 作用 | 访问范围 | 典型场景 |
|---|---|---|---|
ClusterIP |
分配集群内虚拟 IP |
仅集群内 Pod/节点可访问 |
内部服务通信(如前端 → 后端 API) |
NodePort |
在每个节点开放静态端口(30000-32767) |
集群外可通过 |
测试环境外部访问、无 Ingress 时的临时暴露 |
场景:创建一个 Deployment 运行 3 个 Nginx Pod(标签 app=nginx-svc),再通过 ClusterIP 类型的 Service 暴露这些 Pod,实现:
# 1. 前置准备:创建 Deployment(Pod 后端)
[root@k8s-master-01 ~]# vim nginx-deploy-for-svc.yaml
[root@k8s-master-01 ~]# cat .
cat: .: Is a directory
[root@k8s-master-01 ~]# cat nginx-deploy-for-svc.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy-for-svc
namespace: default
spec:
replicas: 3 # 3 个 Pod 副本
selector:
matchLabels:
app: nginx-svc # 标签选择器,匹配 Pod
template:
metadata:
labels:
app: nginx-svc # Pod 标签(需与 Service selector 一致)
spec:
containers:
- name: nginx
image: harbor.wyasw.com/library/nginx:1.21
ports:
- containerPort: 80 # 容器内暴露的端口(Service targetPort 需匹配)
# 部署 Deployment
[root@k8s-master-01 ~]# kubectl apply -f nginx-deploy-for-svc.yaml
[root@k8s-master-01 ~]# kubectl get pods -l app=nginx-svc # 确认 3 个 Pod 均为 Running
# 2. 创建 ClusterIP 类型 Service
[root@k8s-master-01 ~]# vim nginx-svc-clusterip.yaml
[root@k8s-master-01 ~]# cat nginx-svc-clusterip.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-svc-clusterip # Service 名称(DNS 域名的一部分)
namespace: default
labels:
app: nginx-svc
spec:
type: ClusterIP # 类型:集群内虚拟 IP
selector:
app: nginx-svc # 标签选择器:匹配带有 app=nginx-svc 的 Pod(与 Deployment 的 Pod 标签一致)
ports:
- name: http # 端口名称(可选,多端口时必须指定)
port: 80 # Service 暴露的端口(集群内访问时使用,如 ClusterIP:80)
targetPort: 80 # 后端 Pod 的容器端口(需与 Pod 内 containerPort 一致)
protocol: TCP # 协议(TCP/UDP/SCTP,默认 TCP)
# 创建Service
[root@k8s-master-01 ~]# kubectl apply -f nginx-svc-clusterip.yaml
# 3.验证service基本状态
# 查看 Service 详情(确认 ClusterIP、PORT(S))
[root@k8s-master-01 ~]# kubectl get svc nginx-svc-clusterip -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
nginx-svc-clusterip ClusterIP 10.200.90.196 <none> 80/TCP 71s app=nginx-svc
# 查看 Endpoints(Service 后端 Pod 的 IP:Port 列表,自动同步 Pod 变化)
[root@k8s-master-01 ~]# kubectl get endpoints nginx-svc-clusterip
NAME ENDPOINTS AGE
nginx-svc-clusterip 10.100.1.27:80,10.100.2.37:80,10.100.2.38:80 90s
# 4. 创建测试数据
[root@k8s-master-01 ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deploy-for-svc-855cd8d787-9zktp 1/1 Running 0 11m 10.100.2.38 k8s-worker-02 <none> <none>
nginx-deploy-for-svc-855cd8d787-p94l4 1/1 Running 0 11m 10.100.1.27 k8s-worker-01 <none> <none>
nginx-deploy-for-svc-855cd8d787-s49dv 1/1 Running 0 11m 10.100.2.37 k8s-worker-02 <none> <none>
test-pod 1/1 Running 0 2m13s 10.100.2.39 k8s-worker-02 <none> <none>
[root@k8s-master-01 ~]#
[root@k8s-master-01 ~]# kubectl exec -it nginx-deploy-for-svc-855cd8d787-9zktp -- sh
# echo 1111111111111 > /usr/share/nginx/html/index.html
# exit
[root@k8s-master-01 ~]# kubectl exec -it nginx-deploy-for-svc-855cd8d787-p94l4 -- sh
# echo 22222222222 > /usr/share/nginx/html/index.html
# exit
[root@k8s-master-01 ~]# kubectl exec -it nginx-deploy-for-svc-855cd8d787-s49dv -- sh
# echo 33333333333 > /usr/share/nginx/html/index.html
# exit
# 5. 验证服务发现与负载均衡(集群内访问)
# Kubernetes 内置 DNS 服务(CoreDNS)会自动为 Service 创建 DNS 记录:
# 格式:<service-name>.<namespace>.svc.cluster.local(集群内全局唯一)
# 同一命名空间可简化为 <service-name>
# 创建临时测试 Pod 并访问 Service:
# 创建 busybox 测试 Pod
[root@k8s-master-01 ~]# kubectl run test-pod --image=harbor.wyasw.com/library/busybox:1.36 --rm -it -- sh
# # 在 Pod 内访问 Service(通过名称或 ClusterIP)
[root@k8s-master-01 ~]# kubectl run test-pod --image=harbor.wyasw.com/library/busybox:1.36 --rm -it -- sh
...
/ # wget -qO- http://nginx-svc-clusterip:80 # 通过 Service 名称访问
1111111111111
/ # wget -qO- http://nginx-svc-clusterip:80
33333333333
/ # wget -qO- http://nginx-svc-clusterip:80
22222222222
/ # wget -qO- http://10.200.90.196:80 # 通过 ClusterIP 访问
33333333333
/ # wget -qO- http://10.200.90.196:80
22222222222
/ # wget -qO- http://10.200.90.196:80
1111111111111
/ #
场景描述:基于案例1的 Nginx Deployment,创建 NodePort 类型的 Service,允许集群外通过 节点IP:NodePort访问 Nginx(适用于测试环境或无 Ingress 控制器的场景)。
# 1. 配置yaml
[root@k8s-master-01 ~]# vim nginx-svc-nodeport.yaml
[root@k8s-master-01 ~]# cat nginx-svc-nodeport.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-svc-nodeport
namespace: default
spec:
type: NodePort # 类型:NodePort(在每个节点开放静态端口)
selector:
app: nginx-svc # 复用案例1的 Pod 标签(匹配 3 个 Nginx Pod)
ports:
- name: http
port: 80 # Service 集群内端口(同 ClusterIP)
targetPort: 80 # 后端 Pod 容器端口
nodePort: 30080 # 节点开放的静态端口(可选,范围 30000-32767,不指定则随机分配)
protocol: TCP
# 创建 NodePort Service
[root@k8s-master-01 ~]# kubectl apply -f nginx-svc-nodeport.yaml
# 2. 验证 NodePort 端口分配
[root@k8s-master-01 ~]# kubectl get svc nginx-svc-nodeport -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
nginx-svc-nodeport NodePort 10.200.214.60 <none> 80:30080/TCP 36s app=nginx-svc
# 3. 集群外访问验证(通过节点 IP)
# 通过 Master 节点 IP:NodePort 访问
[root@k8s-master-01 ~]# curl http://192.168.1.231:30080
22222222222
[root@k8s-master-01 ~]# curl http://192.168.1.231:30080
1111111111111
[root@k8s-master-01 ~]# curl http://192.168.1.231:30080
33333333333
# 通过 Worker 节点 IP:NodePort 访问(效果相同,流量会被转发到后端 Pod)
[root@k8s-master-01 ~]# curl http://192.168.1.233:30080
1111111111111
[root@k8s-master-01 ~]# curl http://192.168.1.233:30080
33333333333
[root@k8s-master-01 ~]# curl http://192.168.1.233:30080
22222222222
#多次执行 curl http://节点IP:30080,会看到返回的 Pod-内容轮询变化,证明 NodePort 负载均衡生效。
场景描述:创建一个后端 Pod 同时暴露 HTTP(80)和 HTTPS(443)端口,通过 Service 的多端口配置分别映射,实现外部通过不同端口访问不同协议服务。
# 1. yaml配置
[root@k8s-master-01 ~]# vim multi-port-svc.yaml
[root@k8s-master-01 ~]# cat multi-port-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: multi-port-svc
spec:
type: NodePort
selector:
app: multi-port-app # 匹配后端 Pod 标签
ports:
- name: http # 端口名称必须唯一(多端口时必填)
port: 8080 # Service 集群内 HTTP 端口
targetPort: 80 # 后端 Pod HTTP 容器端口
nodePort: 30081 # 节点 HTTP 端口
protocol: TCP
- name: https
port: 8443 # Service 集群内 HTTPS 端口
targetPort: 443 # 后端 Pod HTTPS 容器端口
nodePort: 30443 # 节点 HTTPS 端口
protocol: TCP
---
# 后端 Pod(同时暴露 80 和 443 端口)
apiVersion: apps/v1
kind: Deployment
metadata:
name: multi-port-deploy
spec:
replicas: 2
selector:
matchLabels:
app: multi-port-app
template:
metadata:
labels:
app: multi-port-app
spec:
containers:
- name: app
image: harbor.wyasw.com/library/nginx:1.21 # 简化示例,实际需配置 HTTPS 证书
ports:
- containerPort: 80
- containerPort: 443
# 部署
[root@k8s-master-01 ~]# kubectl apply -f multi-port-svc.yaml
# 2. 部署后,通过不同 NodePort 访问不同端口:
# 访问 HTTP 服务
curl http://192.168.1.231:30081
# 访问 HTTPS 服务(忽略证书验证)
curl -k https://节点IP:30443