Kubernetes可以为一组具有相同功能的Pod提供一个统一的入口地址,并且将请求均衡的转发到各个对应的Pod上。本节主要记录Service的一些基本用法。
基本用法
创建一个Tomcat RC(tomcat-rc.yml):
apiVersion: v1 kind: ReplicationController metadata: name: tomcat-rc spec: replicas: 2 selector: name: tomcat template: metadata: name: tomcat labels: name: tomcat spec: containers: - name: tomcat image: tomcat ports: - containerPort: 8080
创建该RC:
我们可以通过Node IP + Container Port在Kubernetes集群中访问Tomcat:
由于Pod是Kubernetes集群范围内的虚拟概念,集群外的客户端无法通过Pod的IP和端口访问,我们可以将Pod的端口号映射到宿主机,以使客户端应用能够通过物理机访问容器应用,修改刚刚的tomcat-rc.yml,添加hostPort:
apiVersion: v1 kind: ReplicationController metadata: name: tomcat-rc spec: replicas: 2 selector: name: tomcat template: metadata: name: tomcat labels: name: tomcat spec: containers: - name: tomcat image: tomcat ports: - containerPort: 8080 hostPort: 8081 # 新增
更新该RC:
可以看到tomcat pod被分配到了node1和node2上,所以我们可以在宿主机外使用或者访问tomcat:
但是我们知道,Pod的IP地址是不可靠的,例如当Pod所在的Node发生故障时,Pod将被Kubernetes重新调度到另一个Node,Pod的IP地址将发生变化。所以我们可以定义一个tomcat pod的统一访问入口,这就是Service的作用。
创建Service有两种方式:
1.kubectl expose命令来创建Service
kubectl expose rc tomcat-rc
现在我们就可以通过Service的clusterIP + Port来访问了:
Service地址10.1.187.222:8080均衡的负载到了两个tomcat pod上(10.244.1.19:8080和10.244.4.13:8080)
2.通过配置文件创建
定义一个tomcat-service.yml:
apiVersion: v1 kind: Service metadata: name: tomcat-service spec: ports: - port: 8081 # service端口 targetPort: 8080 # 目标端口 selector: name: tomcat # 选择器,选择name=tomcat的pod
创建该Service:
同样,Service默认是不能外部访问的,如果想让外部能够访问到tomcat service,我们也需要将Service的端口映射到物理机,修改上面的tomcat-service.yml:
apiVersion: v1 kind: Service metadata: name: tomcat-service spec: type: NodePort # 新增 ports: - port: 8081 targetPort: 8080 nodePort: 30000 # 新增 selector: name: tomcat
上面配置通过设置nodePort(范围30000-32767)映射到物理机,同时设置Service的类型为NodePort,创建该Service:
现在我们就可以通过宿主机的IP+30000访问tomcat了:
负载均衡策略
Kubernetes Service提供了两种负载分发策略:RoundRobin和SessionAffinity:
- RoundRobin:轮询模式(默认),即轮询将请求转发到后端的各个Pod上。
- SessionAffinity:基于客户端IP地址进行会话保持的模式,即第1次将某个客户端发起的请求转发到后端的某个Pod上,之后从相同的客户端发起的请求都将被转发到后端相同的Pod上。可以通过设置service.spec.sessionAffinity=ClientIP来启用SessionAffinity策略:
apiVersion: v1 kind: Service metadata: name: tomcat-service spec: type: NodePort sessionAffinity: ClientIP # 采用SessionAffinity策略 ports: - port: 8081 targetPort: 8080 nodePort: 30000 selector: name: tomcat
Headless Service
Headless Service不提供ClusterIP,仅通过Label Selector将后端的Pod列表返回给调用的客户端。
创建tomcat-headless-service.yml:
apiVersion: v1 kind: Service metadata: name: tomcat-headless-service spec: ports: - port: 8080 clusterIP: None # 设置clusterIP为None,表示headless service selector: name: tomcat
创建该headless service: