题目
如何通过Service暴露Pod?
信息
- 类型:问答
- 难度:⭐
考点
Service作用,标签选择器,服务暴露类型
快速回答
通过创建Service对象暴露Pod,核心步骤:
- 在Pod定义中添加
labels(如app: my-app) - 创建Service并配置
selector匹配Pod标签 - 选择Service类型(ClusterIP/NodePort/LoadBalancer)
- 通过Service的IP或DNS名称访问Pod
原理说明
Service是Kubernetes中抽象的网络端点,用于将一组Pod暴露给网络流量。工作原理:
- 通过标签选择器(Label Selector)关联具有特定标签的Pod
- 创建虚拟IP(ClusterIP)作为服务的访问入口
- 通过kube-proxy组件实现流量负载均衡到后端Pod
代码示例
1. 带标签的Pod定义 (my-pod.yaml):
apiVersion: v1
kind: Pod
metadata:
name: my-pod
labels:
app: my-app # 关键标签
spec:
containers:
- name: nginx
image: nginx:alpine2. Service定义 (my-service.yaml):
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-app # 匹配Pod标签
ports:
- protocol: TCP
port: 80 # Service端口
targetPort: 80 # Pod容器端口
type: ClusterIP # 默认类型操作步骤
- 创建Pod:
kubectl apply -f my-pod.yaml - 创建Service:
kubectl apply -f my-service.yaml - 验证服务:
kubectl get svc my-service查看CLUSTER-IP - 集群内访问:
curl http://<CLUSTER-IP>:80
最佳实践
- 始终使用明确的标签选择器(如
app: my-app) - 内部服务用
ClusterIP,外部访问用NodePort或LoadBalancer - 使用DNS名称访问:
my-service.namespace.svc.cluster.local - 在Deployment中管理Pod而非直接创建Pod
常见错误
- 标签不匹配:Service的selector与Pod的labels不一致
- 端口配置错误:targetPort未对应容器暴露的端口
- 忘记暴露端口:Pod的容器未监听指定端口
- 直接使用Pod IP:Pod重建后IP会变化,必须通过Service访问
扩展知识
- Service类型对比:
- ClusterIP:仅集群内部访问(默认)
- NodePort:通过节点IP+端口暴露(范围30000-32767)
- LoadBalancer:云厂商提供的负载均衡器
- Endpoint对象:执行
kubectl get endpoints my-service可查看Service实际关联的Pod IP列表 - Headless Service:设置
clusterIP: None用于直接获取Pod IP列表