系列目录

通过ReplicaSet来创建一组Pod来提供具有高可用性的服务。虽然每个Pod都会分配一个单独的Pod IP,然而却存在如下两问题:

  • Pod IP仅仅是集群内可见的虚拟IP,外部无法访问。

  • Pod IP会随着Pod的销毁而消失,当ReplicaSet对Pod进行动态伸缩时,Pod IP可能随时随地都会变化,这样对于我们访问这个服务带来了难度。

因此,Kubernetes中的Service对象就是解决以上问题的核心关键。

Service的创建

Service可以看作是一组提供相同服务的Pod对外的访问接口。借助Service,应用可以方便地实现服务发现和负载均衡

Service同其他Kubernetes对象一样,也是通过yaml或json文件进行定义。此外,它和其他Controller对象一样,通过Label Selector来确定一个Service将要使用哪些Pod。一个简单的Service定义如下:

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

下面简单分析一下上面的Service描述文件:

  • 通过spec.selector字段确定这个Service将要使用哪些Label。在本例中,这个名为nginx的Service,将会管理所有具有app: nginxLabel的Pod。

  • spec.ports.port: 80表明此Service将会监听80端口,并将所有监听到的请求转发给其管理的Pod。spec.ports.targetPort: 81表明此Service监听到的80端口的请求都会被转发给其管理的Pod的81端口,此字段可以省略,省略后其值会被设置为spec.ports.port的值。

  • type: ClusterIP表面此Service的type,会在下文中讲到。

Service的类型

在Serive定义时,我们需要指定spec.type字段,这个字段拥有四个选项:

  • ClusterIP。默认值。给这个Service分配一个Cluster IP,它是Kubernetes系统自动分配的虚拟IP,因此只能在集群内部访问。

  • NodePort将Service通过指定的Node上的端口暴露给外部。通过此方法,访问任意一个NodeIP:nodePort都将路由到ClusterIP,从而成功获得该服务。

  • LoadBalancer。在 NodePort 的基础上,借助 cloud provider 创建一个外部的负载均衡器,并将请求转发到 :NodePort。此模式只能在云服务器(AWS等)上使用。

  • ExternalName。将服务通过 DNS CNAME 记录方式转发到指定的域名(通过 spec.externlName 设定)。需要 kube-dns 版本在 1.7 以上。

注:kubernetes 1.13以后默认集群coreDns,不再使用默认kube-dns,对ExternalName支持情况需要进一步确认

NodePort类型

在定义Service时指定spec.type=NodePort,并指定spec.ports.nodePort的值,Kubernetes就会在集群中的每一个Node上打开你定义的这个端口,这样,就能够从外部通过任意一个NodeIP:nodePort访问到这个Service了。

下面是一个简单的例子:

apiVersion: v1
kind: Service
metadata:
name: nginx-service
labels:
run: nginx
spec:
selector:
app: nginx
ports:
- port: 80
nodePort: 30001
type: NodePort

假如有3个app: nginx Pod运行在3个不同的Node中,那么此时客户端访问任意一个Node的30001端口都能访问到这个nginx服务。

LoadBalancer类型

如果云服务商支持外接负载均衡器,则可以通过spec.type=LoadBalancer来定义Service,一个简单的例子如下:

kind: Service
apiVersion: v1
metadata:
name: my-service
spec:
selector:
app: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 9376
clusterIP: 10.0.171.239
loadBalancerIP: 78.11.24.19
type: LoadBalancer
status:
loadBalancer:
ingress:
- ip: 146.148.47.155

Service without selector

Service可以抽象访问Pod集群,同时 Service也可以抽象其他后端

  • 在生产环境中使用外部数据库,在测试环境中使用自己的数据库

  • 将自己的Service指向其他集群或者其他命名空间的Service

  • 迁移应用到k8s,但是还是有些应用运行在k8s之

通过定义不包含selector的Service实现

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

Service 没有Selector,K8s不会创建Endpoints,你可以通过手动创建Endpoint指向自己的endpoint

kind: Endpoints
apiVersion: v1
metadata:
name: my-service
subsets:
- addresses:
ip: 1.2.3.4
- ports:
port: 9376

Endpoint的IP不能是loopback(127.0.0.1/8),link-local(169.254.0.0/16), link-local

multicast (224.0.0.0/24).

访问不含有selector的Service和访问含有Selector的Service 方式一样,都会讲流向重定向的endpoint

其他命名空间的服务是一个特例,他不会定义ports和endpoint,他只是返回一个访问外部服务的别名

其它名称空间

其他命名空间的服务是一个特例,他不会定义ports和endpoint,他只是返回一个访问外部服务的别名

kind: kind
apiVersion: v1
metadata:
name: my-service
namespace: prod
spec:
type: ExternalName
externalName: my.database.example.com

当你访问服务my-service.prod.svc.CLUSTER时,cluster的dns服务会返回记录my.database.example.com 的CNAME,这个重定向是发生在dns解析阶段。

虚拟IP 和服务代理

代理

K8s集群内每个节点都会运行kube-proxy,负责实现服务的虚拟机IP(不是externalName)。1.0版本的代理模式在是userspace,1.1增加了iptables proxy,从1.2开始 iptables 代理是默认的模式

K8s 1.0的service是三层(TCP/UDP),从k8s1.1开始,增加了Ingress,实现七层(HTTP)服务

用户空间的代理模式

Kube-proxy监控k8s master节点来发现Service、Endpointd的增加和删除,对于Service,在本地打开一个随机端口作为代理端口,任何访问改代理端口的连接都会被指向Service对象的Pod集合,最终指向哪个Pod取决于Service的SessionAffinity,最后,他会配置iptables,捕获流向Service 的Cluster IP 和Port的连接,并重定向到这个代理端口。

最终结果,任何到Service Cluster Ip 和port的流量都会指向合适的Pod

默认情况下,都是轮训算法选择后端,也可以通过设置service.spec.sessionAffinity 为ClientIP,将选择算法改为Client-IP based session affinity

Iptables的代理模式

该模式与userspace模式类似,只是没有这个代理端口

比userspace方式更快更可靠,然后与userspace方式不同,当选择的pod异常时,该方式无法自动尝试选择其他Pod。

  • userspace模式只不适合大规模集群使用(数千个服务)

  • userspace模式隐藏了访问服务的源IP,iptables模式虽然没有隐藏源IP,但是也是通过负载均衡或者nodeport 影响了客户端输入

Kubernetes对象之Service的更多相关文章

  1. kubernetes系列08—service资源详解

    本文收录在容器技术学习系列文章总目录 1.认识service 1.1 为什么要使用service Kubernetes Pod 是有生命周期的,它们可以被创建,也可以被销毁,然而一旦被销毁生命就永远结 ...

  2. Kubernetes对象

    Kubernetes对象 在之前的文章已经讲到了很多Kubernets对象,包括pod,service,deployment等等.Kubernets对象是一种持久化,表示集群状态的实体.它是一种声明式 ...

  3. Kubernetes 对象管理的三种方式

    Kubernetes 中文文档 1. Kubernetes 对象管理的三种方式对比 Kubernetes 中的对象管理方式,根据对象配置信息的位置不同可以分为两大类: 命令式:对象的参数通过命令指定 ...

  4. Kubernetes K8S之Service服务详解与示例

    K8S之Service概述与代理说明,并详解所有的service服务类型与示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master Cent ...

  5. Kubernetes基础:Service

    本文的试验环境为CentOS 7.3,Kubernetes集群为1.11.2,安装步骤参见kubeadm安装kubernetes V1.11.1 集群 Service 介绍 我们通过Pod.Deplo ...

  6. Kubernetes对象之Pod

    系列目录 Pod是Kubernetes调度的最小单元.一个Pod可以包含一个或多个容器,因此它可以被看作是内部容器的逻辑宿主机.Pod的设计理念是为了支持多个容器在一个Pod中共享网络和文件系统 因此 ...

  7. kubernetes对象之Ingress

    系列目录 概述 向外网暴露集群内服务,以使客户端能够访问,有以下几种方法,本文重点描述Ingress. LoadBalancer LoadBalancer一般由云服务供应商提供或者用户自定义,运行在集 ...

  8. Kubernetes 学习10 Service资源

    一.Service对应组件关系 1.在kubernetes平台之上,pod是有生命周期的,所以为了能够给对应的客户端提供一个固定的访问端点,因此我们在客户端和服务Pod之间添加一个固定的中间层,这个中 ...

  9. Kubernetes里的Service是如何工作的

    Service是Kubernetes接入层的一种抽象资源,它为我们提供了一种固定的.统一的访问接口地址和负载均衡能力,这时可能会想到,当时使用docker-compose的时候,不存在Service概 ...

随机推荐

  1. 【bzoj4080】[Wf2014]Sensor Network 随机化

    题目描述 魔法炮来到了帝都,除了吃特色菜之外,还准备去尝一尝著名的北京烤鸭.帝都一共有n(1<=1<=100)个烤鸭店,可以看成是二维平面内的点.不过由于魔法炮在吃烤鸭之前没有带钱,所以吃 ...

  2. 【Luogu】P3224永无乡(splay)

    题目链接 splay模板,启发式合并(其实就是暴力插入)即可. 顺便吐槽时限,带垃圾回收而已……不至于最后一个点死活不让过吧? #include<cstdio> #include<c ...

  3. 关于sass和less做自适应网页的区别

    less 可以这么写  @r: 15rem;   body{margin-top:40/@r}; 但是sass这么写会报错 sass应该这么写 $r: 15; body{margin-top:40re ...

  4. 【bzoj4596】[Shoi2016]黑暗前的幻想乡 (矩阵树定理+容斥)

    Description 四年一度的幻想乡大选开始了,最近幻想乡最大的问题是很多来历不明的妖怪涌入了幻想乡,扰乱了幻想乡昔日的秩序.但是幻想乡的建制派妖怪(人类)博丽灵梦和八云紫等人整日高谈所有妖怪平等 ...

  5. 【CF1029A】Many Equal Substrings(模拟)

    题意:给定一个长度为n的串s,要求构造一个长度最小的使s出现了k次的串,可以重叠 n<=50,k<=50 思路:计算一下前后缀相同长度 #include<cstdio> #in ...

  6. 【BZOJ1036】树的统计Count(树链剖分,LCT)

    题意:一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u v: ...

  7. 转 整理 Linux服务器部署系列之一—Apache篇

    花了差不多一天,参考了几个博客,终于初步配成功了 Apache,先总结一下: 如果apache安装成为linux的服务的话,可以用以下命令操作: service httpd start 启动 serv ...

  8. Linux 之 文件搜索命令

    文件搜索命令 参考教程:[千峰教育] 文件搜索定位 grep: 作用:通用规则表达式分析程序,是一种强大的文本搜索工具, 它能使用正则表达式搜索文本,并把匹配的行打印出来. 格式:grep [选项] ...

  9. Codeforces 321D Ciel and Flipboard(结论题+枚举)

    题目链接   Ciel and Flipboard 题意  给出一个$n*n$的正方形,每个格子里有一个数,每次可以将一个大小为$x*x$的子正方形翻转 翻转的意义为该区域里的数都变成原来的相反数. ...

  10. "=="与equals的区别与联系

    "=="可作用于基本类型变量和引用类型变量: 1.当作用于基本类型变量时,比较的是变量的值是否相等. 2.当作用于引用变量时,比较的是该变量在内存中地址. "equals ...