Service:定义了一个服务得访问入口地址,前端的应用通过这个入口地址访问其背后得一组由pod副本组成的集群实例;
service与后端的pod副本集群之间则是通过label selector来实现无缝对接
每个service分配了一个全局唯一的虚拟IP地址,这个虚拟IP被称为Cluster IP
service从逻辑上代表了一组pod,具体是哪些pod则是由label来挑选。service由自己的IP,而且是不变的,客户端只需要访问serviceIP。无论后端pod如何变化,对客户端不会有任何影响,因为service没变。
举个例子:
创建一个deployment
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: httpd
spec:
replicas: 3
template:
metadata:
labels:
run: httpd
spec:
containers:
- name: httpd
image: httpd
ports:
- containerPort: 80
启动了三个pod,运行httpd镜像,label是run:httpd ,service将会用这个label来挑选pod
pod分配了各自的IP,这些IP只能被kubernetes Cluster中的容器和节点访问
接下来创建service
apiVersion: v1
kind: Service
metadata:
name: httpd-svc
spec:
selector:
run: httpd
ports:
- protocol: TCP
port: 8080
targetPort: 80
1.v1是service的apiversion
2.当前资源类型是service
3.service的名字是httpd-svc
4.selector知名挑选那些label为run:httpd的pod作为service后端的
5.将service的8080端口映射到pod的80端口,使用了TCP协议
执行kubectl apply创建service httpd-svc
查看service kubectl get service
httpd-svc 分配到了一个cluster-IP10.105.215.156,可以通过该IP访问后端的pod
我们注意到除了httpd-svc这个service,还有一个kubernetes的service,这个是cluster内部通过这个service访问kubernetes API server
通过kubectl describe service httpd-svc 查看service与pod的关系