【K8S系列】第十二讲:Service进阶

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
EMR Serverless StarRocks,5000CU*H 48000GB*H
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 【K8S系列】第十二讲:Service进阶

1.Service介绍

1.1 什么是Service

Kubernetes Service 定义了这样一种抽象:

  • 一个 Pod 的逻辑分组
  • 一种可以访问这组Pod的策略

也可以理解为微服务。 这一组 Pod 能够被 Service 访问到,通常是通过 Label Selector实现的。

Service 通过标签来选取服务后端,一般配合

  • Replication Controller
  • Deployment

从而保证后端容器的正常运行。

这些匹配标签的 Pod IP 和端口列表组成 endpoints,由 kube-proxy 负责将服务 IP 负载均衡到这些 endpoints 上。

如下图,展示的是Service与Pod、RC的关系


总结:

k8s的Service定义了一个服务的访问入口地址。

前端的应用通过这个入口地址访问其背后的一组由Pod副本组成的集群实例,来自外部的访问请求被负载均衡到后端的各个容器应用上。


1.2 Service 类型

Service 类型有四种,总接下来:

  1. NodePort
  2. LoadBalancer
  3. ExternalName
  4. ClusterIP

在定义Service的时候可以指定一个需要的类型的Service。

如果不指定,则默认是ClusterIP类型


1.2.1 NodePort

只对外部可见

通过每个 Node 节点上的 IP 和静态端口(NodePort)暴露服务。

NodePort 服务会路由到 ClusterIP 服务,这个 ClusterIP 服务会自动创建。

通过请求可以从集群的外部访问一个 NodePort 服务

主要适合:集群外业务访问的场景

如下:

apiVersion: v1
kind: Service
metadata:
  name: test-service
spec:
  selector:
    app: test
  type: NodePort # 指定service 类型
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
    name: test-http
    nodePort: 30000 # 范围:30000-32767

设置 type 的值为 "NodePort",Kubernetes master 将从给定的配置范围内(默认:30000-32767)分配端口

每个 Node 将从该端口(每个 Node 上的同一端口)代理到 Service。

该端口将通过 Service 的 spec.ports[*].nodePort 字段被指定,这里指定的是30000

如果不指定的话会自动生成一个端口。

1.2.2 LoadBalancer

使用云提供商的负载局衡器,可以向外部暴露服务。

外部的负载均衡器可以路由到 NodePort 服务和 ClusterIP 服务,

需要结合具体的云厂商进行操作

1.2.3 ExternalName

ExternalName 是 Service 的特例

  • 没有 selector
  • 没有定义任何的端口和 Endpoint

对于运行在集群外部的服务,它通过返回该外部服务的别名这种方式来提供服务。

示例:

kind: Service
apiVersion: v1
metadata:
  name: test-service
  namespace: test
spec:
  type: ExternalName # 类型
  externalName: test.service.com

1.2.4 ClusterIP

只对内部可见,外部无法访问

Service的IP地址,通过集群的内部 IP 暴露服务,服务只能够在kubernetes集群内部可以访问,此为虚拟IP地址

默认的ServiceType。

kubectl -n test get Service # 即可看到ClusterIP

test 是命名空间


2.yaml名词解释

以下为yaml名词解释:

apiVersion: v1 # 版本
kind: Service # 类型
metadata: #元数据 类型string
  name: test #Service名称 类型string
  namespace: test #命名空间,不指定时默认为default命名空间
  labels: #自定义标签属性列表 类型string     
    - name: string 
  annotations: #自定义注解属性列表    
    - name: string
spec: #详细描述 类型list[]
  selector: [] #Label Selector配置,选择具有指定label标签的pod作为管理范围
  type: string #service的类型,指定service的访问方式,默认ClusterIP
               #ClusterIP:虚拟的服务ip地址,用于k8s集群内部的pod访问,在Node上kube-porxy通过设置的iptables规则进行转发
               #NodePort:使用宿主机端口,能够访问各Node的外部客户端通过Node的IP和端口就能访问服务器
               #LoadBalancer:使用外部负载均衡器完成到服务器的负载分发,
               #需要在spec.status.loadBalancer字段指定外部负载均衡服务器的IP,并同时定义nodePort和clusterIP用于公有云环境。
  clusterIP: string  #虚拟服务IP地址,当type=ClusterIP时,如不指定,则系统会自动进行分配,也可以手动指定。当type=loadBalancer,需要指定
  sessionAffinity: string  #是否支持session,可选值为ClietIP,默认值为空,ClientIP表示将同一个客户端(根据客户端IP地址决定)的访问请求都转发到同一个后端Pod
  ports: #service需要暴露的端口列表    
  - name: string #端口名称 类型string
    protocol: TCP  #端口协议,支持TCP或UDP,默认TCP 类型string
     port: 80 #服务监听的端口号 类型int
     targetPort: 8080 #需要转发到后端的端口号 类型int
     nodePort: 8080 #当type=NodePort时,指定映射到物理机的端口号 类型:int
  status: #当type=LoadBalancer时,设置外部负载均衡的地址,用于公有云环境    
    loadBalancer: #外部负载均衡器    
      ingress: #外部负载均衡器 
      ip: string #外部负载均衡器的IP地址
      hostname: string #外部负载均衡器的机主机

3.投票

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
2月前
|
Kubernetes 容器
K8S的Service的LoadBanlance之Metallb解决方案
本文介绍了如何在Kubernetes中使用MetalLB来实现Service的LoadBalancer功能,包括MetalLB的部署、配置、以及通过创建地址池和部署服务来测试MetalLB的过程。
122 1
K8S的Service的LoadBanlance之Metallb解决方案
|
3月前
|
Kubernetes 网络安全 容器
在K8S中,有个服务使用service的nodeport进行暴露,发现访问不到如何排查?
在K8S中,有个服务使用service的nodeport进行暴露,发现访问不到如何排查?
|
3月前
|
Kubernetes 负载均衡 网络协议
在K8S中,Service的类型有哪几种,请说⼀下他们的用途?
在K8S中,Service的类型有哪几种,请说⼀下他们的用途?
|
3月前
|
Kubernetes 监控 API
在k8S中,Metric Service是什么?
在k8S中,Metric Service是什么?
|
3月前
|
Kubernetes 负载均衡 网络协议
在k8S中,Headless Service是什么?
在k8S中,Headless Service是什么?
|
3月前
|
Kubernetes 负载均衡 网络协议
在K8S中,Service的类型有哪些?
在K8S中,Service的类型有哪些?
|
3月前
|
Kubernetes API 容器
在K8S中,Service的Nodeport端口范围?
在K8S中,Service的Nodeport端口范围?
|
3月前
|
Kubernetes 网络协议 网络安全
在K8S中,k8s中service访问有问题,该如何排查?
在K8S中,k8s中service访问有问题,该如何排查?
|
3月前
|
Kubernetes Perl 容器
在k8S中,Service怎么关联Pod的?
在k8S中,Service怎么关联Pod的?
|
3月前
|
Kubernetes 负载均衡 算法
在k8S中,Service分发后端的策略是什么?
在k8S中,Service分发后端的策略是什么?

推荐镜像

更多