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(云原生)。
建议先在一个测试命名空间里练手,熟练后再迁移到正式集群。