在Kubernetes中,Pod虽然拥有独立的IP,但Pod会被快速地创建和删除,因此不能通过Pod直接对外提供服务。通过服务(Service)能够解耦前端和后端的关联,从而实现松耦合的微服务设计。本文介绍如何通过控制台和Kubectl方式创建、更新和删除服务。

控制台操作指导

创建服务

  1. 登录容器服务管理控制台
  2. 在控制台左侧导航栏中,单击集群
  3. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情
  4. 在集群管理页左侧导航栏中,选择网络 > 服务
  5. 单击页面右上角的创建
  6. 创建服务对话框中,设置相关参数。
    参数 描述
    名称 设置服务的名称。
    类型 选择服务类型,即服务访问的方式。包括:
    • 虚拟集群IP:即ClusterIP,指通过集群的内部IP暴露服务。选择该值,服务只能够在集群内部可以访问,这也是默认的Service类型。
      说明 您的服务类型为虚拟集群IP时,才能设置实例间发现服务(Headless Service)。您可以使用无头Service与其他服务发现机制进行接口,而不必与Kubernetes的实现捆绑在一起。
    • 节点端口:即NodePort,通过每个Node上的IP和静态端口(NodePort)暴露服务。NodePort服务会路由到ClusterIP服务,这个ClusterIP服务会自动创建。通过请求<NodeIP>:<NodePort>,可以从集群的外部访问一个NodePort服务。
    • 负载均衡:即LoadBalancer,指阿里云提供的负载均衡服务(SLB),可选择公网访问或私网访问。阿里云负载均衡服务可以路由到NodePort服务和ClusterIP服务。
      • 新建SLB:您可以通过单击修改,修改SLB规格。
      • 使用已有SLB: 您可以在已有的列表中选择SLB规格。
      说明 负载均衡类型支持新建SLB和使用已有SLB,且多个Kubernetes Service可以复用同一个SLB,但是存在以下限制:
      • 使用已有的负载均衡实例会强制覆盖已有监听。
      • Kubernetes通过Service创建的SLB不能复用(会导致SLB被意外删除)。只能复用您手动在控制台(或调用OpenAPI)创建的SLB。
      • 复用同一个SLB的多个Service不能有相同的前端监听端口,否则会造成端口冲突。
      • 复用SLB时,监听的名字以及虚拟服务器组的名字被Kubernetes作为唯一标识符。请勿修改监听和虚拟服务器组的名字。
      • 不支持跨集群复用SLB。
    关联 选择服务要绑定的后端应用。若不进行关联部署,则不会创建相关的Endpoints对象,您可自己进行绑定,请参见services-without-selectors
    外部流量策略 设置外部流量策略。
    • Local:流量只发给本机的Pod。
    • Cluster:流量可以转发到集群中其他节点上的Pod。
    说明 您的服务类型为节点端口负载均衡时,才能设置外部流量策略
    端口映射 添加服务端口(对应Service YAML文件中的port)和容器端口(对应Service YAML文件中的targetPort),容器端口需要与后端的Pod中暴露的容器端口一致。
    注解 为该服务添加一个注解(Annotation),配置负载均衡的参数。您可以选择自定义注解阿里云注解。例如设置service.beta.kubernetes.io/alicloud-loadbalancer-bandwidth:2表示将该服务的带宽峰值设置为2Mbit/s,从而控制服务的流量。更多参数请参见通过Annotation配置负载均衡
    标签 您可为该服务添加一个标签,标识该服务。
  7. 单击创建
    在服务列表中可以看到新创建的服务。
    服务列表

更新服务

  1. 在集群管理页左侧导航栏中,选择网络 > 服务
  2. 在对应服务的操作列中,单击更新
  3. 更新服务对话框中,设置相关参数,然后单击确定
    修改服务
  4. 在服务列表中,找到所需的服务,单击右侧的详情,查看服务变化的情况。

查看服务

  1. 在集群管理页左侧导航栏中,选择网络 > 服务
  2. 您可以选择所需的集群和命名空间,选择所需的服务,单击右侧的详情

    您可查看服务的名称、类型、创建时间、集群IP以及外部端点等信息。本例中您可看到分配给服务的外部端点(IP地址和端口)。您可以单击该IP地址访问Nginx应用。

    svc详情

Kubectl操作指导

Service YAML示例
apiVersion: v1
kind: Service
metadata:
  annotations:
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: "intranet"
  labels:
    app: nignx
  name: my-nginx-svc
  namespace: default
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
  type: LoadBalancer
字段 说明
kind 定义资源对象为Service。
metadata 定义Service的名称、Label和命名空间等基本信息。
metadata.annotations 容器服务ACK支持丰富的负载均衡相关的注解(Annotations)。例如,在上面的YAML示例中,service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type指定Service的访问方式为intranet(私网访问)。更多注解,请参见通过Annotation配置负载均衡
spec.selector 定义Service的选择器。Service会根据Selector和Pod Label的匹配关系,确定Service所要关联暴露的后端Pod。
spec.ports.port 定义Service暴露给ClusterIP的端口,集群内部客户端访问Service的入口,即clusterIP:port
spec.ports.targetPort 定义后端Pod的端口。从port进来的流量,经由kube-proxy流入到后端Pod的targetPort上,最后进入容器。
spec.type 定义Service的被访问方式。
  • LoadBalancer:使用阿里云负载均衡SLB公开服务。当Service没有指定已有SLB时,默认创建的SLB实例类型为公网。您可以通过设置注解service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-typeintranet,来创建私网访问的Service以及相应的私网SLB。更多信息,请参见通过使用已有SLB的服务公开应用通过使用自动创建SLB的服务公开应用
  • ClusterIP:在集群内部公开服务,可用于集群内部访问。
  • NodePort:使用节点的端口映射到后端Service,集群外可以通过节点IP:NodePort访问。
  • ExternalName:将服务映射到DNS。

创建Service

  1. 参考以上YAML示例,创建Service YAML文件。
    下文以创建名为my-nginx-svc.yaml的Service YAML文件为例进行说明。
  2. 通过Kubectl或CloudShell方式连接集群。详细操作,请参见通过kubectl管理Kubernetes集群在CloudShell上通过kubectl管理Kubernetes集群
  3. 执行以下命令,创建Service。
    kubectl apply -f my-nginx-svc.yaml
  4. 执行以下命令,验证服务是否创建成功。
    kubectl get svc my-nginx-svc
    返回结果示例:
    NAME           TYPE           CLUSTER-IP    EXTERNAL-IP      PORT(S)        AGE
    my-nginx-svc   LoadBalancer   172.21.XX.XX   192.168.XX.XX     80:31599/TCP   5m
更新Service
  • 方式1:执行以下命令,更新Service。
    kubectl edit service my-nginx-svc
  • 方式2:手动删除旧的Service,修改YAML文件后,重新创建Service。
    kubectl apply -f my-nginx-svc.yaml

查看Service

执行以下命令,查看Service。
kubectl get service my-nginx-svc
返回结果示例:
NAME           TYPE           CLUSTER-IP    EXTERNAL-IP      PORT(S)        AGE
my-nginx-svc   LoadBalancer   172.21.XX.XX   192.168.XX.XX     80:31599/TCP   5m

删除Service

执行以下命令,删除Service。
kubectl delete service my-nginx-svc