什么是service
在使用虚拟机或者裸容器部署应用时,程序之间的互相访问一般是通过宿主机的IP+端口号的形式进行访问,因为宿主机的IP地址一般不会轻易改变,所以用IP+端口的方式并没什么大问题。 但使用Kubernetes部署Pod应用时,Pod会被调度器随机调度至最佳节点,并且会经常删除重建,所以Pod的IP地址并不是一成不变的。 这时候再使用之前的IP+端口的方式就行不通了,所以Service就应运而生。

每个 Service具有一个 IP 地址和一个可解析为该 IP 地址的 DNS 名称,可以实现对一个或多个 Pod的流量进行负载均衡处理。IP地址和 DNS 名称只能在Kubernetes内部访问。
可以将Service简单的理解成Pods的负载均衡器。
Service默认是使用ClusterIp模式,仅支持集群内部访问,如果需要外部能访问到这个Service则需要使用另外两种类型的对象:NodePort 和 LoadBalancer。

Service对应KubeSphere平台中的服务。
示例service
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| ## 创建service --- apiVersion: v1 kind: Service metadata: namespace: koalas-cloud labels: app: koalas-appapi name: koalas-appapi spec: sessionAffinity: None selector: app: k-appapi ports: - name: http-k-appapi protocol: TCP targetPort: 7071 port: 7071
|
service配置文件详解
apiVersion: v1
kind: Service
metadata:
1 2 3 4 5 6 7
| labels:
app: iam-apiserver
name: iam-apiserver
namespace: default
|
spec:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| clusterIP: 192.168.0.231 # 虚拟服务地址
externalTrafficPolicy: Cluster # 表示此服务是否希望将外部流量路由到节点本地或集群范围的端点
ports: # service需要暴露的端口列表
- name: https #端口名称
nodePort: 30443 # 当type = NodePort时,指定映射到物理机的端口号
port: 8443 # 服务监听的端口号
protocol: TCP # 端口协议,支持TCP和UDP,默认TCP
targetPort: 8443 # 需要转发到后端Pod的端口号
selector: # label selector配置,将选择具有label标签的Pod作为其后端RS
app: iam-apiserver
sessionAffinity: None # 是否支持session
type: NodePort # service的类型,指定service的访问方式,默认为clusterIp
|