K8s Service服务发布配置:零基础也能搞懂的实操教程

什么时候需要 K8s Service?

刚接触 Kubernetes 的同学会发现,Pod 的 IP 是不稳定的——重启或扩缩容后 IP 就变了。
而且 Pod 默认不能直接被集群外部访问。
这时候就需要 Service 来固定入口,它就像一个“稳定的门牌号”,把流量转发到背后的一组 Pod。

配置前的准备

  • 已经有一个可用的 Kubernetes 集群(minikube、Kubeadm、云厂商托管集群都可以)
  • kubectl 工具已安装并配置好 kubeconfig
  • 已经有至少一个正常运行的应用 Pod(可以用 kubectl run test-app --image=nginx 快速创建)
  • 建议先理解 标签(Label)选择器(Selector) 的概念,因为 Service 依赖它们匹配后端 Pod

手把手创建 Service

1. 编写 Service YAML

创建一个文件 my-service.yaml,内容如下(这里以暴露 Nginx Pod 为例):

apiVersion: v1
kind: Service
metadata:
  name: my-nginx-service
spec:
  selector:
    app: test-app          # 必须匹配目标 Pod 的标签
  ports:
    - protocol: TCP
      port: 80             # Service 对外监听的端口
      targetPort: 80       # 转发到 Pod 容器的端口
  type: ClusterIP          # 默认类型,只在集群内部访问
说明selector.app 必须和 Pod 的 labels 一致。如果 Pod 是用 kubectl run test-app --image=nginx 创建的,它的标签是 run=test-app,所以 selector 要写成 run: test-app

2. 使用 kubectl 创建并查看

kubectl apply -f my-service.yaml
kubectl get svc

命令输出会显示 my-nginx-service 的 ClusterIP(比如 10.96.0.100)和端口 80。

3. 内部访问测试

在集群内的任意节点或 Pod 里执行:

curl http://10.96.0.100:80

如果能返回 Nginx 默认页,说明 Service 配置成功。

让服务被集群外部访问:NodePort 和 LoadBalancer

如果希望外部也能访问,需要修改 type

NodePort 类型

spec:
  type: NodePort          # 会在每个节点上开一个端口(30000-32767)
  ports:
    - port: 80
      targetPort: 80
      nodePort: 30080     # 可选,不指定会自动分配

然后通过 任意节点IP:30080 访问。

LoadBalancer 类型

spec:
  type: LoadBalancer       # 仅在云厂商集群(如 AWS、GKE、AKS)生效

创建后会分配一个外部 IP 或域名,直接访问即可。

避坑指南(新手必看)

  • Selector 写错:Service 找不到 Pod 时,用 kubectl describe svc my-nginx-service 查看 Endpoints 字段是否为空。如果为空,检查标签是否匹配。
  • 端口映射混乱port 是 Service 的端口,targetPort 是 Pod 容器里的端口。如果容器里 Nginx 监听 8080,则 targetPort 应为 8080。
  • NodePort 被防火墙拦截:云服务器安全组或节点 iptables 规则可能拦住 NodePort,需要手动放行对应端口。
  • Pod 未就绪:Service 只转发流量给 Ready 状态的 Pod。用 kubectl get pods 确保 Pod 的 STATUS 为 Running。

高频问题与解决方案

Q:创建 Service 后 curl IP 没反应?

  • 先确认 Service 的 Endpoints 是否存在:kubectl get endpoints my-nginx-service
  • 没有 Endpoints 说明 Selector 没匹配到 Pod,修正标签。
  • 如果有 Endpoints 但访问超时,可能是 Pod 里的容器端口与 targetPort 不一致,或者 Pod 本身没监听。

Q:NodePort 类型在本机 nodePort: 30080 访问不了?

  • 检查防火墙是否允许 30080 端口。
  • 如果用的是 minikube,需要用 minikube service my-nginx-service --url 获得真实访问地址。

Q:LoadBalancer 一直 Pending?

  • 只有支持 LoadBalancer 的云环境才会自动分配。本地 minikube 可以开启 tunnel:minikube tunnel

总结

通过本文的步骤,你应该已经掌握了 K8s Service 服务发布配置的核心流程:编写 YAML → 应用 → 检查 Endpoints → 测试访问。
记住 Selector 必须准确端口映射写对防火墙要放开,这三点能解决 90% 的踩坑问题。
实际生产环境根据需求选择 ClusterIP(内部)、NodePort(简单外部暴露)或 LoadBalancer(云原生)。
建议先在一个测试命名空间里练手,熟练后再迁移到正式集群。

分享到:
上一篇
K8s Pod管理与资源限制配置
下一篇
K8s Ingress反向代理设置从零上手
1
系统公告

高考专属福利来袭|凭准考证免费领香港 CN2 云服务器

值高考落幕之际,泽御云开启考生专属回馈 + 产品限时特惠双重活动,助力学子暑期学习建站 高考 考生专属福利 全体应届高考生,凭高考准考证即可免费申领【香港 CN2 轻量云服务器,4 核 4G AMD 处理器】,免费使用周期 30 天,可用于搭建个人站点、编程实操、技术实训,祝各位考生金榜题名,前程似锦! 泽御云资质齐全合规自营机房,线路覆盖香港 CN2、国内 BGP、内蒙电信、美国精品线路,售后全天候技术支持。 官方网站:www.zeyuyun.com,活动限时有效,优惠逾期不再保留。
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意