Kubernetes Service 是一个抽象层,定义了如何访问 Pod。Service 提供了一个固定的 IP 地址和 DNS 名称,这样即使 Pod IP 改变,Service 也能保证能够连通。
以下是 k8s 中的四种 Service Types:
- ClusterIP: 默认的 Service 类型。为 Service 分配一个内部 IP,只有在集群内部可以访问该 Service。 使用场景: 当你只想在集群内部暴露服务时使用。
- NodePort: 在每个节点上为 Service 打开一个端口,这样 Service 可以使用
<NodeIP>:<NodePort>
来外部访问。 使用场景: 当你想要从集群外部访问服务,但不想使用 LoadBalancer 或其他方法时。 - LoadBalancer: 为 Service 提供一个外部可访问的 IP 地址,并自动配置 cloud provider 的负载均衡器。 使用场景: 在云提供商环境中,当你想让外部流量进入集群时使用。
- ExternalName: 将 Service 映射到一个 externalName 字段的内容(例如
my-service.my-namespace.svc.cluster.local
映射到example.com
),但不提供任何其他方法。 使用场景: 当你想将 Service 指向一个外部服务时。
使用技巧
- 当使用
NodePort
时,你可以指定一个端口号,或者让 k8s 自动生成。 - 当你不需要固定的外部 IP 地址时,可以先使用
NodePort
,然后再迁移到LoadBalancer
。 - 使用
ExternalName
时,确保应用可以解析外部域名。
使用案例
ClusterIP
代码语言:javascript复制apiVersion: v1
kind: Service
metadata:
name: my-clusterip-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 8080
NodePort
代码语言:javascript复制apiVersion: v1
kind: Service
metadata:
name: my-nodeport-service
spec:
type: NodePort
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 8080
nodePort: 30080
LoadBalancer
代码语言:javascript复制apiVersion: v1
kind: Service
metadata:
name: my-loadbalancer-service
spec:
type: LoadBalancer
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 8080
ExternalName
代码语言:javascript复制apiVersion: v1
kind: Service
metadata:
name: my-externalname-service
spec:
type: ExternalName
externalName: example.com
对于每个 Service 类型,你都可以在 spec.selector
字段中定义哪些 Pod 被选为该 Service 的后端,以及 spec.ports
字段定义 Service 的端口和相应的 Pod 的端口。