Kubernetes可以为一组具有相同功能的Pod提供一个统一的入口地址,并且将请求均衡的转发到各个对应的Pod上。本节主要记录Service的一些基本用法。
基本用法
创建一个Tomcat RC(tomcat-rc.yml):
1 | apiVersion: v1 |
创建该RC:
我们可以通过Node IP + Container Port在Kubernetes集群中访问Tomcat:
由于Pod是Kubernetes集群范围内的虚拟概念,集群外的客户端无法通过Pod的IP和端口访问,我们可以将Pod的端口号映射到宿主机,以使客户端应用能够通过物理机访问容器应用,修改刚刚的tomcat-rc.yml,添加hostPort:
1 | apiVersion: v1 |
更新该RC:
可以看到tomcat pod被分配到了node1和node2上,所以我们可以在宿主机外使用或者访问tomcat:
但是我们知道,Pod的IP地址是不可靠的,例如当Pod所在的Node发生故障时,Pod将被Kubernetes重新调度到另一个Node,Pod的IP地址将发生变化。所以我们可以定义一个tomcat pod的统一访问入口,这就是Service的作用。
创建Service有两种方式:
1.kubectl expose命令来创建Service
1 | 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:
1 | apiVersion: v1 |
创建该Service:
同样,Service默认是不能外部访问的,如果想让外部能够访问到tomcat service,我们也需要将Service的端口映射到物理机,修改上面的tomcat-service.yml:
1 | apiVersion: v1 |
上面配置通过设置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策略:
1
2
3
4
5
6
7
8
9
10
11
12
13apiVersion: 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:
1 | apiVersion: v1 |
创建该headless service:
《Kubernetes权威指南(第4版)》读书笔记