service的概念

kubernetes service定义了一个抽象概念,一个pod的逻辑分组,一种可以访问的策略---通常称为服务。这组pod能够被service访问到,通常通过label selector

service能够提供负载均衡能力,但是在使用上有限制:

  只能提供四种负载能力,而没有7层功能。但有时我们需要更多匹配规则来转发请求,这点上4层负载均衡是不支持的

service类型

Service在K8s中有以下四种类型:

Cluster:默认类型,自动分配一个仅 Cluster内部可以访问的虚拟IP

Nodeport:在 Cluster基础上为 Service在每台机器上绑定一个端口,这样就可以通过: Nodeport来访问该服务

Loadbalancer:在 Nodeport的基础上,借助 cloud provider创建一个外部负载均衡器,并将请求转发到: Nodeport

Externalname:把集群外部的服务引入到集群内部来,在集群内部直接使用。没有任何类型代理被创建这只有 kubernetes1.7或更高版本的kube-dns才支持

VIP和 Service代理

在 Kubernetes集群中,每个Node运行一个kube- proxy进程。 kube-proxy负责为 Service实现了ー种VIP(虚拟IP)的形式,而不是 Externalname的形式。在 Kubernetes v1.版本,代理完全在 userspace。在Kubernetes v1.1版本,新増了 iptables代理,但并不是默认的运行模式。从 Kubernetes v1.2起,默认就是iptables代理。

在 Kubernetes v1.8.0-beta.0中,添加了ipvs代理

在 Kubernetes1.14版本开始默认使用ipvs代理

在 Kubernetes v1.0版本, Service是“4层"(TCP/ UDP over P)概念。在 Kubernetes v'1.1版本,新増了gressAP(beta版),用来表示“7层"(HTTP)服务

代理模式分类

1.username模式

 2.iptables

 3.ipvs

这种模式, kube-proxy会监视 Kubernetes service对象和 Endpoints,调用 netlink接口以相应地创建ipvs规则并定期与 Kubernetes Service对象和 Endpoints对象同步ipvs规则,以确保ipvs状态与期望一致。访问服务时,流量将被重定向到其中一个后端Pod

与 iptables类似,ipvs于 netfilter的hook功能,但使用哈希表作为底层数据结构井在内梭空间中工作。这味着ipvs可以更快地重定向流量,并且在同步代理规则旳具有更好的性能。

此外,ipvs为贠載均衡算法提供了更多选项,例如

rr:轮询调度

lc:最小连接数

dh:目标哈希

sh:源哈希

ed:最短期延迟

nq:不排队调度

ClusterIP

ClusterIP主要在每个node使用iptables将发向 clusterIP对应端口的数据,转发到kube- proxy中。然后kube- proxy自己内部实现有负載均衡的方法,并可以查询到这个 service下对应pod的地址和端口,进而把数据转发给对应的pod的地址和端口

为了实现图上的功能,主要需要以下几个组件的协同工作:

api-server 用户通过 kubectl命令向 aipserver发送创建 service的命令, apiserver接收到请求后将数据存储到etcd中

kube- proxy kubernetesl的每个节点中都有一个叫做kube- porxy的进程,这个进程负责感知 service,pod的变化,并将变化的信息写入本地的 iptables规则中

iptables使用NAT等技术将 virtualIP的流量转至 endpoint中

创建 myapp- deploy.yaml文件

service:myapp-service.yaml

$ ipvsadm -Ln //产看也是关系

Headless Service

有时不需要或不想要负载均衡,以及单独的 Service IP。遇到这种情况,可以通过指定 ClusterIP(spec.clusterIP)的值为"None"来创建 Headless Service。这类 Service并不会分配 Cluster IP.kube-proxy不会处理它们,而且平台也不会为它们进行负载均衡和路由

Nodeport

nodeport的原理在于在node上开了一个端口,将向该端口的流量导入到 kube-proxy,然后由 kube-proxy进一步到给对应的pod

查询流程:

Load Balancer

Load Balancer和 nodePort其实是同一种式。区别在于 loadBalancer比 nodeport多了一步,就是可以调用cloud provider去刨建LB来向节点导流

Externalname

这种类型的 Service通过返回 CNAME和它的值,可以将服务映射到 externalname字段的内容(例如xxxx.com)。Externalname Service是Service的持例,它没有selector,也没有定义任何的端口和Endpoint。相反的,对于运行在集群外部的服务,它通过返回该外部务的别名这种方式来提供服务

当查询主机my- service. defalut.svc. cluster. local( SVC NAMSPACE.svc cluste)时,集群的DNS服务将返回一个值my.database.example.com的CNAME记录。访问这个服务的工作方式和其他的相同,唯一不同的是重定向发生在DNS层。而且不会进行代理戓转发

k8s Service学习的更多相关文章

  1. ASP.NET Core on K8S 入门学习系列文章目录

    一.关于这个系列 自从2018年底离开工作了3年的M公司加入X公司之后,开始了ASP.NET Core的实践,包括微服务架构与容器化等等.我们的实践是渐进的,当我们的微服务数量到了一定值时,发现运维工 ...

  2. Web Service学习笔记:动态调用WebService

    原文:Web Service学习笔记:动态调用WebService 多数时候我们通过 "添加 Web 引用..." 创建客户端代理类的方式调用WebService,但在某些情况下我 ...

  3. ASP.NET Core on K8S深入学习(7)Dashboard知多少

    本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章. 在第二篇<部署过程解析与Dashboard>中介绍了如何部署Das ...

  4. 使用nginx 正向代理暴露k8s service && pod ip 外部直接访问

    有时在我们的实际开发中我们希望直接访问k8s service 暴露的服务,以及pod的ip 解决方法,实际上很多 nodeport ingress port-forword 实际上我们还有一种方法:正 ...

  5. k8s service对象

    k8s service对象   概述 service服务也是Kubernetes里核心字眼对象之一,Kubernetes里的每一个service其实就是我们经常提起的微服务架构中的一个微服务,之前讲解 ...

  6. k8s service NodePort 方式向外发布

    k8s service NodePort 方式向外发布 k8s 无头service 方式向内发布 k8s service 服务发现 {ServiceName}.{Namespace}.svc.{Clu ...

  7. ASP.NET Core on K8S深入学习(4)你必须知道的Service

    本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章. 前面几篇文章我们都是使用的ClusterIP供集群内部访问,每个Pod都有一个 ...

  8. Kubernetes系列之理解K8s Service的几种模式

    今天给大家介绍下k8s的service的几种访问模式. 概述 我们知道pod的ip不是固定的,是根据所在宿主机的docker0网卡生成的,每次重启,更新,调度等情况IP都会变,那pod与pod之间需要 ...

  9. ASP.NET Core on K8S深入学习(1)K8S基础知识与集群搭建

    在上一个小系列文章<ASP.NET Core on K8S学习初探>中,通过在Windows上通过Docker for Windows搭建了一个单节点的K8S环境,并初步尝试将ASP.NE ...

随机推荐

  1. 「每天五分钟,玩转 JVM」:对象访问定位

    前言 在「对象内存布局」一节中,我们了解到对象头中包含了一个叫做类型指针的东西,即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例.但是,并不是所有的虚拟机都是这么去做的.不 ...

  2. Vulnhub靶场 DC-2 WP

    DC-2简介 描述 与DC-1一样,DC-2是另一个专门构建的易受攻击的实验室,目的是获得渗透测试领域的经验. 与原始DC-1一样,它在设计时就考虑了初学者. 必须具备Linux技能并熟悉Linux命 ...

  3. STM8L152的EEPROM读写(使用固件库)

    STM8L系列单片机内置1K字节的EEPROM,使用起来很方便. EEPROM的地址为: 使用1.6.1的固件库 void EEPROM_Write_Byte(uint16_t Addr,uint8_ ...

  4. 干货系列之java注解

    干货系列之java注解 前言 java反射和注解在java里面很重要,但是很多人对这方面的知识理解不是很好,我来说说我自己对java反射和注解的理解,这两块内容本来应该出在一个博客文章里面讲解,但是由 ...

  5. 一些js 概念 整理

    1.原型链 prototype       这个属性 是一个指针,指向一个对象 这个对象 包含 所有实例共享的属性和方法,即这个原型对象是用来给实例共享属性和方法的.          而每个实例内部 ...

  6. Springboot学习笔记【持续更新】

    1.Springboot四大核心: 自动配置 与Spring应用程序和常见的应用功能,Springboot能自动提供相关配置 起步依赖 告诉Springboot需要什么功能,它就能引入需要的依赖库 A ...

  7. Building Applications with Force.com and VisualForce(Dev401)( 八):Designing Applications for Multiple users:Managing your users' experience II

    Dev 401-008: Design Applications for Multiple Users' Experience Part 2Universal Containers Scenario1 ...

  8. TensorFlow 卷积神经网络手写数字识别数据集介绍

    欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识! 手写数字识别 接下来将会以 MNIST 数据集为例,使用卷积层和池 ...

  9. js 的 new 干了什么

  10. Python学习笔记:String类型所有方法汇总

    # 按字母表熟悉下string中的方法# A B C D E F G H I J K L M N O P Q R S T U V W X Y Z# 标红的为常用重点的方法!! str = " ...