Kubernetes资源对象之Service

2017-01-15 阅读: Kubernetes

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设置。

参考

标题:Kubernetes资源对象之Service
本文链接:https://blog.frognew.com/2017/01/kubernetes-service.html
转载请注明出处。

目录