Kubernetes Service 配置解析与外部应用访问
一、Service 基础配置解析
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-app # 选择器,匹配Pod标签
ports:
- protocol: TCP
port: 80 # Service暴露的端口
targetPort: 8080 # Pod上的端口
type: ClusterIP # Service类型
核心字段解析:
- selector: 通过标签选择器关联Pod
- ports: 端口映射配置
port
: Service对外端口targetPort
: Pod实际端口nodePort
: NodePort类型时使用的节点端口(30000-32767)
- type: Service类型
- ClusterIP(默认): 集群内部IP
- NodePort: 通过节点IP+端口暴露
- LoadBalancer: 云提供商负载均衡器
- ExternalName: 映射到外部DNS名称
二、通过Service访问外部应用
1. 使用Endpoints手动关联外部服务
apiVersion: v1
kind: Service
metadata:
name: external-service
spec:
ports:
- protocol: TCP
port: 80
targetPort: 80
---
apiVersion: v1
kind: Endpoints
metadata:
name: external-service
subsets:
- addresses:
- ip: 123.45.67.89 # 外部服务IP
ports:
- port: 80
2. 使用ExternalName类型(代理外部域名)
apiVersion: v1
kind: Service
metadata:
name: external-dns-service
spec:
type: ExternalName
externalName: api.external.com # 外部域名
ports:
- port: 80
使用方式:在集群内通过external-dns-service
域名访问,k8s会将其解析为api.external.com
三、常用Service类型详解
1. ClusterIP (默认类型)
-
特点:仅在集群内部可访问的虚拟IP
-
适用场景:内部服务通信
-
示例:
type: ClusterIP clusterIP: None # 设置None可创建Headless Service
2. NodePort
-
特点:通过每个节点的IP和静态端口暴露服务
-
端口范围:30000-32767
-
示例:
type: NodePort ports: - port: 80 targetPort: 8080 nodePort: 31000 # 可选,不指定则随机分配
3. LoadBalancer
-
特点:使用云提供商的负载均衡器
-
通常结合Ingress使用
-
示例:
type: LoadBalancer loadBalancerIP: 78.11.24.19 # 可选,指定负载均衡器IP
4. ExternalName
- 特点:将服务映射到外部DNS名称
- 不设置selector,也不定义端口
- 示例见上文"代理外部域名"部分
四、其它配置技巧
1. 会话保持(Session Affinity)
spec:
sessionAffinity: ClientIP # 基于客户端IP的会话保持
sessionAffinityConfig:
clientIP:
timeoutSeconds: 3600 # 会话保持时间
2. 多端口服务
ports:
- name: http
protocol: TCP
port: 80
targetPort: 8080
- name: https
protocol: TCP
port: 443
targetPort: 8443
3. Headless Service (无头服务)
spec:
clusterIP: None # 关键配置
selector:
app: my-app
特点:
- 不分配ClusterIP
- DNS返回所有Pod IP
- 适用于有状态应用如数据库
- DNS 行为特殊:
- 对于有 selector 的 Headless Service:返回所有匹配 Pod 的 IP 地址列表(A/AAAA 记录)
- 对于无 selector 的 Headless Service:返回手动配置的 Endpoints 地址
- 直接访问 Pod:
- 客户端直接与 Pod 通信,不经过负载均衡
- 适用于需要知道所有 Pod 地址的场景
评论需开启科学上网!