前言
一般一个应用程序需要通过某种机制来对外提供服务,对容器来说最简单的就是通过TCP/IP机制及监听IP和端口号来实现。
step1
以tomcat为例,创建一个提供Web服务的RC,两个副本,containerPort设置端口号8080,命名空间test:
apiVersion: v1
kind: ReplicationController
metadata:
name: webapp
namespace: test
spec:
replicas: 2
template:
metadata:
name: webapp
labels:
app: webapp
spec:
containers:
- name: webapp
image: tomcat
ports:
- containerPort: 8080
step2
创建该RC:
kubectl create -f webapp-rc.yaml
kubectl get pods -l app=webapp -o yaml -n test|grep podIP
kubectl get rc -o wide -n test
kubectl get pods -o wide -n test
访问tomcat服务:
但这样子有一个很明显的弊端,当因某种原因导致pod被删除或重启,pod也许会被调度到另外一个node上,这会导致pod的ip地址发生变化。而且,如果容器应用本身就是分布式的部署方式,由多个实例共同提供服务,这时就需要在实例的前端设置一个负载均衡器。Service就是用于这里的核心组件。
step3
通过expose来创建service:
kubectl expose rc webapp -n test
查看新创建的service,可以看到一个虚拟IP地址(ClusterIP):
kubectl get svc -n test
通过虚拟IP访问:
这里通过ClusterIP访问的会被自动负载到两个pod之一。
step4
通过配置文件定义service来创建service。
apiVersion: v1
kind: Service
metadata:
name: webapp-1
namespace: test
spec:
ports:
- ports: 8081
targetPort: 8080
selector:
app: webapp
ports指定的为8081,与8080不一样,需要targetPort来指定后端的端口。
创建service并查看:
访问:
同样是会自动负载到后端pod上。
负载策略
- RoundRobin:轮询模式,轮询转发。
- SessionAffinity:基于客户端IP地址进行会话保持的模式,即第一次请求被转发在哪里,后续的请求就都会在那里。
kubernetes默认采用RoundRobin模式进行负载,也可以设置service.spec.sessionAffinity=ClientIP来启用SessionAffinity策略。