K8S系列之Service

Service是什么?

service代表了一组pod向客户端提供服务,可以通过K8S的服务发现的机制来调用service,kube-proxy通过服务名映射成IP来进行调用。

为什么需要Service

这就要说起pod的特性,每个pod都是临时,当一个pod失败或者重启后就会生成一个新的pod来进行启动,会有新的IP,如果需要暴露给客户端(这里指的同一个ack集群中其它pod)进行调用,这个IP随时都会发生变化,这时就需要一个不会改变的服务名提供给客户端了,Service就是做这个用处的。

Service 的类型

ClusterIP

K8S系列之Service_第1张图片
ClusterIP会在集群内分配一个IP仅供集群内进行访问,客户端可以通过IP或者服务名进行调用找到对应的Service后,从而找到进行POD。

apiVersion: v1
kind: Service
metadata:
  creationTimestamp: '2023-02-02T10:09:41Z'
  labels:
    app.kubernetes.io/name: eureka-provider
    kubefed.io/managed: 'true'
  managedFields:
    - apiVersion: v1
      manager: kubefed-controller-manager
      operation: Update
      time: '2023-02-02T10:09:41Z'
  name: eureka-provider-cs01-cell-gz00cp2k00
  namespace: default
spec:
  clusterIP: 127.0.127.20
  clusterIPs:
    - 127.0.127.20
  ipFamilies:
    - IPv4
  ipFamilyPolicy: SingleStack
  ports:
    - name: eureka-provider-cs01-port-0
      port: 10002
      protocol: TCP
      targetPort: 10002
  selector:
    cafe.sofastack.io/app-instance: eureka-provider-gz00cp2k00
  sessionAffinity: None
  type: ClusterIP
status:
  loadBalancer: {}

NodePort

K8S系列之Service_第2张图片
通过node节点上的port向客户端提供服务,因为node的IP不会发生改变,只需要开通一个node port到pode port的对应关系就行。

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: NodePort
  selector:
    app.kubernetes.io/name: MyApp
  ports:
    # 默认情况下,为了方便起见,`targetPort` 被设置为与 `port` 字段相同的值。
    - port: 80
      targetPort: 80
      # 可选字段
      # 默认情况下,为了方便起见,Kubernetes 控制平面会从某个范围内分配一个端口号(默认:30000-32767)
      nodePort: 30007

Headless Services(特殊的ClusterIP)

一种特殊的ClusterIP,不需要分配IP,通过服务名进行访问

apiVersion: v1
kind: Service
metadata:
  creationTimestamp: '2023-02-02T10:26:00Z'
  labels:
    app.kubernetes.io/name: eureka-provider
    kubefed.io/managed: 'true'
  managedFields:
    - apiVersion: v1
      fieldsType: FieldsV1
      manager: kubefed-controller-manager
      operation: Update
      time: '2023-02-02T10:26:00Z'
  name: eureka-provider-hs01-cell-gz00cp2k00
  namespace: default
spec:
  clusterIP: None
  clusterIPs:
    - None
  ipFamilies:
    - IPv4
  ipFamilyPolicy: SingleStack
  selector:
    cafe.sofastack.io/app-instance: eureka-provider-gz00cp2k00
  sessionAffinity: None
  type: ClusterIP
status:
  loadBalancer: {}

LoadBalancer


通过云厂商来创建负载均衡器来向集群外提供服务,不同的厂商的实现不一样;例如:阿里云是通过SLB来提供服务的。

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app.kubernetes.io/name: MyApp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9376
  clusterIP: 10.0.171.239
  type: LoadBalancer
status:
  loadBalancer:
    ingress:
    - ip: 192.0.2.127

ExternalName

K8S系列之Service_第3张图片

通过返回 CNAME 记录和对应值,可以将服务映射到 externalName 字段的内容(例如,foo.bar.example.com)。 无需创建任何类型代理。

apiVersion: v1
kind: Service
metadata:
  name: my-service
  namespace: prod
spec:
  type: ExternalName
  externalName: my.database.example.com

你可能感兴趣的:(K8S,kubernetes,docker,java)