《Kubernetes设计与实现》
  • Introduction
  • 内容简介
  • 前言
  • [第二章:Kubernetes基础]
    • 2.3 Kubernetes API
  • [第三章:工作负载管理]
    • [3.1 Pod]
      • 3.1.1 Pod概述
      • 3.1.1 Pod初体验
    • [3.2 ReplicationController]
      • 3.2.1 ReplicationController概述
      • 3.2.2 ReplicationController初体验
    • [3.3 ReplicaSet]
      • 3.3.1 ReplicaSet概述
      • 3.3.2 ReplicaSet初体验
    • [3.4 Deployment]
      • 3.4.1 Deployment概述
      • 3.4.2 Deployment初体验
    • [3.5 DaemonSet]
      • 3.5.1 DaemonSet概述
      • 3.5.2 DaemonSet初体验
  • [第四章:服务]
    • [4.1 Service]
      • 4.1.1 Service概述
      • 4.1.1 Service上手体验
  • [第六章:配置管理]
    • [6.1 Secret--机密信息管理]
      • 6.1.1 Secret概述
  • [第七章:集群认证]
    • [7.1 证书]
      • 7.1.1 证书基础
      • 7.1.2 证书签发流程
  • [第九章:准入控制器]
    • [9.1 准入控制器概述]
      • 9.1.1 概述
      • [9.1.2 内置默认启动的插件]
        • 9.1.2.1 NamespaceLifecycle
        • 9.1.2.15 MutatingAdmissionWebhook
  • [第十章:ResourceQuota]
    • 10.1 ResourceQuota概述
  • [第十六章:API设计约定]
    • 16.1 字段可选性设计约定
    • 16.2 condition设计约定
    • 16.3 event设计约定
  • [第十九章:Kubernetes生态]
    • [19.1 Kind]
      • [19.1.1 Kind概述]
      • 19.1.2 映射端口到主机
      • 19.1.3 配置端口转发
由 GitBook 提供支持
在本页
  • Service的出现背景
  • Service配置

这有帮助吗?

  1. [第四章:服务]
  2. [4.1 Service]

4.1.1 Service概述

Service是一种抽像资源,用于暴露运行在Pod中的服务并提供一定的负载均衡能力。

Service的出现背景

通常,我们希望把服务部署在Pod中,往往会通过Pod控制器(如Deployment)来创建并管理多个Pod副本,例如,我们通过Deployment创建了3个Pod副本,每个Pod中均运行一个nginx服务,如下所示:

[root@ecs-d8b6 manifests]# kubectl get pods -o wide
NAME                               READY   STATUS    RESTARTS   AGE   IP           NODE        NOMINATED NODE   READINESS GATES
nginx-deployment-5f67bd6bb-bvx2w   1/1     Running   0          10s   172.17.0.5   127.0.0.1   <none>           <none>
nginx-deployment-5f67bd6bb-g9kkp   1/1     Running   0          10s   172.17.0.4   127.0.0.1   <none>           <none>
nginx-deployment-5f67bd6bb-sr2w4   1/1     Running   0          10s   172.17.0.6   127.0.0.1   <none>           <none>

Kubernetes会为每个Pod分配一个IP地址,Pod使用该IP地址与外界通信,在上面的例子中三个Pod的IP地址分别为172.17.0.5、172.17.0.4和172.17.0.6。用户或集群中的其他Pod都可以使用这些IP地址访问nginx服务,如下所示:

[root@ecs-d8b6 manifests]# curl 172.17.0.4
<!DOCTYPE html>
<html>
<head>
...
</head>
<body>
<h1>Welcome to nginx!</h1>
...
</body>
</html>

这样的部署方式仅仅可以保证基础的服务能力,从实际的用户体验角度来看,存在一些无法回避的问题。

首先,Pod的IP地址是随机分配的,其他Pod无法提前知晓服务的IP地址。

其次,Pod是一种“易逝”的资源,它随时都有可能被重新创建或被调度到其他节点,而每次都会获得一个新的随机IP地址。

再次,多个Pod副本之间没有联系,如果用户需要为服务提供负载均衡的能力,用户需要动态地管理这些Pod并处理流量分发。

Service正是为了解决这些痛点而推出的一种解决方案,它管理一组Pod副本,为这些副本提供可靠的访问入口以及负载均衡能力。

Service配置

像其他对象(如Pod)一样,Service也是一个REST对象,你可以通过相应的API或配置文件来创建Service对象,一个简单的Service配置文件如下所示:

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

这份配置将创建一个名为nginx-service的Service对象,其主要配置如下:

  • spec.selector:指定Pod选择器,该Service将查找包含app: nginx标签的Pod作为流量分发对象;

  • spec.ports:该Service对外暴露的端口列表,支持暴露多个端口;

  • spec.ports.protocol:该端口对应的IP协议,支持TCP、UDP和SCTP;

  • spec.ports.port:该端口对外暴露的端口号;

  • spec.ports.targetPort:后端Pod暴露的端口;

简单地说,Service通过spec.selector来查找Pod,并把这些Pod提供的服务“聚合”起来,对外提供一个统一入口。创建Service对象时,Kubernetes默认会给Service分配一个IP(称为Cluster IP),例如10.0.0.165,Service通过该IP对外提供服务,当请求流量到来时,再把流量转发到后端的Pod,并提供一定的负载均衡能力。整体工作流程如下所示:

访问Service的Cluster IP,效果与直接访问Pod的IP地址一样,但使用Service可以屏蔽后端Pod细节,对外提供固定的访问入口,当后端的Pod有变动时,Service会自动更新转发列表。

上一页[4.1 Service]下一页4.1.1 Service上手体验

最后更新于4年前

这有帮助吗?