目标
- 了解什么是Kubernetes Services
- 了解什么是Kubernetes Labels
- 将一个应用暴露在Kubernetes之外
Kubernetes Services
每个Pod都有一个在集群中唯一的IP的,但是这些IP没有暴露在Kubernetes之外的。考虑到Pod可能会在某个时间点被中断,被删除或者被其他Pod所替换,我们需要一种机制来让Pod和应用能够自动的发现对方。Kubernetes通过将一个或多个Pod组合成Service的方式实现这种机制。一个Kubernetes Service代表的是一系列Pod构成的一个逻辑集合的抽象层,它为这些Pod提供了负载均衡,服务发现和外部通信暴露功能。
这个抽象层允许我们将Pod暴露给来自集群外部的流量。Service有它自己的集群内唯一IP和暴露的端口用来接收外部流量。如果你要将Service暴露给外部,有下面几种方式:
- LoadBalancer - 提供一个公共的IP地址(比较典型的场景是你的Kubernetes运行在GCP或者AWS上)
- NodePort - 将服务暴露在集群中的每个节点上的同一个端口上(通过NAT的方式,Kubernetes集群和Minikube都可以使用)
Service架构
Service可以对发送到Pod上的流量进行负载均衡。当我们的Service是由某个特定的Deployment所构成的Pod组合成的时候,这个功能非常有用(我们的实例会在下一个模块中使用这个功能,因为我们需要多个实例同时运行)
Service同时负责对集群内的服务发现进行相关的处理(详情请见 Accessing the Service)。例如我们可以允许一个前端服务(比如web server)可以接收来自后端服务(数据库服务之类)的请求而不需要在一个Pod内。
Service通过Label Selector(标签选择器)来匹配一系列的Pod,Label Selector允许在Label上做一系列的逻辑操作。
你可以在用kubectl run命令启动Deployment的时候通过添加创--expose参数来建一个Service
Label是附加在对象(比如Pod)上的键值对,你可以把他们当做是社交媒体上面的标签(类似话题?)。
Label对使用者来说是具体特别含义的,因此可以用来组织对象,类似:
生产环境(production, test, dev)
应用版本((beta, v1.3)
服务或者server类型(frontend, backend, database)
Labels
Label可以在对象创建的时候设置给它,也可以在其他任意时间修改。kubectl run命令会设置一些默认的Label/Label Selector在新的Pod或者Deployment上。Label和Label Selector之间的关联定义了Deployment和它创建的Pod之间的关联。现在我们可以在Service的帮助下暴露我们的应用了,并且可以给它们设置一些Label