《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 提供支持
在本页
  • 创建
  • 查看
  • 查看Pod 拓扑
  • 访问Service
  • 更新
  • 删除

这有帮助吗?

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

4.1.1 Service上手体验

本节,我们将通过实际的例子来体验Service所提供的功能。

创建

创建Service对象时,Kubernetes会根据spec.selector来查找拥有指定标签的Pod,查找到Pod就维护一组拓扑关系,如果查找不到也不会自动创建Pod(配置中没有Pod模版),所以本例中用到的Pod对象需要单独创建,在开始之前,假定我们已使用前面介绍Deployment时使用的配置创建了一组label为app: nginx的Pod对象,这些Pod通过端口80对外提供服务。

首先,我们将以下配置保存到名为service.yaml的文件中:

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

然后,创建Service对象:

[root@ecs-d8b6 manifests]# kubectl create -f service.yaml 
service/nginx-service created

查看

接着查看刚刚创建的Service对象:

[root@ecs-d8b6 manifests]# kubectl get services nginx-service -o wide
NAME            TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE   SELECTOR
nginx-service   ClusterIP   10.0.0.83    <none>        80/TCP    56s   app=nginx

命令行输出中各字段含义如下:

  • NAME:Service对象名称,对应配置中的metadata.name;

  • TYPE:Service类型,默认为ClusterIP类型,更多的类型将在后面的章节中介绍;

  • CLUSTER-IP:自动分配的Cluster IP;

  • EXTERNAL-IP:外部IP地址,用于接收集群外部流量的地址,在后面介绍Service类型时详细介绍;

  • PORT(S):Service对外暴露的端口列表,本例中只对外暴露一个端口,对应配置中的spec.ports;

  • AGE:创建至今经历的时间;

  • SELECTOR:标签选择器,Service根据此选择器查看后端Pod,对应配置中的spec.selector。

当前Kubernetes支持多种Service类型,来应对不同的使用场景:

  • ClusterIP:Service通过一个只能在集群内部访问的 Cluster IP来暴露服务;

  • NodePort:Service通过Node上的某个端口来暴露服务;

  • LoadBalancer:Service通过具体云厂商提供的负载均衡器来暴露服务;

  • ExternalName:Service仅对外暴露一个域名;

查看Pod 拓扑

尽管Service会通过selector来查找Pod,但查找到的Pod信息并不直接记录到Service对象中,而是记录到一个Endpoints对象中,进一步说当创建Service对象时,Kubernetes还会创建一个同名的Endpoints对象,来记录后端的Pod拓扑。 关于Endpoints,我们会在后续的章节中详细介绍,此处仅做初步介绍。

查看随Service一并创建的Endpoints对象:

[root@ecs-d8b6 manifests]# kubectl get endpoints nginx-service 
NAME            ENDPOINTS                                   AGE
nginx-service   172.17.0.4:80,172.17.0.5:80,172.17.0.6:80   20m

可以看到,该Endpoints对象记录了Service匹配到的所有Pod地址。

访问Service

在集群内部,可以直接访问Service的Cluster IP,流量将会被自动转发到后端的某个Pod中:

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

更新

当更新Service的spec.selector时,Kubernetes会自动按照新的spec.selector配置查找Pod,并更新Endpoints对象。

使用kubectl edit service nginx-service命令来修改Service,并指定一个无法匹配到任何Pod的spec.selector,可以看到 Endpoints对象中的Pod拓扑信息也会相应地消失掉,如下所示:

[root@ecs-d8b6 manifests]# kubectl get endpoints nginx-service 
NAME            ENDPOINTS   AGE
nginx-service   <none>      31m

删除

当删除Service对象时,随Service对象创建而自动创建的Endpoints对象也会一并删除,后端的Pod不会被删除,它仍然受相应的Pod控制器管理。

[root@ecs-d8b6 manifests]# kubectl delete service nginx-service 
service "nginx-service" deleted
[root@ecs-d8b6 manifests]# kubectl get endpoints nginx-service
Error from server (NotFound): endpoints "nginx-service" not found
[root@ecs-d8b6 manifests]# kubectl get pods 
NAME                               READY   STATUS    RESTARTS   AGE
nginx-deployment-5f67bd6bb-9nspj   1/1     Running   0          37m
nginx-deployment-5f67bd6bb-hl8xw   1/1     Running   0          37m
nginx-deployment-5f67bd6bb-pkv7h   1/1     Running   0          37m
上一页4.1.1 Service概述下一页[第六章:配置管理]

最后更新于4年前

这有帮助吗?