智能
助手
最大化  清空记录 停止  历史记录
翻译选中文本
选中一段文本后进行翻译
名词解释
选中一段文本后进行名词解释
知识图谱生成
通过图谱展示知识信息
登录用户在知识浏览页面可用
答案生成
AI自动回答一个问答功能中的问题
登录用户在问答浏览页面,且问题开放回答中可用
知识摘要
自动为当前知识生成摘要
知识浏览页面可用
知识问答
针对当前知识进行智能问答
知识浏览面可用
2026-01-03 22:54:01 版本 : 6.8.2 svc(Service)服务发现与负载均衡(ClusterIP/NodePort/ExternalName/LoadBalancer)案例
作者: 文艺范儿 于 2026年01月03日 发布在分类 / Docker & K8S / K8S基础 下,并于 2026年01月03日 编辑
 历史版本

备注 修改日期 修改人
内容更新 2026-01-21 20:47:21[当前版本] 文艺范儿
内容更新 2026-01-21 20:46:57 文艺范儿
创建版本 2026-01-03 22:54:01 文艺范儿

6.8.2 svc(Service)服务发现与负载均衡(ClusterIP/NodePort)案例

Service 是 Kubernetes 中暴露 Pod 稳定访问入口的资源对象,核心作用:

  • 服务发现:通过固定 DNS 名称(如 my-svc.default.svc.cluster.local)或 ClusterIP 访问后端 Pod,避免直接使用易变的 Pod IP。
  • 负载均衡:将请求均匀分发到匹配的 Pod 副本(默认轮询算法)。
  • 解耦访问与 Pod 生命周期:Pod 重建/扩缩容后,Service 自动更新 Endpoints(后端 Pod 列表)。
  • 可通过 iptables -t nat -L -n 查看 kube-proxy 规则

核心类型(本文聚焦):

类型 作用 访问范围 典型场景

ClusterIP

分配集群内虚拟 IP

仅集群内 Pod/节点可访问

内部服务通信(如前端 → 后端 API)

NodePort

在每个节点开放静态端口(30000-32767)

集群外可通过 节点IP:NodePort访问

测试环境外部访问、无 Ingress 时的临时暴露

案例1:ClusterIP 内部服务发现与负载均衡

场景:创建一个 Deployment 运行 3 个 Nginx Pod(标签 app=nginx-svc),再通过 ClusterIP 类型的 Service 暴露这些 Pod,实现:

  • 集群内其他 Pod 通过 Service 名称或 ClusterIP 访问 Nginx;
  • Service 自动负载均衡到 3 个 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
/ #

案例2:NodePort 外部访问(集群外流量接入)

场景描述:基于案例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 负载均衡生效。

案例3:多端口 Service(区分不同服务)

场景描述:创建一个后端 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
历史版本-目录  [回到顶端]
    文艺知识分享平台 -V 5.2.5 -wcp