Kubernetes Service
当应用由单体架构转向微服务架构时,应用被拆成很多小的互相协作的微服务,每个服务会以多个副本运行,副本数量会随着系统所需的处理能力进行变化,这就是微服务的伸缩性。 微服务的负载均衡器对实现伸缩性起了十分重要的作用。
Service是Kubernetes最重要的资源对象。Kubernetes中的Service对象可以对应微服务架构中的微服务。Service定义了服务的访问入口,服务的调用者Pod通过这个地址访问Service后端的Pod副本实例。 Service通过Label Selector同后端的Pod副本建立关系,Replication Controller保证后端Pod副本的数量,也就是保证服务的伸缩性。
服务发现与负载均衡
Kubernetes1.5中,对于使用kubeadm init初始化的集群,Kubernetes通过DaemonSet的形式,保证在每个Node上都启动一个kube-proxy Pod实例。
kube-proxy实际上就是一个智能的负载均衡器。
发送到Service的请求由kube-proxy转发到后端的某个Pod实例上,同时支持不同的负载均衡策略和会话保持机制。
Kubernetes为每个Service分配一个全局唯一的虚拟IP,叫做ClusterIP,这样在整个集群中,服务的调用者都通过ClusterIP和服务进行通信。
Service创建完毕后,在Service的整个生命周期内Service的名称和ClusterIP保持不变,因此通过引入域名服务将Service的名称和ClusterIP建立DNS域名映射,服务的调用者可以通过使用服务的名称来访问服务。服务发现机制完美支持。
创建Service
创建如下的nginx RC
apiVersion: v1
kind: ReplicationController
metadata:
name: nginx
spec:
replicas: 2
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
resources:
requests:
memory: "64Mi"
cpu: "200m"
limits:
memory: "128Mi"
cpu: "500m"kubectl get pod -l app=nginx -o wide
NAME READY STATUS RESTARTS AGE IP NODE
nginx-62404 1/1 Running 0 28s 10.244.3.27 cent1
nginx-z0dnx 1/1 Running 0 28s 10.244.1.2 cent2可以使用kubectl expose命令快速为RC管理的Pod创建Service:
kubectl expose rc nginx
service "nginx" exposed
kubectl get svc nginx
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx 10.96.108.15 <none> 80/TCP 18s此时可以使用Service的ClusterIP和Port访问服务,请求会被负载均衡到后端的Pod上。
curl 10.96.108.15
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
......还可使用配置文件定义Service,使用kubectl create命令由配置文件创建Service:
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
ports:
- port: 80
targetPort: 80
selector:
app: nginx当前Kubernetes支持两种负载均衡策略:
- RoundRobin: 默认策略,请求被轮询转发到后端的Pod实例副本上
- SessionAffinity: 基于客户端的IP进行会话保持的模式,实现粘性Session,客户端请求第一次被转发到某个Pod上后,后边所有的请求都固定转发到这个Pod上,SessionAffinity通过服务的定义service.spec.sessionAffinity设置。