kubernetes 服务使用

概述

Kubernetes Service 定义了这样一种抽象:逻辑上的一组 Pod,一种可以访问它们的策略 —— 通常称为微服务。 Service 所针对的 Pods 集合通常是通过选择算符来确定的,并将运行在一组 Pods 上的应用程序公开为网络服务的抽象方法。

定义服务

Service 在 Kubernetes 中是一个 REST 对象,和 Pod 类似。Service 定义可以基于 POST 方式,请求 apiserver 创建新的实例,但名称必须是合法的 DNS 标签名称。

有选择符

例如,假定有一组 Pod,它们对外暴露了 8080 端口,同时还被打上 app=my-service 标签。

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: my-service
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080

Kubernetes 为该服务分配一个 IP 地址(“集群IP”),该 IP 地址由服务代理使用。服务选择算符的控制器不断扫描与其选择器匹配的 Pod,然后将所有更新发布到也称为 “my-service” 的 Endpoint 对象。

没有选择符

在任何这些场景中,都能够定义没有选择算符的 Service,例如:

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080

由于此服务没有选择算符,因此不会自动创建相应的 Endpoint 对象。如果需要 Endpoint需要手动创建该资源。

无头服务(Headless Services)

有时不需要或不想要负载均衡,以及单独的 Service IP。 遇到这种情况,可以通过指定 Cluster IP(spec.clusterIP)的值为 “None” 来创建 Headless Service 。

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx

对这无头 Service 并不会分配 Cluster IP,kube-proxy 不会处理它们, 而且平台也不会为它们进行负载均衡和路由。 DNS 如何实现自动配置完全依赖于 Service 是否定义了选择算符。

带选择算符的服务

对定义了选择算符的无头服务,Endpoint 控制器在 API 中创建了 Endpoints 记录, 并且修改 DNS 配置返回 A 记录(地址),通过这个地址直接到达 Service 的后端 Pod 上。

无选择算符的服务

对没有定义选择算符的无头服务,Endpoint 控制器不会创建 Endpoints 记录。 然而 DNS 系统会查找和配置,例如:

  • 对于 ExternalName 类型的服务,查找其 CNAME 记录
  • 对所有其他类型的服务,查找与 Service 名称相同的任何 Endpoints 的记录

服务类型

Kubernetes ServiceTypes 允许指定你所需要的 Service 类型,默认是 ClusterIP,还包含下面类型:

  • ClusterIP:通过集群的内部 IP 暴露服务,选择该值时服务只能够在集群内部访问。 这也是默认的 ServiceType。
  • NodePort:通过每个节点上的 IP 和静态端口(NodePort)暴露服务。 NodePort 服务会路由到自动创建的 ClusterIP 服务。 通过请求 <节点 IP>:<节点端口>,你可以从集群的外部访问一个 NodePort 服务。
  • LoadBalancer:使用云提供商的负载均衡器向外部暴露服务。 外部负载均衡器可以将流量路由到自动创建的 NodePort 服务和 ClusterIP 服务上。
  • ExternalName:通过返回 CNAME 和对应值,可以将服务映射到 externalName 字段的内容(例如,foo.bar.example.com)。 无需创建任何类型代理。
ClusterIP

创建ClusterIP的service yaml

apiVersion: v1
kind: Service
metadata:
  name: service-nginx
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 8080
  selector:
    run: pod-nginx
  type: ClusterIP

创建成功后,k8s会为这个service自动分配一个Cluster IP,只能在集群内部访问,无法在集群外部访问,如图:
在这里插入图片描述

NodePort

Kubernetes 控制器将在 --service-node-port-range 标志指定的范围内分配端口(默认值:30000-32767)。 每个节点将那个端口(每个节点上的相同端口号)代理到你的服务中。 需要在服务在其 .spec.ports[*].nodePort 字段中要求分配的端口。下面是nodePort的service yaml。

apiVersion: v1
kind: Service
metadata:
  name: service-nginx
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 8080
    nodePort: 32000
  selector:
    run: pod-nginx
  type: NodePort

创建成功后,k8s会为这个service自动分配一个Node的端口,集群唯一,可以在集群外部访问,如图:
在这里插入图片描述

LoadBalancer

在支持外部负载均衡器的云提供商上,将 type 字段设置为LoadBalancer将为您的负载均衡器配置负载均衡器 Service。负载均衡器的实际创建异步发生,以及有关提供商均衡器信息将在公布Service的 .status.loadBalancer 领域,下面是LoadBalancer的service yaml。

apiVersion: v1
kind: Service
metadata:
  name: service-nginx
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 8080
    nodePort: 32000
  selector:
    run: pod-nginx
  type: LoadBalancer

创建成功后,外部负载均衡器的流量将直接重定向到后端 Pod 上,不过实际它们是如何工作的,这要依赖于云提供商。对于 LoadBalancer类型的服务,当所定义的端口不止一个时,所有端口都必须 使用相同的协议,并且其协议必须是 TCP、UDP 和 SCTP 之一,如图:

在这里插入图片描述

ExternalName

类型为 ExternalName 的服务将服务映射到 DNS 名称,而不是典型的选择器,例如 my-service 或者 cassandra。 你可以使用 spec.externalName 参数指定这些服务。

例如,以下 Service 定义将 prod 名称空间中的 my-service 服务映射到 my.database.example.com,下面是LoadBalancer的service yaml。

apiVersion: v1
kind: Service
metadata:
  name: service-nginx
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 8080
    nodePort: 32000
  type: ExternalName
  externalName: my.database.example.com

创建成功后,访问主机 my-service.prod.svc.cluster.local 时,集群 DNS 服务返回 CNAME 记录, 其值为 my.database.example.com。 访问 service-nginx 的方式与其他服务的方式相同,但主要区别在于重定向发生在 DNS 级别,而不是通过代理或转发。如图:
在这里插入图片描述

说明: ExternalName 服务接受 IPv4 地址字符串,但作为包含数字的 DNS 名称,而不是 IP 地址。 类似于 IPv4 地址的外部名称不能由 CoreDNS 或 ingress-nginx 解析,因为外部名称旨在指定规范的 DNS 名称。 要对 IP 地址进行硬编码,请考虑使用 headless Services。

External IP

如果有外部 IP 路由到 Kubernetes 集群的一个或多个节点,Kubernetes Service 可以通过这些 externalIPs 进行访问。externalIP 需要由集群管理员在 Kubernetes 之外配置。

在 Service 的定义中, externalIPs 可以和任何类型的 .spec.type 一通使用。在下面的例子中,客户端可通过 80.11.12.10:80 (externalIP:port) 访问service-nginx

apiVersion: v1
kind: Service
metadata:
  name: service-nginx
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 8080
    nodePort: 32000
  type: ExternalName
  externalIPs:
    - 80.11.12.10
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值