什么是服务(Service)


直接访问Pod的问题

Pod创建完成后,如何访问Pod呢?直接访问Pod会有如下几个问题:

  1. Pod会随时被Deployment这样的控制器删除重建,那访问Pod的结果就会变得不可预知。
  2. Pod的IP地址是在Pod启动后才被分配,在启动前并不知道Pod的IP地址。
  3. 应用往往都是由多个运行相同镜像的一组Pod组成,逐个访问Pod也变得不现实。

举个例子,假设有这样一个应用程序,使用Deployment创建了前台和后台,前台会调用后台做一些计算处理。后台运行了3个Pod,这些Pod是相互独立且可被替换的,当Pod出现状况被重建时,新建的Pod的IP地址是新IP,前台的Pod无法直接感知。


使用Service解决Pod的访问问题

Kubernetes中的Service对象就是用来解决上述Pod访问问题的。Service有一个固定IP地址(在创建CCE集群时有一个服务网段的设置,这个网段专门用于给Service分配IP地址),Service将访问它的流量转发给Pod,具体转发给哪些Pod通过Label来选择,而且Service可以给这些Pod做负载均衡。

那么对于上面的例子,为后台添加一个Service,通过Service来访问Pod,这样前台Pod就无需感知后台Pod的变化。

如何创建服务(Service)

集群内访问(ClusterIP)

集群内访问表示工作负载暴露给同一集群内其他工作负载访问的方式,通过集群的内部 IP 暴露服务,选择该值时服务只能够在集群内部访问。

通过集群内部域名访问的格式为“<服务名称>.<工作负载所在命名空间>.svc.cluster.local:<端口号>”,例如“nginx.default.svc.cluster.local:80”。

节点访问(NodePort)

节点访问 ( NodePort )是指在每个节点的IP上开放一个静态端口,通过静态端口对外暴露服务。节点访问 ( NodePort )会路由到ClusterIP服务,这个ClusterIP服务会自动创建。通过请求 <NodeIP>:<NodePort>,可以从集群的外部访问一个NodePort服务。

负载均衡(LoadBalancer)

负载均衡(LoadBalancer)类型的服务可以通过弹性负载均衡(ELB)从公网访问到工作负载,与弹性IP方式相比提供了高可靠的保障。负载均衡访问方式由公网弹性负载均衡服务地址以及设置的访问端口组成,例如“10.117.117.117:80”。

在访问负载均衡类型的服务时,从ELB过来的流量会先访问到节点,然后通过Service转发到Pod。

DNAT网关(DNAT)

“DNAT网关”可以为集群节点提供网络地址转换服务,使多个节点可以共享使用弹性IP。

NAT网关与弹性IP方式相比增强了可靠性,弹性IP无需与单个节点绑定,任何节点状态的异常不影响其访问。访问方式由公网弹性IP地址以及设置的访问端口组成,例如“10.117.117.117:80”。

常见问题

常见问题

更多常见问题

更多常见问题

  • 集群内部无法使用ELB地址访问负载

    当LoadBalancer Service设置了服务亲和为节点级别,即externalTrafficPolicy取值为Local时,在使用中可能会碰到从集群内部(节点上或容器中)使用ELB地址访问不通的情况。

    解决这个问题通常有如下办法:

    ·(推荐)在集群内部访问使用Service的ClusterIP或服务域名访问。

    ·将Service的externalTrafficPolicy设置为Cluster,即集群级别服务亲和。不过需要注意这会影响源地址保持。

    ·使用Service的pass-through特性,使用ELB地址访问时绕过kube-proxy,先访问ELB,经过ELB再访问到负载。

    更多详情请参考此文档


  • 使用CCE设置工作负载访问方式时,端口如何填写?

    CCE支持工作负载的内部互访和被互联网访问两种方式。

    在设置工作负载访问方式时,一般需要填写两个端口号,分别为“容器端口”和“访问端口”。

    “容器端口”指容器中应用程序的访问端口。端口根据每个业务的不同而不同,一般在容器镜像中已指定。

    “访问端口”,需根据选择访问类型的不同来填写。

    1. · ClusterIP:指该容器工作负载发布为服务后,所设定的服务端口号,请填写1-65535之间的整数值。在内部工作负载互访时,将通过“Cluster IP:访问端口”来访问。
    2. · NodePort:指容器映射到节点上的端口。配置完成后,系统会在用户所在项目的所有节点上打开一个真实的端口号。访问工作负载时可以通过“节点IP:访问端口”来访问工作负载。如无特殊需求,选择“自动生成”即可,系统会自动分配访问端口号。若选择“指定端口”,请填写30000-32767之间的整数,且确保集群内该值唯一。
    3. · LoadBalancer:代表负载均衡上注册的对外端口,外部访问使用ELB的VIP+服务端口。
  • Service事件:Have no node to bind,如何排查?

    1.登录CCE控制台,进入集群,在左侧导航栏选择“服务发现”。

    2.在service列表里确认此服务是否有关联的工作负载,或关联的工作负载的相关实例是否正常。

  • 节点无法连接互联网(公网),如何排查定位?

    排查项一:节点是否绑定弹性IP

    登录ECS控制台,查看节点对应的弹性云服务器是否已绑定弹性IP。

    如下图,若弹性IP一栏有IP地址,表示已绑定弹性IP。若没有,请为弹性云服务器绑定弹性IP。


    排查项二:节点是否配置网络ACL

    登录VPC控制台,单击左侧导航栏的“访问控制 > 网络ACL”。排查节点所在集群的子网是否配置了网络ACL,并限制了外部访问。

  • 服务发布到ELB,ELB的后端为何会被自动删除?

    1.创建ELB时候,如果ELB监控检查失败,后端服务器组会删除,而且后续服务正常以后也不会添加。如果是更新已有的SVC时则不会删除。

    2.添加删除节点的时候,由于集群状态的改变,可能会引起集群内的Node访问方式的改变,为保证服务正常运行,所以ELB会进行一次刷新操作,这个过程类似于更新ELB。