K8S当中的Service一共有四种:ExternalName、ClusterIP、NodePort和LoadBalancer。

1. ExternalName类型的Service

K8S当中,ExternalName类型的Service,用于将外部一个IP(或者域名),引入到K8S集群当中,实现K8S集群当中可以通过K8S的内部域名进行访问,后续如果需要Service的外部IP,只需要修改Service即可,不再需要各个应用当中分别进行修改。

比如我定义了一个MySQL的Service,将10.0.0.166这个IP引用到K8S集群当中。

apiVersion: v1
kind: Service
metadata:
  namespace: mysql
  name: mysql-service
spec:
  type: ExternalName
  externalName: 10.0.0.166  # 可以是固定的 IP 地址或外部 DNS 名称

接着我们只需要访问mysql-service.mysql.svc.cluster.local的方式去访问这个MySQL集群,如果后续需要更换MySQL集群,那么只需要将IP修改一下即可。

2.ClusterIP类型的Service

参考如下的配置:

apiVersion: v1
kind: Service
metadata:
  name: mysql-service
  namespace: mysql
spec:
  selector:
    app: mysql
  ports:
    - protocol: TCP
      port: 3306
      targetPort: 3306
  clusterIP: 10.233.3.17
  clusterIPs:
    - 10.233.3.17
  type: ClusterIP

我们使用标签选择器选择有mysql标签的Pod的IP,将它抓取到Endpoint当中,并通过ClusterIP,也就是集群的内部IP(10.233.3.17)去访问这个MySQL集群。

3. NodePort类型的Service

NodePort类型的Service使用方式如下:

apiVersion: v1
kind: Service
metadata:
  name: mysql-service
  namespace: mysql 
spec:
  selector:
    app: mysql
  ports:
    - protocol: TCP
      port: 3306
      targetPort: 3306
      nodePort: 31006
      name: mysql
  type: NodePort

通过nodePort配置当前的MySQL需要在Node的哪个端口进行启动,如果不指定nodePort的话,那么默认会是从30000-32767之间进行随机分配制。