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

640?wx_fmt=gif

本篇已加入《.NET Core on K8S学习实践系列文章索引》,可以点击查看更多容器化技术相关系列文章。

前面几篇文章我们都是使用的ClusterIP供集群内部访问,每个Pod都有一个自己的IP地址,那么问题来了:当控制器使用新的Pod替代发生故障的Pod时又或者增加新的副本Pod时,新Pod会分配到新的IP地址,那么想要对外提供服务时,客户端如何找到并访问这个服务?没关系,别抠脑壳了,本文介绍的Service就是解决方案,预计阅读时间为10分钟

01

认识Service

什么是Service?

    Service是一个抽象概念,它定义了逻辑集合下访问Pod组的策略。通过使用Service,我们就可以不用关心这个服务下面的Pod的增加和减少、故障重启等,只需通过Service就能够访问到对应服务的容器,即通过Service来暴露Pod的资源

  这样说可能还是有点难懂,举个例子,假设我们的一个服务Service A下面有3个Pod,我们都知道Pod的IP都不是持久化的,重启之后就会有变化。那么Service B想要访问Service A的Pod,它只需跟绑定了这3个Pod的Service A打交道就可以了,无须关心下面的3个Pod的IP和端口等信息的变化。换句话说,就像一个Service Discovery服务发现的组件,你无须关心具体服务的URL,只需知道它们在服务发现中注册的Key就可以通过类似Consul、Eureka之类的服务发现组件中获取它们的URL一样,还是实现了负载均衡效果的URL。

  640?wx_fmt=png

Service的几种类型

 (1)ClusterIP

   ClusterIP 服务是 Kubernetes 的默认服务。它给你一个集群内的服务,集群内的其它应用都可以访问该服务,但是集群外部无法访问它。

  因此,这种服务常被用于内部程序互相的访问,且不需要外部访问,那么这个时候用ClusterIP就比较合适,如下面的yaml文件所示:

apiVersion: v1	
kind: Service	
metadata:	
name: my-internal-service	
selector:	
app: my-app	
spec:	
type: ClusterIP	
ports:	
- name: http	
port: 80	
targetPort: 80	
protocol: TCP

  那么,如果需要从外部访问呢(比如我们在开发模式下总得调试吧)?可以启用K8S的代理模式:

$ kubectl proxy --port=8080

  如此一来,便可以通过K8S的API来访问了,例如下面这个URL就可以访问在yaml中定义的这个my-internal-service了:

PS:ClusterIP是一个虚拟IP,由K8S节点上的iptables规则管理的。iptables会将访问Service的流量转发到后端Pod,而且使用类似于轮询的负载均衡策略转发的。

  (2)NodePort

   除了只在内部访问的服务,我们总有很多是需要暴露出来公开访问的服务吧。在ClusterIP基础上为Service在每台机器上绑定一个端口,这样就可以通过<NodeIP>:NodePort来访问这些服务。例如,下面这个yaml中定义了服务为NodePort类型:

PS:这种方式顾名思义需要一个额外的端口来进行暴露,且端口范围只能是 30000-32767,如果节点/VM 的 IP 地址发生变化,你需要能处理这种情况。

  (3)LoadBalancer

   LoadBalancer 服务是暴露服务到 internet 的标准方式,它借助Cloud Provider创建一个外部的负载均衡器,并将请求转发到<NodeIP>:NodePort(向节点导流)。

  例如下面这个yaml中:

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

PS:每一个用 LoadBalancer 暴露的服务都会有它自己的 IP 地址,每个用到的 LoadBalancer 都需要付费,这将是比较昂贵的花费。

02

Service的创建与运行

创建Deployment

        这里仍然以我们的一个ASP.NET Core WebAPI项目为例,准备一个Deployment的YAML文件:

apiVersion: apps/v1	
kind: Deployment	
metadata:	name: edc-webapi-deployment	namespace: aspnetcore	
spec:	replicas: 2	selector:	matchLabels:	name: edc-webapi	template:	metadata:	labels:	name: edc-webapi	spec:	containers:	- name: edc-webapi-container	image: edisonsaonian/k8s-demo	ports:	- containerPort: 80	imagePullPolicy: IfNotPresent

  这里我们需要注意的就是给该Deployment标注selector的matchLabels以及template中的labels,这是一个Key/Value对,用于后续Service来匹配要挑选哪些Pod作为Service的后端,即需要给哪些Pod提供服务发现以及负载均衡的效果。

  同样,通过kubectl创建资源:

kubectl apply -f edc-api.yaml

  然后,通过curl命令验证一下:(这里的两个IP地址是ClusterIP,它们分别位于我的两个K8S Node节点上)

640?wx_fmt=png

   可以看到,我们的ASP.NET Core WebAPI正常的返回了JSON数据。

创建Service

        接下来我们就为上面的两个Pod创建一个Service:

apiVersion: v1	
kind: Service	
metadata:	name: edc-webapi-service	namespace: aspnetcore	
spec:	ports:	- port: 8080	targetPort: 80	selector:	name: edc-webapi

  这里需要注意的几个点:

  (1)port : 8080 => 指将Service的8080端口映射到Pod的对应端口上,这里Pod的对应端口由 targetPort 指定。

  (2)selector => 指将具有 name: edc-webapi 这个label的Pod作为我们这个Service的后端,为这些Pod提供统一IP和端口。

  这里我们来进行验证一下:

640?wx_fmt=png

   可以看到,默认情况下Service的类型时ClusterIP,只能提供集群内部的服务访问。如果想要为外部提供访问,那么需要改为NodePort。

使用NodePort

        下面为Service增加NodePort访问方式:

apiVersion: v1	
kind: Service	
metadata:	name: edc-webapi-service	namespace: aspnetcore	
spec:	type: NodePort	ports:	- port: 8080	targetPort: 80	selector:	name: edc-webapi

  再次进行创建,会覆盖已有配置:

  再次进行验证,会发现已经改为了NodePort方式:  640?wx_fmt=png

   这里的PORT已经变为了8080:32413,意味着它将Service中的8080端口映射到了Node节点的32413端口,我们可以通过访问Node节点的32413端口获取ASP.NET Core WebAPI返回的接口数据了。

  访问k8s-node1:   640?wx_fmt=png

  访问k8s-node2:   640?wx_fmt=png

指定特定端口

        刚刚的NodePort默认情况下是随机选择一个端口(30000-32767范围内),不过我们可以使用nodePort属性指定一个特定端口:

  访问k8s-node1:  640?wx_fmt=png

   访问k8s-node2:  640?wx_fmt=png

  最后,再次总结一下三个端口配置:

  (1)nodePort => Node节点上监听的端口,也就是外部访问的Service端口

  (2)port => ClusterIP上监听的端口,即内部访问的Service端口

  (3)targetPort => Pod上监听的端口,即容器内部的端口

03

DNS访问Service

        Kubernetes默认安装了一个dns组件coredns,它位于kube-system命名空间中:  640?wx_fmt=png

   每当有新的Service被创建时,coredns会添加该Service的DNS记录,于是在Cluster中的Pod便可以通过servicename.namespacename来访问Service了,从而可以做到一个服务发现的效果。

  这里我们来验证一下,通过临时创建一个busybox Pod来访问edc-webapi-service.aspnetcore:8080:

kubectl run busybox --rm -ti --image=busybox /bin/sh

   可以看到,coredns组件为刚刚创建的Service edc-webapi-service创建了DNS记录,在Cluster中的Pod无须知道edc-webapi-service的IP地址只需要知道ServiceName即可访问到该Service。

04

小结


本文介绍了K8S中Service的基本概念及常用类型,然后通过一个具体的例子演示了如何创建Service和使用NodePort的方式对外提供访问,最后介绍了如何通过DNS的方式访问Service从而实现服务发现的效果。当然,笔者也是初学,很多东西没有介绍到,也请大家多多参考其他资料更加深入了解。


参考资料:

(1)CloudMan,《每天5分钟玩转Kubernetes》

(2)李振良,《一天入门Kubernets教程》

(3)马哥(马永亮),《Kubernetes快速入门》

(4)小黑老,《K8S中Service的理解》


640?wx_fmt=jpeg


点个在看少个bug ?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/314373.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

输出程序运行时间

输出程序运行时间 用函数clock()返回一个时钟类型&#xff0c;本质上是一个long类型&#xff0c;然后表示从程序开始到当前经过的时钟单位&#xff0c;所以我们可以通过两个位置的差来得到一段的运行时间但是要除以一个常量CLOCKS_PER_SEC表示每秒的时钟单位&#xff0c;然后用…

P3768 简单的数学题(杜教筛)

P3768 简单的数学题 推式子 ∑i1n∑j1mijgcd(i,j)∑d1nd∑i1n∑j1mij(gcd(i,j)d)∑d1nd3∑i1nd∑j1ndij∑k∣gcd(i,j)μ(k)∑d1nd3∑k1ndk2μ(k)∑i1nkdi∑j1nkdj∑d1nd3∑k1ndk2μ(k)(⌊nkd⌋(1⌊nkd⌋)2)2我们假设tkd∑t1nt2(⌊nt⌋(1⌊nt⌋)2)2∑k∣ttkμ(k)∑t1nt2ϕ(t)(⌊…

博客园翻车启示录

开发者的日常作为一名996的开发者&#xff0c;我几乎每天只有两件事&#xff0c;制造bug和解决bug&#xff0c;这两件事&#xff0c;既替我解决了温饱问题、也替产品经理、测试工程师等一票人解决了吃穿问题。嗯&#xff0c;有人为我这种程序员评了一个等级&#xff0c;我大概是…

[2020多校A层11.25]最大K段和(反悔贪心)

[2020多校A层11.25]最大K段和 对于一个长度为n的序列&#xff0c;求解不相交的k段使得他们的总和最大&#xff0c;输出最大值。 n<1e5 对于这种问题&#xff0c;我们没有思路求解&#xff0c;可以考虑枚举&#xff0c;发现无法枚举&#xff0c;然后考虑dp&#xff0c;发现…

asp.net core 从单机到集群

asp.net core 从单机到集群Intro这篇文章主要以我的活动室预约的项目作为示例&#xff0c;看一下一个 asp.net core 应用从单机应用到集群部署需要做什么。示例项目活动室预约提供了两个版本&#xff0c;集群版和 单机版单机版方便部署&#xff0c;不依赖其他环境&#xff0c;数…

杜教筛模板(P4213 【模板】杜教筛(Sum))

P4213 【模板】杜教筛&#xff08;Sum&#xff09; 套路推式子 求s(n)∑i1nf(i)∑i1n(f∗g)(i)∑i1n∑d∣if(d)g(id)∑d1n∑i1⌊nd⌋f(i)g(d)∑d1ng(d)S(⌊nd⌋)g(1)S(n)∑d2ng(d)S(⌊nd⌋)则有g(1)S(n)∑i1n(f∗g)(i)−∑d2ng(d)S(⌊nd⌋)求s(n) \sum_{i 1} ^{n}f(i)\\ \su…

[2020多校A层12.1]树(倍增/单调栈/dfs栈)

[2020多校A层12.1]树 求解树上从u到v的最长贪心上升序列&#xff0c;也就是只要有比它大的就选择它&#xff0c;可以发现这个问题性质&#xff0c;就是每个点对应了唯一的一个第一个比它大的点&#xff0c;那么我们可以向它们之间连边&#xff0c;然后问题就转化为求解从当前点…

通过Blazor使用C#开发SPA单页面应用程序(3)

通过Blazor使用C#开发SPA单页面应用程序(1)通过Blazor使用C#开发SPA单页面应用程序(2)今天我们来看看Blazor开发的一些基本知识。Blazor中组件的基本结构可以分为3个部分&#xff0c;如下所示&#xff1a;//Counter.razor//Directives section 指令部分page "/counter&qu…

NC14250 MMSet2

MMSet2 思路 这道题目显然能够通过31051063 \times 10 ^ 5 \times 10 ^ 63105106的复杂度来暴力&#xff0c;这显然不能达到题目要求的复杂度&#xff0c;因此我们可以对题目要求我们计算的东西进行转换。 某个点到所有点集的最大距离最小&#xff0c;这就有点像是重心的求法…

[2020多校A层12.3]虚构推理(语言/二分/数据结构)

[2020多校A层12.3]虚构推理 给定n个时钟精确到秒&#xff0c;求解一个时间&#xff0c;使得它的指针和所有其他的时钟时针和分针分别的角度最大值最小。 一道毒瘤的二分题&#xff0c;看到最大值最小&#xff0c;我们很容易想到二分答案。然后我们的关键是check&#xff0c;那…

ASP.NET CORE 2.* 利用集成测试框架覆盖HttpClient相关代码

ASP.NET CORE 集成测试官方介绍我的asp.net core 项目里面大部分功能都是去调用别人的API &#xff0c;大量使用HttpClient&#xff0c;公司单元测试覆盖率要求95%以上&#xff0c;很难做到不mock HttpClient 达到这个指数。以下方法是我自己总结的在单元测试里 mock httpClien…

Expected Value Again(咕咕咕)

Expected Value Again 神题&#xff01;&#xff01;&#xff01;

[51 nod 1238] 最小公倍数之和 V3(杜教筛)

1238 最小公倍数之和 V3 推式子 ∑i1n∑j1nlcm(i,j)∑i1n∑j1nijgcd(i,j)∑d1n∑i1n∑j1nijd(gcd(i,j)d)∑d1nd∑i1nd∑j1ndij(gcd(i,j)1)∑d1nd∑i1nd∑j1ndij∑k∣gcd(i,j)μ(k)∑d1nd∑k1ndk2μ(k)∑i1ndk∑j1ndkij\sum_{i 1} ^{n} \sum_{j 1} ^{n} lcm(i, j)\\ \sum_{i…

Let's Encrypt网站推出中文版

如今很多网站都强制使用 HTTPS 加密协议访问&#xff0c;安全性有了很大的提高&#xff0c;最起码在数据传输的初始阶段数据包不会被劫持&#xff0c;保证了客户端与服务器端的通讯安全性。说到 HTTPS 加密协议&#xff0c;就不得不提 Let’s Encrypt。Let’s Encrypt 是一家不…

动态分配内存

https://www.runoob.com/cplusplus/cpp-dynamic-memory.html

[51 nod 123] 最大公约数之和 V3(杜教筛)

1237 最大公约数之和 V3 推式子 ∑i1n∑j1ngcd(i,j)∑d1nd∑i1n∑j1n(gcd(i,j)d)∑d1nd∑i1nd∑j1nd(gcd(i,j)1)∑d1nd∑i1nd∑j1nd∑k∣gcd(i,j)μ(k)∑d1nd∑k1ndμ(k)∑i1nkd∑j1nkd1套路地设tkd∑t1n(⌊nt⌋)2∑d∣tdμ(td)∑t1n(⌊nt⌋)2ϕ(t)接下来就是杜教筛求∑i1nϕ(…

使用WebDeploy部署远程IIS网站

目录 使用WebDeploy部署远程IIS网站后台服务部署服务器配置本地WebDeploy发布文件配置前端页面部署WebDeploy服务端配置WebDeploy发布文件配置使用WebDeploy部署远程网站后台服务部署服务器配置打开IIS管理器(开始->控制面板->管理工具->IIS管理器)添加网站(右键网站…

数列分块入门

文章目录数列分块入门1数列分块入门2数列分块入门3数列分块入门4数列分块入门5数列分块入门6数列分块入门7数列分块入门8数列分块入门9数列分块入门1 区间加&#xff0c;单点查询 分块后&#xff0c;维护标记&#xff0c;零散块暴力加&#xff0c;查询时输出值加标记 数列分块…

CF436F Banners(分块/凸包/单调队列)

CF436F Banners 首先有n个物品分别有ai和bi&#xff0c;然后定义价值为 c∗wp∗(ai大于p且bi小于c的用户个数)c*wp*(ai大于p且bi小于c的用户个数)c∗wp∗(ai大于p且bi小于c的用户个数) 然后我们需要求解对于每一个c的最大价值和对应的p 首先我们先枚举c&#xff0c;然后每次加…

译 | 改进 Visual Studio 及 Windows 上 .NET Core 的安装体验

点击上方蓝字关注“汪宇杰博客”原文&#xff1a;Lee Coward翻译&#xff1a;Edi Wang导语Visual Studio 2019 16.3 和 .NET Core 3.0 Preview 7 改进了 Windows 上 .NET Core 的安装体验。目标是减少计算机上可能存在的 .NET Core 版本的数量。这些改进基于客户反馈和我们自己…