【每日一个云原生小技巧 #12】Service Types

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 的端口。