kubernetes实践之四十三: Service详解
通过Service,可以为一组具有相同功能的容器应用提供一个统一的入口地址,并将请求负载分发到后端各个应用容器上,实现Pod的负载均衡。
二:Service定义模版重要属性说明
1.spec.type Service的类型,指定Service的访问方式,默认值为ClusterIP.
a.ClusterIP: 虚拟的服务IP地址,该地址用于Kubernetes集群内部的Pod访问,在Node 上kube-proxy通过设置的Iptables规则进行转发。
b.NodePort: 使用宿主机的端口,使能够访问各Node的客户端通过Node的IP地址和端口号就能访问服务。
c.LoadBalancer: 使用外接负载均衡器完成到服务的负载分发
2.spec.sessionAffinity: 是否支持Session,可选值为ClientIP,默认值为空,ClientIP表示将同一个客户端的访问请求都转发到同一个后端Pod。
三:Service的基本用法
1.通常用法,服务作为Pod的负载均衡器。目前的负载分发策略有:
a. RoundRobin: 轮询模式,即轮询将请求转发到后端各个Pod上。
b.SessionAffinity: 基于客户端IP地址进行回话保持的模式。
2.多端口Service,有时候一个容器应用也可能提供多个端口的服务,那么在Service定义中也可以相应地设置为将多个端口对应到多个应用服务。
点击(此处)折叠或打开
-
apiVersion: v1
-
kind: Service
-
metadata:
-
name: webapp
-
spec:
-
ports:
-
- port: 8080
-
targetPort: 8080
-
name: web
-
- port: 8005
-
targetPort: 8005
- name: management
在某些环境中,应用系统需要将一个外部数据库作为后端服务进行连接,或将另一个集群或Namespace中的服务作为服务的后端,这时可以通过创建一个无Label Selector的Service来实现(此时需要创建一个和该Service同名的Endpoint)。
点击(此处)折叠或打开
-
apiVersion: v1
-
kind: Service
-
metadata:
-
name: mysql-test
-
spec:
-
ports:
- - port: 3306
点击(此处)折叠或打开
-
apiVersion: v1
-
kind: Endpoints
-
metadata:
-
name: mysql-test
-
namespace: default
-
subsets:
-
- addresses:
-
- ip: 120.25.154.90
-
ports:
- - port: 3306
点击(此处)折叠或打开
-
apiVersion: v1
-
kind: Service
-
metadata:
-
name: nginx
-
labels:
-
app: nginx
-
spec:
-
ports:
-
- port: 80
-
clusterIP: None
-
selector:
- app: nginx
四:集群外部访问Pod或Service的方法
1.将容器应用的端口号映射到物理机
a. 通过设置容器级别的hostPort,将容器应用的端口映射到物理机上
点击(此处)折叠或打开
-
apiVersion: v1
-
kind: Pod
-
metadata:
-
name: webapp
-
labels:
-
app: webapp
-
spec:
-
containers:
-
- name: webapp
-
image: tomcat
-
ports:
-
- containerPort: 8080
- hostPort: 8081
点击(此处)折叠或打开
-
apiVersion: v1
-
kind: Pod
-
metadata:
-
name: webapp
-
labels:
-
app: webapp
-
spec:
-
hostNetwork: true
-
containers:
-
- name: webapp
-
image: tomcat
-
ports:
- - containerPort: 8080
a.通过配置nodePort映射到物理机,同时设置Service的类型为NodePort
点击(此处)折叠或打开
-
apiVersion: v1
-
kind: Service
-
metadata:
-
name: nginx
-
labels:
-
app: nginx
-
spec:
-
type: NodePort
-
ports:
-
- port: 80
-
targetPort: 8080
-
nodePort: 8081
-
selector:
- app: nginx