首页 » 翻译 » Kubernetes » 正文

Kubernetes系列翻译05 Services in Kubernetes 第四部分

原文地址:http://kubernetes.io/v1.0/docs/user-guide/services.html

Discovering services(服务的发现)

Kubernetes 支持两种方式的来发现服务 ,环境变量和 DNS

环境变量

当一个Pod在一个node上运行时,kubelet 会针对运行的服务增加一系列的环境变量,它支持Docker links compatible 和普通环境变量
举例子来说:
redis-master服务暴露了 TCP 6379端口,并且被分配了10.0.0.11 IP地址
那么我们就会有如下的环境变量

REDIS_MASTER_SERVICE_HOST=10.0.0.11
REDIS_MASTER_SERVICE_PORT=6379
REDIS_MASTER_PORT=tcp://10.0.0.11:6379
REDIS_MASTER_PORT_6379_TCP=tcp://10.0.0.11:6379
REDIS_MASTER_PORT_6379_TCP_PROTO=tcp
REDIS_MASTER_PORT_6379_TCP_PORT=6379
REDIS_MASTER_PORT_6379_TCP_ADDR=10.0.0.11

这样的话,对系统有一个要求:所有的想要被POD访问的服务,必须在POD创建之前创建,否则这个环境变量不会被填充,使用DNS则没有这个问题

DNS

一个可选择的云平台插件就是DNS,DNS 服务器监控着API SERVER ,当有服务被创建的时候,DNS 服务器会为之创建相应的记录,如果DNS这个服务被添加了,那么Pod应该是可以自动解析服务的。
举个例子来说:如果我们在my-ns命名空间下有一个服务叫做“my-service”,这个时候DNS就会创建一个my-service.my-ns的记录,所有my-ns命名空间下的Pod,都可以通过域名my-service查询找到对应的ip地址,不同命名空间下的Pod在查找是必须使用my-sesrvice.my-ns才可以。

Kubernete 同样支持端口的解析,如果my-service有一个提供http的TCP主持的端口,那么我们可以通过查询“_http._tcp.my-service.my-ns”来查询这个端口

Headless services
有时候我们可能不需要一个固定的IP和分发,这个时候我们只需要将spec.clusterIP的值设置为none就可以了

对于这样的服务来说,集群IP没有分配,这个时候当你查询服务的名称的时候,DNS会返回多个A记录,这些记录都是指向后端Pod的。Kube 代理不会处理这个服务,在服务的前端也没有负载均衡器。但是endpoints controller还是会创建Endpoints

(好吧,这个好处貌似我还理解好)
This option allows developers to reduce coupling to the Kubernetes system, if they desire, but leaves them freedom to do discovery in their own way. Applications can still use a self-registration pattern and adapters for other discovery systems could easily be built upon this API.

External services(外部服务)

对于我们的应用程序来说,我们可能有一部分是放在Kubernete外部的(比如我们有单独的物理机来承担数据库的角色),Kubernetes支持两种方式:NodePorts,LoadBalancers

每一个服务都会有一个字段定义了该服务如何被调用(发现),这个字段的值可以为:

ClusterIP:使用一个集群固定IP,这个是默认选项
NodePort:使用一个集群固定IP,但是额外在每个POD上均暴露这个服务,端口
LoadBalancer:使用集群固定IP,和NODEPord,额外还会申请申请一个负载均衡器来转发到服务(load balancer )

注意:NodePort 支持TCP和UDN,但是LoadBalancers在1.0版本只支持TCP

Zhiming Zhang

Senior devops at Appannie
一个奔跑在运维路上的胖子
Zhiming Zhang

Latest posts by Zhiming Zhang (see all)