Kubernetes的Pod的寿命是有限的,它们不会复活,因此尽管每个Pod都有自己的IP地址,但是这些IP地址是不可靠的,会随着Pod的消亡而消失。

这就带来一个问题,如果一些Pod的集合(称之为backends)为集群的其他的Pod(称之为frontends),这些frontends应该如何找到并一直知道哪些backends在这样的集合中呢?

这就需要引入Service, 一个kubernetes的service是一种抽象,它定义了一个Pod的逻辑集合和一个用于访问它们的策略。一个Service的目标Pod的集合通常是由Label Selector来决定的。

举个例子,想象一个处理图片的后端运行了三个副本。这些副本都是可以替代的,前端不关心它们使用的是哪一个后端。尽管实际组成后端集合的Pod可能会变化,前端的客户端却不需要知道这个变化,也不需要自己有一个列表来记录这些后端服务。Service抽象能让你达到这种解耦。

对于那些Kubernetes原生的应用,Kubernetes提供了一个简单的Endpoints API,会在Service中的Pod集合发生改变的时候更新。对于非Kubernetes原生的应用,Kubernetes为Service提供了一种基于虚拟IP的桥接方式使其重定向到后端的Pods。

定义一个Service

Kubernetes中的Service是一个REST对象,这点与Pod类似。正如所有的REST对象一样,向apiserver POST一个Service的定义就能创建一个新的实例。例如,假设你有一组Pods,每一个Pod都开放了9376端口,并且都有一个"app=MyApp"的标签。

{"kind": "Service","apiVersion": "v1","metadata": {"name": "my-service"},"spec": {"selector": {"app": "MyApp"},"ports": [{"protocol": "TCP","port": 80,"targetPort": 9376}]}
}

这个定义会创建一个新的Service对象,名字为”my-service”,它指向所有带有”app=MyApp”标签的Pod上面的9376端口。这个Service同时也会被分配一个IP地址(有时被称作”cluster ip”),它会被服务的代理所使用(见下面)。这个Service的选择器,会不断的对Pod进行筛选,并将结果POST到名字同样为“my-service”的Endpoints对象。

注意一个Service能将一个来源的端口映射到任意的targetPort。默认情况下,targetPort会被设置成与port字段一样的值。可能更有意思的地方在于,targetPort可以是一个字符串,能引用一个后端Pod中定义的端口名。实际指派给该名称的端口号在每一个Pod中可能会不同。这为部署和更新你的Service提供了很大的灵活性。例如,你可以在你的后端的下一个版本中更改开放的端口,而无需导致客户出现故障。

Kubernetes的Service支持TCP和UDP协议。默认是TCP。

发布 services - service的类型

Kubernetes的ServiceTypes能让你指定你想要哪一种服务。默认的和基础的是ClusterIP,这会开放一个服务可以在集群内部进行连接。NodePort 和LoadBalancer是两种会将服务开放给外部网络的类型。

ServiceType字段的合法值是:

ClusterIP: 仅仅使用一个集群内部的IP地址 - 这是默认值。选择这个值意味着你只想这个服务在集群内部才可以被访问到。

NodePort: 在集群内部IP的基础上,在集群的每一个节点的端口上开放这个服务。你可以在任意<NodeIP>:NodePort地址上访问到这个服务。

LoadBalancer: 在使用一个集群内部IP地址和在NodePort上开放一个服务之外,向云提供商申请一个负载均衡器,会让流量转发到这个在每个节点上以<NodeIP>:NodePort的形式开放的服务上。

在使用一个集群内部IP地址和在NodePort上开放一个Service的基础上,还可以向云提供者申请一个负载均衡器,将流量转发到已经以NodePort形式开发的Service上。

注意尽管NodePort可以是TCP或者UDP的,对于Kubernetes 1.0来说,LoadBalancer还支持TCP。

NodePort类型

如果你把type字段设置为"NodePort",Kubernetes的master就会从由启动参数配置的范围(默认是:30000-32767)中分配一个端口,然后每一个Node都会将这个端口(在每一个Node上相同的端口)代理到你的Service。这个端口会被写入你的Service的spec.ports[*].nodePort字段中。

如果你想要一个特定的端口号,你可以在nodePort字段中指定一个值,确保系统能为你分配这个端口,否则API请求将会失败(例如你需要自己处理可能出现的端口冲突)。你指定的值必须在节点端口配置的范围内。

这给了开发者了设置他们自己的负载均衡器的自由,配置那些没有被Kubernetes完全支持的云环境,或者甚至可以直接开放一个或者多个节点的IP。

这种Service可以同时以<NodeIP>:spec.ports[*].nodePort和spec.clusterIp:spec.ports[*].port的形式访问。

LoadBalancer类型

在那些支持外部负载均衡器的云提供者上面,将type字段设置为"LoadBalancer"会为你的Service设置好一个负载均衡器。该负载均衡器的实际的创建是异步进行的,并且该设置好均衡器会在该Service的status.loadBalancer字段中显示出来。例如:

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

从外部负载均衡器的流量将会被引到后端的Pod,然而具体这个如何实现则要看云提供商。一些云提供商允许指定loadBalancerIP。在这种场景,负载均衡器将随用户指定的loadBalancerIP一起创建。如果字段loadBalancerIP没有指定,该负载均衡器会被指定一个短暂性的IP。如果指定了loadBalancerIP,但是云提供商不支持这个特性,这个字段会被忽略。

转载于:https://www.cnblogs.com/yuxiaoba/p/9212280.html

【Kubernetes】Kubernetes的Service外部访问方式:NodePort和LoadBalancer相关推荐

  1. Kubernetes的Service外部访问方式:NodePort和LoadBalancer

    Kubernetes的Service外部访问方式:NodePort和LoadBalancer 关注公众号 风色年代(itfantasycc) 300G微服务资料等你拿! Kubernetes的Pod的 ...

  2. Kubernetes的三种外部访问方式:NodePort、LoadBalancer和Ingress

    Kubernetes的三种外部访问方式:NodePort.LoadBalancer和Ingress(转发) 原文 http://cloud.51cto.com/art/201804/570386.ht ...

  3. Kubernetes的三种集群外部访问方式及使用场景说明:NodePort、LoadBalancer和Ingress

    Kubernetes的三种外部访问方式:NodePort.LoadBalancer和Ingress 最近有些同学问我 NodePort,LoadBalancer 和 Ingress 之间的区别.它们都 ...

  4. k8s service:ClusterIP、NodePort、LoadBalancer、ExternalName

    ClusterIP Deployment.yaml service.yaml ipvsadm -Ln headless service dig需要安装bind-utils NodePort 30715 ...

  5. kubernetes网络:service,插件,策略,dns优化

    文章目录 网络插件 Flannel UDP vxlan host-gw calico提前简介 网络策略 安装 Calico NetworkPolicy 测试 Service 三种IP和四种端口 定义 ...

  6. kubernetes入门到精通(二):k8s部署Tomcat集群,基于NTFS协议的文件集群共享,Service提供负载均衡,端口转发工具Rinetd配置外部访问

    首先,配置 Docker 镜像加速服务 登录阿里云账号,进入控制台 -> 容器镜像服务 (不需要有阿里云的服务器,只要注册账号即可) 在两台 node 节点上配置好阿里云的镜像加速. 重启一下 ...

  7. 从外部访问Kubernetes集群中的应用

    https://zhaohuabing.com/2017/11/28/access-application-from-outside/ 前言 我们知道,kubernetes的Cluster Netwo ...

  8. Kubernetes(K8S)(六)——service(ClusterIP、NodePort、无头服务、LoadBalancer、ExternalName等)

    文章目录 1.Service介绍 2.开启kube-proxy的ipvs模式 3.创建service 3.1 ClusterIP 3.2 NodePort(可外部访问) 3.3 无头服务 3.4 Lo ...

  9. kubernetes(k8s)部署微服务并通过ingress实现外部访问

    1. 部署微服务 1.1 创建k8s命名空间 kubectl create namespace simple-microservice 1.2 资源脚本(ruoyi-server.yaml) apiV ...

最新文章

  1. Blender+Substance Painter全流程制作真实的机器人学习教程
  2. 网络安全与机器学习(二):网络安全任务如何结合机器学习?
  3. 收集一些好的技术文档
  4. 神经网络反向传播算法
  5. python matplotlib pyplot title_Matplotlib pyplot.title(字符串)返回
  6. 《C++面向对象高效编程(第2版)》——2.16 识别成员函数的目标对象
  7. js创建对象的几种方式
  8. 大话云时代rac_网易Q1财报中的增长信号:有道和云音乐如何打通“任督二脉”?...
  9. 美团回应“大数据杀熟”;Docker开发者预览版支持M1芯片;GTK 4.0发布|极客头条...
  10. 如何用python处理缺失值_用Python处理数据集中的缺失值
  11. 银河麒麟linux找不到网卡,银河麒麟(Ubuntu)无法上网问题的解决方法
  12. u深度重装系统详细教程_u深度u盘装系统教程|u深度怎么装系统详细步骤
  13. 华东理工c语言题库,华东理工大学c语言.doc
  14. opencv hsv(hsb)与hsl的区别
  15. qt5的configure选项说明(2)
  16. php导出复杂表头excel,js导出复杂表头(多级表头)的excel
  17. 简练网软考知识点整理-项目风险审计及风险评估
  18. 【JoJo的摄影笔记】相机分类新约
  19. 【转】2000国家大地控制网
  20. wdcp 如何创建用IP就可以访问的默认站点/修改默认站点

热门文章

  1. 配置nginx反向代理jira并实现https
  2. linux普通用户home目录锁定
  3. 四、垃圾收集之垃圾收集算法
  4. 为什么单片机程序中会有延时程序加入
  5. 【转】Redis安装整理(window平台和Linux平台)
  6. Windows Phone 7第一次亲密接触
  7. IDEA 2017 安装后 关联SVN
  8. Eclipse关联JDK源码
  9. SpringMVC一些功能
  10. TCP及IP报头及协议