10.Service资源发现
Kubernetes Pods是不可控的
。每当一个pod停止后,他不是重启,而是重建。ReplicaSets
特别是Pods
动态地创建和销毁(例如,当向外扩展或向内扩展时)。虽然每个Pod
IP地址都有自己的IP地址,但即使这些IP地址也不能依赖它们保持稳定。这会导致一个问题:如果某些Pods
(让我们称之为后端)Pods
在Kubernetes集群内向其他人(让我们称之为前端)提供功能,那些前端如何找出并跟踪该集合中的哪些后端?
依靠Service
Kubernetes Service
是一个抽象,它定义了一个逻辑集Pods
和一个访问它们的策略 - 有时称为微服务。Pods
a 的目标集合Service
(通常)由标签选择器选中的一组Pod。
例如,考虑一个运行3个副本的图像处理后端。那些复制品是可替代的 - 前端并不关心它们使用哪个后端。虽然Pods
组成后端集的实际情况可能会发生变化,但前端客户端不应该知道这一点,也不需要跟踪后端列表本身。该Service
抽象可实现这种分离。
对于Kubernetes本地应用程序,Kubernetes提供了一个简单的Endpoints
被更新的API,每当一组Pods
中Service
的变化。对于非本机应用程序,Kubernetes提供了一个基于虚拟IP的桥接服务,可以重定向到后端Pods
。
定义服务
Service
在Kubernetes是一个REST对象,类似于Pod
。与所有REST对象一样,Service
可以将定义POST到apiserver以创建新实例。例如,假设您有一组Pods
每个公开端口9376并带有标签"app=MyApp"
。
kind: Service
apiVersion: v1
metadata:
name: my-service
spec:
selector:
app: MyApp
ports:
- protocol: TCP
port:
targetPort:
此规范将创建一个Service
名为“my-service” 的新对象,该对象以任何Pod
带有"app=MyApp"
标签的TCP端口9376为目标。这Service
也将被分配一个IP地址(有时称为“ClusterIP”),由服务代理使用。本Service
的选择将不断进行评估,其结果将被张贴到一个Endpoints
还名为‘我的服务’的对象。
请注意,Service
可以将传入端口映射到任何端口targetPort
。默认情况下,targetPort
将设置为与port
字段相同的值。也许更有趣的是,它targetPort
可以是一个字符串,指的是后端端口的名称Pods
。分配给该名称的实际端口号在每个后端可以不同Pod
。这为您的部署和发展提供了很大的灵活性Services
。例如,您可以更改pod在下一版本的后端软件中公开的端口号,而不会破坏客户端。
注意: SCTP支持是自Kubernetes 1.12以来的alpha功能
没有选择器的服务
服务通常抽象访问Kubernetes Pods
,但它们也可以抽象其他类型的后端。例如:
- 您希望在生产中拥有外部数据库集群,但在测试中您使用自己的数据库。
- 您希望将服务指向另一个
Namespace
或另一个群集上的服务 。 - 您正在将工作负载迁移到Kubernetes,并且您的一些后端在Kubernetes之外运行。
在任何这些场景中,您都可以定义不带选择器的服务:
kind: Service
apiVersion: v1
metadata:
name: my-service
spec:
ports:
- protocol: TCP
port: 80
targetPort: 9376
由于此服务没有选择器,因此Endpoints
不会创建相应的对象。您可以手动将服务映射到您自己的特定端点:
kind: Endpoints
apiVersion: v1
metadata:
name: my-service
subsets:
- addresses:
- ip: 1.2.3.4
ports:
- port: 9376
注意:端点IP可能不是环回(127.0.0.0/8),链路本地(169.254.0.0/16)或链路本地多播(224.0.0.0/24)。它们不能是其他Kubernetes服务的集群IP,因为该kube-proxy
组件尚不支持虚拟IP作为目标。
访问Service
没有选择器的方法与具有选择器的方式相同。流量将路由到用户定义的端点(1.2.3.4:9376
在此示例中)。
ExternalName服务是一种特殊情况的服务,它没有选择器而是使用DNS名称。有关详细信息,请参阅本文档后面的 ExternalName部分。
虚拟IP和服务代理
Kubernetes集群中的每个节点都运行一个kube-proxy
。kube-proxy
负责实现Services
除以外类型的虚拟IP形式ExternalName
。
在Kubernetes v1.0中,Services
是一个“第4层”(TCP / UDP over IP)构造,代理纯粹在用户空间。在Kubernetes v1.1中,Ingress
添加了API(beta)来表示“第7层”(HTTP)服务,也添加了iptables代理,并成为自Kubernetes v1.2以来的默认操作模式。在Kubernetes v1.8.0-beta.0中,添加了ipvs代理。
代理模式:用户空间
在这种模式下,KUBE代理手表的添加和去除Kubernetes主Service
和Endpoints
对象。对于每个Service
它,它在本地节点上打开一个端口(随机选择)。与此“代理端口”的任何连接都将代理到其中一个Service
后端Pods
(如报告中所述 Endpoints
)。使用哪个后端Pod
是基于 SessionAffinity
的Service
。最后,它安装的防火墙规则,其捕获流量的Service
的clusterIP
(这是虚拟的),并Port
和重定向的流量到代理服务器与后端的代理端口Pod
。默认情况下,后端的选择是循环
代理模式:iptables
在这种模式下,KUBE代理手表的添加和去除Kubernetes主Service
和Endpoints
对象。对于每一个Service
,它安装的防火墙规则,其捕获业务到Service
的clusterIP
(这是虚拟的)和Port
与该通信重定向到的一个Service
的后端集。对于每个Endpoints
对象,它会安装选择后端的iptables规则Pod
。默认情况下,后端的选择是随机的。
显然,iptables不需要在用户空间和内核空间之间切换,它应该比用户空间代理更快,更可靠。但是,与用户空间proxier不同,如果iptables proxier Pod
最初选择的那个没有响应,则它不能自动重试另一个 ,因此它取决于具有工作就绪探测器
代理模式:ipvs
Kubernetes v1.9
公测在此模式下,kube-proxy监视Kubernetes服务和端点,调用netlink
接口以相应地创建ipvs规则并定期与Kubernetes服务和端点同步ipvs规则,以确保ipvs状态与期望一致。访问服务时,流量将被重定向到其中一个后端Pod。
与iptables类似,Ipvs基于netfilter钩子函数,但使用哈希表作为底层数据结构并在内核空间中工作。这意味着ipvs可以更快地重定向流量,并且在同步代理规则时具有更好的性能。此外,ipvs为负载均衡算法提供了更多选项,例如:rr 轮询 lc 最少连接 nq 没有队列 sha 源哈希 dha目标哈希 sed(最少时间)
多端口服务
许多人Services
需要暴露多个端口。对于这种情况,Kubernetes支持Service
对象的多个端口定义。使用多个端口时,必须提供所有端口名称,以便可以消除端点的歧义。例如:
kind: Service
apiVersion: v1
metadata:
name: my-service
spec:
selector:
app: MyApp
ports:
- name: http
protocol: TCP
port:
targetPort:
- name: https
protocol: TCP
port:
targetPort:
请注意,端口名称只能包含小写字母数字字符-
,并且必须以字母数字字符开头和结尾。123-abc
并且web
是有效的,但123_abc
并-web
不能有效名称。
发现服务
两种方式一个实在pod的镜像模板中指出Service的具体地址
REDIS_MASTER_SERVICE_HOST=10.0.0.11
REDIS_MASTER_SERVICE_PORT=
REDIS_MASTER_PORT=tcp://10.0.0.11:6379
REDIS_MASTER_PORT_6379_TCP=tcp://10.0.0.11:6379
REDIS_MASTER_PORT_6379_TCP_PROTO=tcp
REDIS_MASTER_PORT_6379_TCP_PORT=
REDIS_MASTER_PORT_6379_TCP_ADDR=10.0.0.11
另一种是采用DNS解析方式
Serviename+namespace+集群默认域 通常为 svc.cluster.local.
发布服务 - 服务类型
对于应用程序的某些部分(例如前端),您可能希望将服务公开到外部(群集外部)IP地址。
Kubernetes ServiceTypes
允许您指定所需的服务类型。默认是ClusterIP
。
Type
价值观及其行为是:
ClusterIP
:在集群内部IP上公开服务。选择此值使服务只能从群集中访问。这是默认值ServiceType
。NodePort
:在静态端口(NodePort
)上公开每个节点IP上的服务。一个ClusterIP
服务,该NodePort
服务将路由,自动创建。您可以NodePort
通过请求从群集外部联系服务<NodeIP>:<NodePort>
。LoadBalancer
:使用云提供商的负载均衡器在外部公开服务。NodePort
和ClusterIP
服务,其外部负载平衡器将路线,自动创建。ExternalName
:通过返回包含其值的记录,将服务映射到externalName
字段的内容 (例如foo.bar.example.com
)CNAME
。没有设置任何类型的代理。这需要1.7或更高版本kube-dns
10.Service资源发现的更多相关文章
- Kubernetes 学习10 Service资源
一.Service对应组件关系 1.在kubernetes平台之上,pod是有生命周期的,所以为了能够给对应的客户端提供一个固定的访问端点,因此我们在客户端和服务Pod之间添加一个固定的中间层,这个中 ...
- (七)Kubernetes Service资源
Service概述 为什么要使用Service Kubernetes Pod是平凡的,由Deployment等控制器管理的Pod对象都是有生命周期的,它们会被创建,也会意外挂掉.虽然它们可以由控制器自 ...
- 10.service 详解
10.service 详解 什么是service:Kubernetes中的Service 是一个抽象的概念,它定义了Pod的逻辑分组和一种可以访问它们的策略,这组Pod能被Service访问,使用YA ...
- service资源
service的作用:帮助外界用户访问k8s内的服务,并且提供负载均衡 创建一个service vim k8s_svc.yml apiVersion: v1 kind: Service metadat ...
- 容器编排系统k8s之Service资源
前文我们了解了k8s上的DemonSet.Job和CronJob控制器的相关话题,回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/14157306.html:今 ...
- service自动发现,yaml文件管理内外部端口访问
service服务发现 [root@k8s-master ~]# vim busybox-5d4f595646-dzjv4.yaml apiVersion: v1 kind: Pod metadata ...
- 背水一战 Windows 10 (11) - 资源: CustomResource, ResourceDictionary, 加载外部的 ResourceDictionary 文件
[源码下载] 背水一战 Windows 10 (11) - 资源: CustomResource, ResourceDictionary, 加载外部的 ResourceDictionary 文件 作者 ...
- 背水一战 Windows 10 (9) - 资源: 资源限定符概述, 资源限定符示例
[源码下载] 背水一战 Windows 10 (9) - 资源: 资源限定符概述, 资源限定符示例 作者:webabcd 介绍背水一战 Windows 10 之 资源 资源限定符概述 资源限定符示例 ...
- [置顶] Oracle 11g R2 RAC:使用 srvctl 工具管理 service 资源
1.使用 srvctl 工具创建 service 资源 srvctl add service -d db_unique_name -s service_name {-r "preferred ...
随机推荐
- 使用ssh登录kali
SSH为Secure Shell的缩写,SSH为建立在应用层基础上的安全协议.SSH是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议.利用SSH协议可以有效防止远程管理过程中的信息泄露问题 ...
- BZOJ1061 NOI2008 志愿者招募 线性规划、费用流
传送门 一道思路很妙的线性规划网络流 设\(X_i\)表示第\(i\)天需要的人数,\(P_i\)表示第\(i\)种人雇佣的个数 那么我们可以列出一系列式子 比如说样例就可以列出三个式子: \(P_1 ...
- Windows 10 配置Linux及安装Docker
https://baijiahao.baidu.com/s?id=1607159570058814753&wfr=spider&for=pc https://blog.csdn.net ...
- Django Restframework 过滤器
一.基本配置: 1.安装:pip install django-filter 2.将 django_filters 配置到INSTALLED-APPS中 3.对 REST_FRAMEWORK 配置: ...
- VMware vSphere 6 序列号
vSphere 6 Hypervisor HY0XH-D508H-081U8-JA2GH-CCUM2 4C4WK-8KH8L-H85J0-UHCNK-8CKQ8 NV09R-2W007-08D38-C ...
- PHP api接口和SQL数据库关联
数据库表创建 服务器环境配置.连接 .操作.数据库 API接口 原则:
- Array Queries CodeForces - 797E
题目链接 非常好的一道题目, 分析,如果用暴力的话,时间复杂度是O(q*n)稳稳的超时 如果用二维DP的话,需要O (n*n)的空间复杂度,会爆空间. 那么分析一下,如果k>sqrt(n)的话, ...
- selenium模拟登陆淘宝
from selenium import webdriver import time from selenium.webdriver.common.by import By from selenium ...
- xmanager 乱码
xmanager连接后中文显示乱码 - 程序员CC - 博客园http://www.cnblogs.com/aomidata/p/3445075.html Xshell 为什么会出现中文乱码?-Xma ...
- 高阶组件 HOC
一. A higher-order component (HOC) is an advanced technique in React for reusing component logic. a h ...