k8s-kubernetes-service小项目
1.service 简介
Kubernetes在设计之初就充分考虑了针对容器的服务发现与负载均衡机制,提供了Service资源,并通过kube-proxy配合cloud provider来适应不同的应用场景。随着kubernetes用户的激增,用户场景的不断丰富,又产生了一些新的负载均衡机制。目前,kubernetes中的负载均衡大致可以分为以下几种机制,每种机制都有其特定的应用场景:
- Service:直接用Service提供cluster内部的负载均衡,并借助cloud provider提供的LB提供外部访问
- Ingress Controller:还是用Service提供cluster内部的负载均衡,但是通过自定义LB提供外部访问
- Service Load Balancer:把load balancer直接跑在容器中,实现Bare Metal的Service Load Balancer
- Custom Load Balancer:自定义负载均衡,并替代kube-proxy,一般在物理部署Kubernetes时使用,方便接入公司已有的外部服务
Service是对一组提供相同功能的Pods的抽象,并为它们提供一个统一的入口。借助Service,应用可以方便的实现服务发现与负载均衡,并实现应用的零宕机升级。Service通过标签来选取服务后端,一般配合Replication Controller或者Deployment来保Service证后端容器的正常运行。这些匹配标签的Pod IP和端口列表组成endpoints,由kube-proxy负责将服务IP负载均衡到这些endpoints上。
Service有四种类型:
- ClusterIP:默认类型,自动分配一个仅cluster内部可以访问的虚拟IP
- NodePort:在ClusterIP基础上为Service在每台机器上绑定一个端口,这样就可以通过
<NodeIP>:NodePort
来访问该服务 - LoadBalancer:在NodePort的基础上,借助cloud provider创建一个外部的负载均衡器,并将请求转发到
<NodeIP>:NodePort
- ExternalName:将服务通过DNS CNAME记录方式转发到指定的域名(通过 spec.externlName 设定)。需要kube-dns版本在1.7以上。另外,也可以将已有的服务以Service的形式加入到Kubernetes集群中来,只需要在创建Service的时候不指定Label selector,而是在Service创建好后手动为其添加endpoint。
2.service 定义
k8s yaml格式的service定义文件完整内容
3.实例
在现有pod上创建服务。
在这个实例k8s-kubernetes入门-tomcat环境的基础上创建服务。
接下来在浏览器访问:
4.总结
现在的环境中有pod1个,service 1个,之前只有pod的时候,我们只能通过http://node:podPort访问
现在有了service 我们就可以通过http://master:servicePort访问。
不用关心pod具体被分配到哪个node上。
k8s是基于docker的,docker是因为虚拟机的解决方案太过臃肿,是一个轻量级的虚拟机。
现在环境如下:
10.0.228.93:master
10.0.228.117:node
10.244.1.4:pod
10.98.148.75:service
pod对外开放18080端口,tomcat容器本身是8080端口
service 监听8080对外30080,物理机映射30081
所以,我们现在要访问到tomcat容器的8080端口。
没有service 时:
内网(集群内部主机):
10.244.1.4:18080
10.0.228.117:18080
外网:
10.0.228.117:18080
有service时:
内网(集群内部主机):
10.244.1.4:18080无法访问
10.98.148.75:30080
外网:
10.0.228.93:30081
10.0.228.117:18080
这个实现是通过iptables的规则实现的。
以10.98.148.75:30081为例
第一条表示10.244的都可以访问,即pod可以访问service第二条是转到KUBE-SVC-AOO2BEF3XRFSYLKH
第一条是30081的端口。
即:
内网访问30080,外网30081
访问过程更详细参考:
k8s的service