Kubernetes为了解决这个问题,提供了一个高层的抽象,叫做Service。Service从逻辑上把pod进行分组,并且设置访问的策略。一般我们是通过label和selector来达到分组的目的的。
kind: ServiceapiVersion: v1metadata:name: frontend-svcspec:selector:app: frontendports:- protocol: TCPport: 80targetPort: 5000
一个pod、ip地址和目标端口的元组代表了一个Service的endpoint,比如在这个例子里面,frontend-svc有3个endpoints,分别是10.0.1.3:5000, 10.0.1.4:5000和10.0.1.5:5000。
REDIS_MASTER_SERVICE_HOST=172.17.0.6REDIS_MASTER_SERVICE_PORT=6379REDIS_MASTER_PORT=tcp://172.17.0.6:6379REDIS_MASTER_PORT_6379_TCP=tcp://172.17.0.6:6379REDIS_MASTER_PORT_6379_TCP_PROTO=tcpREDIS_MASTER_PORT_6379_TCP_PORT=6379REDIS_MASTER_PORT_6379_TCP_ADDR=172.17.0.6
方法二: Kubernetes有一些dns的addon,这些addon会自动为所有Service创建一个类似my-svc.my-namespace.svc.cluster.local的dns解析,并且在同一个Namespace里面的Service 可以直接用Service name进行访问。这是最为推荐的方法。
是否只能在cluster内部访问
是否同时可以被cluster内部和外部访问
是否是映射到一个集群外的entity上
可访问的范围由Service 的类型决定,Service 的类型可以在创建Service 的时候声明。
ClusterIP 和 NodePort
ClusterIP是默认的Service type,一个Service 通过ClusterIP来获取自己的Virtual IP,这个IP是用来和别的service通信的,只能在集群内部被访问。
NodePort的Service type除了会创建一个ClusterIP之外,还会把所有worker node上的一个30000-32767之间的端口映射到这个Service ,比如假设32233端口映射到了frontend-svc,那么不管我们连接到哪个worker node,我们都会被转发到Service 分配的ClusterIP——172.17.0.4。
默认情况下,当expose到有一个nodeport的时候,kubernetes master会自动随机选择一个30000-32767之间的port,当然,我们自己也可以手动指定这个port。
NodePort和ClusterIP会被自动创建,外部的load balancer会自动路由上去
Service 会在一个静态的端口上被暴露
通过底层的cloud provider提供的load balancer来暴露到外网
ExternalName
ExternalName是一个特定的Service type,这种Service type没有任何的selector也没有任何声明的endpoint。当在集群中访问到这个Service 的时候,会返回一个外部服务的CNAME。
这个service一般是用来让一个外部的服务在集群内部可以访问到的,比如我们有一个外部服务叫做my-database.example.com,那么我们可以通过设置ExternalName类型的Service,让内部的其它Service 通过my-database之类的名字访问到这个服务。
ExternalIP
如果一个Service 可以路由到一个或者多个worker node上,那么它可以被映射到一个ExternalIP地址。通过这个ExternalIP进入到集群的流量会被路由到其中一个endpoint上。
Kubernetes 实战培训
本次培训内容包括:Docker容器的原理与基本操作;容器网络与存储解析;Kubernetes的架构与设计理念详解;Kubernetes的资源对象使用说明;Kubernetes 中的开放接口CRI、CNI、CSI解析;Kubernetes监控、网络、日志管理;容器应用的开发流程详解等,点击识别下方二维码加微信好友了解具体培训内容。
3月23日开始上课,点击阅读原文链接即可报名。