概念:
Kubernetes service定义了这样一种抽象:一个Pod的逻辑分组,一种可以访问它们的策略--通常称为一个微服务。这一组Pod能够被Service访问到,通常是通过 Label Selector
Service能够提供负载均衡的能力,但有以下限制:
只提供4层负载均衡能力(ip+port),而没有7层功能(主机名,域名)。在需要更多的匹配规则来转发请求的场合,4层负载均衡是不支持的。
Service类型:
1)ClusterIP:默认类型,自动分配一个仅Cluster内部可以访问的 虚拟IP+port
2)NodePort:在ClusterIP基础上为Service在每台机器上绑定一个端口,这样可以通过 NodeIP:NodePort来访问该服务
3)LoadBalancer:在NodePort的基础上,借助cloud provider(外部云服务商)创建一个外部负载均衡器,并将请求转发到NodeIP:NodePort
4)ExternalName:把集群外部的服务(如Amoeba集群)引入到集群内部来,在集群内部直接使用。没有任何类型代理被创建,k8s 1.7+以上的版本kube-dns才支持
1.ClusterIP
示例: Example011:
/root/yaml/001_pod_rs_deployment_svc/011_00_myapp-deployment.yaml
/root/yaml/001_pod_rs_deployment_svc/011_01_myapp-svc.yaml
Headless Service(无头服务)
.spec.clusterIP:None
这类service 不会分配单独的Cluster IP,kube-proxy不处理它们,平台不会为它们进行负载均衡和路由。集群内的pod通过无头服务的名称来访问该服务
Headless Service示例: Example012:
/root/yaml/001_pod_rs_deployment_svc/012_myapp-svc-headless.yaml
# dig -t A myapp-headless.default.svc.cluster.local. @10.244.0.12 //croedns-ip //kubectl get pod -n kube-system -o wide
2.NodePort
NodePort的原理是:在node上开了一个端口,将向该端口的流量导入到kube-proxy,然后由kube-proxy进一步到对应的pod
示例: Example013:
/root/yaml/001_pod_rs_deployment_svc/013_nodeport-svc.yaml
浏览器http访问
3.ExternalName
ExternalName 对 运行在集群外部的服务取一个别名(CNAME),集群内的pod通过使用别名SVC_NAME.NAMESPACE来使用该外部服务(别名对应的值)。
主要用来集中管理外部服务,管理集群与外部服务的耦合。
示例: Example014:
/root/yaml/001_pod_rs_deployment_svc/014_ExternalName.yaml
SVC_NAME.NAMESPACE.svc.cluster.local
# dig -t A mysql-externalname.default.svc.cluster.local. @10.244.0.12
;; ANSWER SECTION:
mysql-externalname.default.svc.cluster.local. 5 IN CNAME www.baidu.com.
www.baidu.com. 5 IN CNAME www.a.shifen.com.
www.a.shifen.com. 5 IN A 183.232.231.174
www.a.shifen.com. 5 IN A 183.232.231.172
测试:其他pod内 curl mysql-externalname.default
作业:通过ExternalName 实现mysql 3306或者Amoeba集群的服务访问