.NET Core + Kubernetes:Service

通过 .NET Core + Kubernetes:Deployment 文章的介绍,我们可以通过 Deployment 控制器快速创建一组 Pod 来提供服务,每个 Pod 都会被分配一个集群内可见的虚拟 IP 地址,然后通过一个独立的 Endpoint(Pod IP + ContainerPort)进行访问。但在提供服务时,并不能依赖 Pod  的 Endpoint,首先 Pod IP 会随着 Pod 的重建而变化,另外同一组 Pod 更希望是以整体对外提供高可用服务,组内的 Pod 在进行动态伸缩、滚动更新等操作后并不能影响服务稳定性。

因此,Kubernetes 中的 Service 对象就是解决此问题的核心,Service 代理 Pod 集合对外表现是为一个访问入口,它提供了一个虚拟的 IP 地址(ClusterIP)和端口,来自 ClusterIP + 端口  的请求将被负载均衡器 (kube-proxy)转发到后端某个 Pod 中的容器。所以借助 Service 的能力,非常方便的实现了服务发现与负载均衡。

本文将主要介绍 Kubernetes 中各 Service 类型的使用,目前有以下四种类型:

  • ClusterIP:默认类型,自动分配一个仅集群内部可以访问的虚拟 IP,也可使用 ClusterIP 字段指定固定 IP,选择此类型意味着只想这个服务在集群内部才可以被访问

  • NodePort:在 ClusterIP 基础上,在集群的每一个节点绑定一个端口,这样就可以通过任意的:NodePort 来访问服务

  • LoadBalancer:在 NodePort 的基础上,通过创建一个外部的负载均衡器,将流量转发到每个节点:NodePort。因为如果外部所有客户端都访问一个 NodeIP,该节点的压力将会很大,LoadBalancer 则可解决此问题

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

下面分别对这几种类型的使用方式进行介绍,在创建 Service 之前,还是先通过 Deployment 控制器创建一组 Pod,配置文件 k8sdemo-deployment.yaml 如下:

apiVersion: apps/v1
kind: Deployment
metadata:name: k8sdemo-deployment
spec:replicas: 3selector:matchLabels:name: k8sdemotemplate:metadata:labels:name: k8sdemospec:containers:- name: k8sdemoimage: beckjin/k8sdemo:1.0.0ports:- containerPort: 80imagePullPolicy: IfNotPresent

ClusterIP 类型

创建 k8sdemo-service.yaml 文件,配置如下,主要是  portsselector 字段的设置,指定了 80 端口(port) 映射到 Pod ContainerPort (targetPort) 端口,最终将通过 ClusterIP:80 访问服务。selector 字段指定将 label 含 name:k8sdemo 的 Pod 作为这个 Service 指向的目标服务。

apiVersion: v1
kind: Service
metadata:name: k8sdemo-service
spec:ports:- port: 80                 # Service PorttargetPort: 80           # Pod ContainerPortselector:name: k8sdemo# clusterIP: 10.1.19.92   # 取消注释指定IP

执行命令 kubectl apply -f k8sdemo-service.yaml 创建 Service,然后通过 kubectl get service 查看服务状态:

从上图可以看出 k8sdemo-service 被分配的 ClusterIP 是 10.1.19.96,所以可以在服务器上通过 curl http://10.1.19.96/WeatherForecast 来访问接口。

因为 ClusterIP 默认是自动分配的,所以每次重建会变化,如果需要固定,可通过 ClusterIP 字段设置。对于只需在集群内部提供的服务,ClusterIP 类型已足够。

NodePort 类型

基于 ClusterIP 类型中使用的配置文件 k8sdemo-service.yaml,增加 type: NodePort 配置,重新创建 Service,如下:

apiVersion: v1
kind: Service
metadata:name: k8sdemo-service
spec:ports:- port: 80targetPort: 80# nodePort: 30080   # 取消注释指定端口selector:name: k8sdemotype: NodePort

从上图可以看出,除了类型变了, PORT(S)也变成了 80:30231/TCP,即将 Service 的 80 端口与集群中各节点的 30231 端口进行映射,所以最终可以通过集群内任意的 NodeIP:30231 来访问,整个过程为:Client > NodeIP:NodePort > ClusterIP:ServicePort > PodIP:ContainerPort。NodePort 默认分配的是 30000-32767 范围内随机选择的一个端口,实际使用时可以通过 nodePort 字段指定。请求结果如下:

注:192.168.124.10 是集群内某一台的 IP

LoadBalancer 类型

通过 NodePort 类型的使用介绍,已经了解可以通过 NodeIP:NodePort 方式来服务访问,而且 NodeIP 可以是集群内任意任何一台的 IP。而 LoadBalancer 则是在外层附加的负载均衡器,使请求能分摊到集群内各个节点上。

MetalLB 搭建

要使用 LoadBalancer 类型会稍微复杂一些,并不能只单纯的修改配置文件,因为一般自建的 Kubernetes 集群默认并不支持 LoadBalancer,所以它需要借助外部的负载均衡器来实现,这里将使用 MetalLB[1] (v0.9.3),安装请参考 Installation By Manifest[2] ,步骤不复杂,但需要确保依赖镜像下载顺利,完成后查看 Pod 状态:

另外需要为 Metallb 设置地址池以及协议相关配置,Metallb 会监控服务对象的变化,当有新的 LoadBalancer 服务运行,但没有可申请的负载均衡器时,就会从配置的地址池中分配一个给该服务。这里以 Metallb Layer2 工作模式为例(Metallb 支持 Layer2/BGP 两种工作模式),创建一个资源类型为 ConfigMap 的配置文件 metallb-layer2-config.yaml,内容如下:

apiVersion: v1
kind: ConfigMap
metadata:namespace: metallb-systemname: config
data:config: |address-pools:- name: defaultprotocol: layer2addresses:- 192.168.124.200-192.168.124.210  # IP 地址范围需与自己的集群环境对应

Layer2  工作模式原理图:

配置修改

有了以上的准备工作后,只需要在 Service 配置文件将 type 修改为 LoadBalancer ,然后重新创建 Service,如下:

apiVersion: v1
kind: Service
metadata:name: k8sdemo-service
spec:ports:- port: 80targetPort: 80selector:name: k8sdemotype: LoadBalancer

从上图可以看出,TYPE 已是 LoadBalancer,另外 EXTERNAL-IP 被分配为地址池中的 192.168.124.200,接下来就可以通过这个 IP 进行访问了,结果如下:

ExternalName

ExternalName 类型比较特殊,它没有 selector,也没有定义任何的端口, 对于运行在集群外部的服务,它通过返回该外部服务的别名这种方式来提供服务,如下:

apiVersion: v1
kind: Service
metadata:name: k8sdemo-external-service
spec:type: ExternalNameexternalName: mingdao.com

当访问 k8sdemo-external-service.default.svc.cluster.local 时,集群的 DNS 服务将返回值为 mingdao.com 的 CNAME 记录,访问这种类型的服务与其它的唯一不同的是重定向发生在 DNS 层,而且不会进行代理或转发。

进入 Kubernetes 集群的任意一个 Pod 中(必须是集群内部才可访问),如:kubectl exec -it k8sdemo-deployment-68cb864ff6-fzzdq -- /bin/bash,执行 curl -L http://k8sdemo-external-service.default.svc.cluster.local/ 即会重定向请求到 mingdao.com,结果如下:

参考资料

[1]

MetalLB: https://metallb.universe.tf/

[2]

Installation By Manifest: https://metallb.universe.tf/installation/#installation-by-manifest

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

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

相关文章

bim建筑绘图计算机要求,BIM考试报名条件:想要成为一级BIM建模师需要达到哪些要求?...

【摘要】如今,BIM成为建筑领域无处不在的一个热词,学习BIM技术也是当前的热潮。那么你知道一级BIM建模师考试的考评要点吗?获得BIM技能等级认证,成为行业急需的BIM技术人才需要达到哪些要求呢?一级BIM建模师一、文化要求报考一级BIM建模师基…

EventBus/EventQueue 再思考

EventBus/EventQueue 再思考Intro之前写过两篇文章,造轮子系列的 EventBus/ EventQueue,回想起来觉得当前的想法有点问题,当时对 EvenStore 可能有点误解,有兴趣可以参考 动手造轮子:实现一个简单的 EventBus动手造轮子…

网络原理题+复习资料

1.试说明运输层在协议栈中的地位和作用,运输层的通信和网络层的通信有什么重要区别?为什么运输层是必不可少的? 答:运输层处于面向通信部分的最高层,同时也是用户功能中的最低层,向它上面的应用层提供服务…

德清租房软件测试,门头沟实习生出租房

10 图2室 65㎡苏州街海淀南路小区距4号线大兴线海淀黄庄地铁站步行438m来自经纪人: 陈伟建1天前8300元8 图1室 35㎡北太平庄花园路8号院距10号线牡丹园地铁站步行1122m来自经纪人: 陈泽科1天前4800元10 图1室 45㎡西北旺芳怡园距16号线西北旺地铁站步行1128m来自经…

[推荐]大量 Blazor 学习资源(一)

预警前言 / Introduction Blazor 是什么?Blazor 允许您使用 C# 而不是 JavaScript 构建交互式 Web UI。Blazor 应用由使用 C#、HTML 和 CSS 实现的可重用 Web UI 组件组成。客户端和服务器代码都用 C# 编写,允许您共享代码和库。???? 本文主要来给大…

网络原理往期考试题+部分详解+最终版

一.填空题: (号代表出现次数,无则说明一次) 1. 在采用电信号表达数据的系统中,数据有数字数据和__模拟数据__两种。 2. 国际标准化组织ISO提出的不基于特定机型、操作系统或公司的网络体系结…

计算机博士两篇一区两篇会议,本科博士联手!西电陈渤团队两篇论文被顶级会议录用...

第34届神经信息处理系统大会(Neural Information Processing Systems, NeurIPS,https://neurips.cc/)将于12月06日—12月12日,通过线上举行。该会议是跨学科的,主要包括人工智能和自然神经信息处理,代表着热门科研领域的最前沿&am…

从零开始实现 ASP.NET Core MVC 的插件式开发(七) - 问题汇总及部分问题解决方案...

标题:从零开始实现 ASP.NET Core MVC 的插件式开发(七) - 问题汇总及部分问题解决方案作者:Lamond Lu地址:https://www.cnblogs.com/lwqlun/p/12930713.html源代码:https://github.com/lamondlu/Mystique前景回顾从零开始实现 ASP…

C++实现顺序串(完整代码)

代码如下: #include<iostream> #include <cstring> #define _CRT_SECURE_NO_WARNINGS using namespace std;class String { public:String(){size 0;str new char[size 1];str[0] \0;}String(const String &obj){size obj.size;str new char[size 1];i…

投影仪硬件边缘融合服务器,带你了解投影融合的边缘融合显示技术

原标题&#xff1a;带你了解投影融合的边缘融合显示技术边缘融合显示系统是一个专业、复杂的视屏显示系统。在设计组建的时候务必考虑周密&#xff0c;消除各类不良因素。因为边缘融合系统建设具有相关器材多、系统连接复杂、易受环境因素干扰的特性&#xff0c;所以如果没有在…

Sql Server之旅——第六站 为什么都说状态少的字段不能建索引

我们在学sqlserver的时候&#xff0c;大多教科书和前辈们都说状态少的字段不要建索引&#xff0c;由此带来的开销还不如不建索引&#xff0c;但是这句话有多少人真的知道&#xff0c;或者说有多少人真的对此有比较深刻的理解&#xff0c;而不是听别人道听途说。。。这样记得快&…

概率论复习题+部分详解

概率论与数理统计练习题 1.假设检验中&#xff0c;显著性水平α\alphaα 限制&#xff08;第一类错误&#xff08;拒真错误&#xff09;#&#xff09;的概率 分析&#xff1a; &#xff08;1&#xff09;&#xff0e;原假设为真时拒绝原假设的概率不超过α &#xff08;2&…

【壹刊】Azure AD B2C(一)初识

一&#xff0c;引言&#xff08;上节回顾&#xff09;上一节讲到Azure AD的一些基础概念&#xff0c;以及如何运用 Azure AD 包含API资源&#xff0c;Azure AD 是微软提供的云端的身份标识和资源访问服务&#xff0c;帮助员工/用户/管理员访问一些外部资源和内部资源&#xff1…

英语期末复习unit 3-4课后习题第一题及背诵段落

unit 3 背诵段落&#xff1a; 2 When a recent college graduate came into my office not too long ago looking for a sales job, I asked him what he had done to prepare for the interview. He said he’d read something about us somewhere. 不久前一个新近毕业的大…