Service是Kubernetes的核心资源类型之一,它通过规则定义出由多个Pod对象组合而成的逻辑集合,以及访问这组Pod的策略。
由Deployment等控制器管理的Pod对象在中断或扩缩容后,Pod组合的IP地址都会发生变化,而引入Service资源后,就可以基于标签选择器将一组Pod定义成一个逻辑组合,并通过自己的IP地址和端口调度代理请求至组内的Pod对象之上,它向客户端隐藏了真实的、处理用户请求的Pod资源,使得客户端的请求看上去就像是由Service直接处理并进行响应的一样。而且Service与Pod对象之间通过标签选择器以松耦合的方式关联,它可以先于Pod对象创建而不会发生错误。
Service资源基本的配置清单:
apiVersion: v1
kind: Service
metadata:
name: myapp-svc
spec:
selector:
app: myapp
ports:
- name: http
port: 80
targetPort: 80
protocol: TCP
Service资源myapp-svc通过标签选择器关联至标签为“app=myapp”的各Pod对象,它会自动创建名为myapp-svc的Endpoints资源对象,并自动配置一个ClusterIP,暴露的端口由port字段进行指定,后端各Pod对象的端口则由targetPort给出。
分别查看service和endpoint的状态:
kubectl get svc myapp-svc
kubectl get endpoints myapp-svc
Service资源的默认类型为ClusterIP,它仅能接收来自于集群中的Pod对象中的客户端程序的访问请求。所以为了测试,会创建一个专用的Pod对象,利用其交互式接口来访问service资源。
kubectl run cirros-$RANDOM --rm -it --image=cirros -- sh
启动了一个运行CirrOS容器的Pod,CirrOS是设计用来进行云计算环境测试的Linux微型发行版,它自带HTTP客户端工具curl等。
在容器的交互式接口访问ClusterIP:Port
/ # curl http://10.105.246.145:80
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
Kubernetes集群默认的Service代理模式为iptables,而且使用随机调度算法,因此Service会将客户端请求随机调度至与其关联的某个后端Pod资源上。
Service资源还支持Session affinity(会话粘性)机制,它能够将来自同一个客户端的请求始终转发至同一个后端的Pod对象,适用于需要基于客户端身份保存某些私有信息,并根据这些私有信息追踪用户的活动等一类的需求。
Service资源通过spec.sessionAffinity和spec.sessionAffinityConfig两个字段配置粘性会话:
但是Service资源的Session affinity机制仅能基于客户端IP地址识别客户端身份,它会把经由同一个NAT服务器进行源地址转换的所有客户端识别为同一个客户端,调度粒度粗糙且效果不佳,因此实践中并不推荐使用此种方法实现粘性会话。
Service为Pod中的服务类应用提供了一个稳定的访问入口,但Pod客户端中的应用如何得知某个特定Service资源的IP和端口呢,这就需要借助服务发现机制来进行。
服务发现机制的基本实现,一般是事先部署好一个网络位置较为稳定的服务注册中心(也称为服务总线),服务提供者(服务端)向注册中心注册自己的位置信息,并在变动后及时予以更新,服务消费者则周期性地从注册中心获取服务提供者的最新位置信息从而“发现”要访问的目标服务资源。
在K8S中可以基于CoreDNS进行服务发现,甚至也可以使用简单的环境变量方式。
Service的IP地址默认仅在集群内可达,集群外部想访问服务,需要首先进行服务的暴露。
Service有四种类似ClusterIP、NodePort、LoadBalancer和ExternalName
NodePort型的Service资源,其配置清单与前面默认的ClusterIP类型类似,只是要显式地在spec下指定type: NodePort
此外还可以指定Node端口,但必须在30000-32767之间,而且推荐使用集群自动分配的端口以避免端口的冲突。
NodePort类型的Service资源虽然能够于集群外部访问得到,但外部客户端必须得事先得知NodePort和集群中至少一个节点的IP地址,且选定的节点发生故障时,客户端还得自行选择请求访问其他的节点,此外有时节点并不允许外界访问,LoadBalancer类型可将请求流量调度至各节点的NodePort之上。
创建LoadBalancer类型需要指定type: LoadBalancer,
ExternalName类型的Service资源用于将集群外部的服务发布到集群中以供Pod中的应用程序访问。需要指定type: ExternalName和externalName,比如externalName: redis.ilinux.io,externalName属性定义了一个CNAME记录用于返回外部真正提供服务的主机的别名,而后通过CNAME记录值获取到相关主机的IP地址。
spec:
type: ExternalName
externalName: redis.ilinux.io
服务创建后通过serviceName访问相应的服务,ClusterDNS会将此名称以CNAME格式解析为spec.externalName字段中的名称,而后通过DNS服务将其解析为相应的主机的IP地址。
在Kubernetes中,Service资源和Pod资源的IP地址仅能用于集群网络内部的通信,所有的网络流量都无法穿透边界路由器以实现集群内外通信。Kubernetes提供了两种内建的云端负载均衡机制(cloud loadbalancing)用于发布公共应用:
Ingress是Kubernetes API的标准资源类型之一,它其实就是一组基于DNS名称(host)或URL路径把请求转发至指定的Service资源的规则,用于将集群外部的请求流量转发至集群内部完成服务发布,它仅是一组路由规则的集合,Ingress控制器根据这些规则来匹配并路由请求流量。
Ingress资源是基于HTTP虚拟主机或URL的转发规则。Ingress资源的定义方式举例:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: www.ilinux.io
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: myapp-svc
port:
number: 80
spec字段下主要嵌套如下三个字段
暴露单个Service的方法可以使用NodePort、LoadBalancer,也可以使用Ingress来暴露服务,只需要为Ingress指定“default backend”,这样Ingress控制器会为其分配一个IP地址接入请求流量,并将它们转至指定的后段service,如:
spec:
backend:
serviceName: my-svc
servicePort: 80
Ingress也支持基于URL路径进行流量分发,如:
spec:
rules:
- host: www.ilinux.io
http:
paths:
- path: /web
backend:
service:
name: myapp-svc-web
port:
number: 80
- path: /api
backend:
service:
name: myapp-svc-api
port:
number: 80
上面定义的规则会将对www.ilinux.io/web的请求转发到前端service myapp-svc-web,而将www.ilinux.io/api请求转发到后段service myapp-svc-api。
如果服务按照域名进行划分,可以将Ingress基于虚拟主机定义如下:
spec:
rules:
- host: web.ilinux.io
...
- host: api.ilinux.io
如果需要以HTTPS发布Service资源,也可以配置TLS协议的Ingress资源,但需要基于一个含有私钥和证书的Secret对象,这在后面的章节会涉及到,在Ingress资源中引用此Secret即可让Ingress控制器加载并配置为HTTPS服务:
spec:
tls:
- secretName: ilinuxSecret
backend:
...
Ingress控制器自身是运行于Pod中的容器应用,一般是Nginx或Envoy一类的具有代理及负载均衡功能的守护进程,它监视着来自于API Server的Ingress对象状态,并以其规则生成相应的应用程序专有格式的配置文件并通过重载或重启守护进程而使新配置生效。例如,对于Nginx来说,Ingress规则需要转换为Nginx的配置信息。
既然Ingress控制器实际上也是Pod资源,那么也需要接入外部流量,这可以使用NodePort或LoadBalancer类型的Service对象为其接入集群外部的请求流量;或者借助于DaemonSet控制器,将Ingress控制器的Pod资源各自以单一实例的方式运行于集群的所有或部分工作节点之上,并配置这类Pod对象以hostPort或hostNetwork的方式在当前节点接入外部流量。
以部署ingress-nginx并通过专用的Service接入流量为例:
首先apply在线的mandatory.yaml来部署ingress-nginx所需的全部资源,它们的namespace:为ingress-nginx:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.24.1/deploy/mandatory.yaml
然后定义专用的NodePort型Service资源,注意其selector要与nginx-ingress-controller的selector保持一致:
apiVersion: v1
kind: Service
metadata:
name: ingress-nginx-controller
namespace: ingress-nginx
spec:
type: NodePort
selector:
app.kubernetes.io/name: ingress-nginx
ports:
- port: 80
name: http
nodePort: 30080
- port: 443
name: https
nodePort: 30443
然后就可以通过这个NodePort型Serviced的IP:30002访问了。或者也可以根据ingress指定的host名称配置etc/hosts,比如对于如下的ingress配置:
spec:
rules:
- host: tomcat.ilinux.io
sudo vim /etc/hosts,添加一行
127.0.0.1 tomcat.ilinux.io
然后也就可以通过tomcat.ilinux.io:30002访问了。
《Kubernetes实战进阶》 马永亮著
目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visitthehelpcenter.关闭9年前。我需要从基于ruby的应用程序使用AmazonSimpleNotificationService,但不知道从哪里开始。您对从哪里开始有什么建议吗?
写在之前Shader变体、Shader属性定义技巧、自定义材质面板,这三个知识点任何一个单拿出来都是一套知识体系,不能一概而论,本文章目的在于将学习和实际工作中遇见的问题进行总结,类似于网络笔记之用,方便后续回顾查看,如有以偏概全、不祥不尽之处,还望海涵。1、Shader变体先看一段代码......Properties{ [KeywordEnum(on,off)]USL_USE_COL("IsUseColorMixTex?",int)=0 [Toggle(IS_RED_ON)]_IsRed("IsRed?",int)=0}......//中间省略,后续会有完整代码 #pragmamulti_c
TCL脚本语言简介•TCL(ToolCommandLanguage)是一种解释执行的脚本语言(ScriptingLanguage),它提供了通用的编程能力:支持变量、过程和控制结构;同时TCL还拥有一个功能强大的固有的核心命令集。TCL经常被用于快速原型开发,脚本编程,GUI和测试等方面。•实际上包含了两个部分:一个语言和一个库。首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些互交程序如文本编辑器、调试器和shell。由于TCL的解释器是用C\C++语言的过程库实现的,因此在某种意义上我们又可以把TCL看作C库,这个库中有丰富的用于扩展TCL命令的C\C++过程和函数,所以,Tcl是
我正在按照我一直在研究的研讨会实现“服务对象”,我正在构建一个redditAPI应用程序。我需要对象返回一些东西,所以我不能只执行初始化程序中的所有内容。我有这两个选择:选项1:类需要实例化classSubListFromUserdefuser_subscribed_subs(client)@client=client@subreddits=sort_subs_by_name(user_subs_from_reddit)endprivatedefsort_subs_by_name(subreddits)subreddits.sort_by{|sr|sr[:name].downcase}
TCP是面向连接的协议,连接的建立和释放是每一次面向连接的通信中必不可少的过程。TCP连接的管理就是使连接的建立和释放都能正常地进行。三次握手TCP连接的建立—三次握手建立TCP连接①若主机A中运行了一个客户进程,当它需要主机B的服务时,就发起TCP连接请求,并在所发送的分段中用SYN=1表示连接请求,并产生一个随机发送序号x,如果连接成功,A将以x作为其发送序号的初始值:seq=x。主机B收到A的连接请求报文,就完成了第一次握手。客户端发送SYN=1表示连接请求客户端发送一个随机发送序号x,如果连接成功,A将以x作为其发送序号的初始值:seq=x②主机B如果同意建立连接,则向主机A发送确认报
我有一个关于配置elasticsearch以连接AWSelasticsearch服务以在生产环境中运行项目的问题。我的gem文件:gem'searchkick'gem'faraday_middleware-aws-signers-v4'gem'aws-sdk','~>2'gem"elasticsearch",">=1.0.15"引用:https://github.com/ankane/searchkick我的config/initializers/elasticsearch.rb文件:require"faraday_middleware/aws_signers_v4"ENV["ELAS
VXLAN简介定义RFC定义了VLAN扩展方案VXLAN(VirtualeXtensibleLocalAreaNetwork,虚拟扩展局域网)。VXLAN采用MACinUDP(UserDatagramProtocol)封装方式,是NVO3(NetworkVirtualizationoverLayer3)中的一种网络虚拟化技术。目的随着网络技术的发展,云计算凭借其在系统利用率高、人力/管理成本低、灵活性/可扩展性强等方面表现出的优势,已经成为目前企业IT建设的新趋势。而服务器虚拟化作为云计算的核心技术之一,得到了越来越多的应用。服务器虚拟化技术的广泛部署,极大地增加了数据中心的计算密度;同时,为
文章目录一.搭建集群时出现错误错误日志elasticsearch.logorg.elasticsearch.cluster.block.clusterblockexception:blockedby:[service_unavailable/1/statenotrecovered/initialized];原因:解决方案:一.搭建集群时出现错误错误日志elasticsearch.logorg.elasticsearch.cluster.block.clusterblockexception:blockedby:[service_unavailable/1/statenotrecovered/i
目录一、原理部分1、什么是串行通信(1)并行通信与串行通信(2)串行通信的制式(3)串行通信的主要方式 2、配置串口(1)SCON和PCON:串行口1的控制寄存器(2)SBUF:串行口数据缓冲寄存器 (3)AUXR:辅助寄存器编辑(4)ES、PS:与串行口1中断相关的寄存器(5)波特率设置 3、串口框架编写二、程序案例一、原理部分1、什么是串行通信(1)并行通信与串行通信微控制器与外部设备的数据通信,根据连线结构和传送方式的不同,可以分为两种:并行通信和串行通信。并行通信:数据的各位同时发送与接收,每个数据位使用一条导线,这种方式传输快,但是需要多条导线进行信号传输。串行通信:数据一位一