Service是什么?
service代表了一组pod向客户端提供服务,可以通过K8S的服务发现的机制来调用service,kube-proxy通过服务名映射成IP来进行调用。
为什么需要Service
这就要说起pod的特性,每个pod都是临时,当一个pod失败或者重启后就会生成一个新的pod来进行启动,会有新的IP,如果需要暴露给客户端(这里指的同一个ack集群中其它pod)进行调用,这个IP随时都会发生变化,这时就需要一个不会改变的服务名提供给客户端了,Service就是做这个用处的。
Service 的类型
ClusterIP
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: {}
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: {}
NodePort
通过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
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
通过返回 CNAME
记录和对应值,可以将服务映射到 externalName
字段的内容(例如,foo.bar.example.com
)。 无需创建任何类型代理。
apiVersion: v1
kind: Service
metadata:
name: my-service
namespace: prod
spec:
type: ExternalName
externalName: my.database.example.com