当前位置:首页 > 科技  > 软件

K8S | Service服务发现

来源: 责编: 时间:2023-08-05 11:44:46 4268观看
导读一、背景在微服务架构中,这里以开发环境「Dev」为基础来描述,在K8S集群中通常会开放:路由网关、注册中心、配置中心等相关服务,可以被集群外部访问;图片对于测试「Tes」环境或者生产「Pro」环境,出于安全或者环境隔离性来考

一、背景

在微服务架构中,这里以开发环境「Dev」为基础来描述,在K8S集群中通常会开放:路由网关、注册中心、配置中心等相关服务,可以被集群外部访问;sdn28资讯网——每日最新资讯28at.com

图片图片sdn28资讯网——每日最新资讯28at.com

对于测试「Tes」环境或者生产「Pro」环境,出于安全或者环境隔离性来考虑,在正常情况下只会开放网关服务,而「注册、配置」中心并不会对外暴露;sdn28资讯网——每日最新资讯28at.com

对于架构中的其它业务服务一般不会对外开放,在K8S集群内部服务间是可以正常通信的,对于「Dev」环境来说,研发会使用「注册、配置」中心,网关是系统的访问入口;sdn28资讯网——每日最新资讯28at.com

在K8S集群中,通过Service组件,可以快速简单的实现服务发现和负载均衡;sdn28资讯网——每日最新资讯28at.com

二、Service组件

1、简介

在K8S集群中是通过Pod组件来部署应用服务,Deployment组件实现Pod编排管理,Service组件实现应用的访问;sdn28资讯网——每日最新资讯28at.com

图片图片sdn28资讯网——每日最新资讯28at.com

【Pod】自身的特点是临时的,使用过后直接抛弃的实体,这样在Pod创建和销毁的状态中,会导致IP地址发生变化,即无法使用固定的IP进行应用访问;sdn28资讯网——每日最新资讯28at.com

【Deployment】控制器通过管理ReplicaSet间接实现Pod管理,比如发布方式,更新和回滚策略,维持Pod副本数量,对应用进行快速的编排,但是并没有涉及应用的访问;sdn28资讯网——每日最新资讯28at.com

【Service】是将运行在一个或一组Pod上的网络应用程序公开为网络服务的方法,可以在不修改现有应用程序的情况下,使用服务发现机制访问到该应用;sdn28资讯网——每日最新资讯28at.com

基于Pod、Deployment、Service三个组件的协作,同一个应用的部署脚本可以在开发、测试、生产不同环境中复用;sdn28资讯网——每日最新资讯28at.com

2、基础语法

这里提供一个简单的【Service】语法做参考;sdn28资讯网——每日最新资讯28at.com

图片图片sdn28资讯网——每日最新资讯28at.com

需要注意的是:在该脚本中没有指定服务类型即ServiceType,默认采用的是ClusterIP,通过集群的内部IP暴露服务,选择该值时服务只能够在集群内部访问;sdn28资讯网——每日最新资讯28at.com

三、内部服务发现

1、Pod创建

基于【Deployment】组件,创建「auto-serve」应用;sdn28资讯网——每日最新资讯28at.com

apiVersion: apps/v1kind: Deploymentmetadata:  name: serve-deployment  labels:    app: auto-servespec:  replicas: 1  selector:    matchLabels:      app: auto-serve  template:    metadata:      labels:        app: auto-serve    spec:      containers:        - name: auto-serve          image: auto-serve:latest          imagePullPolicy: Never          ports:            - containerPort: 8082              name: auto-serve-port

执行创建命令sdn28资讯网——每日最新资讯28at.com

kubectl apply -f serve-deployment.yaml

2、Service创建

简单的脚本文件:app-service.yaml;sdn28资讯网——每日最新资讯28at.com

apiVersion: v1kind: Servicemetadata:  name: app-servicespec:  selector:    app: auto-serve  ports:  - name: app-service-port    protocol: TCP    port: 8082    targetPort: auto-serve-port

创建【Service】sdn28资讯网——每日最新资讯28at.com

kubectl apply -f app-service.yaml

查看【Service】,可以使用命令行或者界面;sdn28资讯网——每日最新资讯28at.com

kubectl describe svc app-service

图片图片sdn28资讯网——每日最新资讯28at.com

删除【Service】sdn28资讯网——每日最新资讯28at.com

kubectl delete -f app-service.yaml

3、内部访问

在上面已经说明,当Type不指定时采用的是ClusterIP,只能在集群内部访问,集群外部的网络是无法访问的;sdn28资讯网——每日最新资讯28at.com

在【auto-client】服务中提供一段访问【auto-serve】接口的代码,并制作镜像【auto-client:3.3.3】,完成部署后查看日志打印;sdn28资讯网——每日最新资讯28at.com

@Componentpublic class HttpServiceJob {    private static final Logger LOG = LoggerFactory.getLogger(HttpServiceJob.class.getName()) ;    private static final String SERVER_NAME = "http://app-service:8082/serve";    private static final String SERVER_IP = "http://10.103.252.94:8082/serve";    /**     * 每30秒执行一次     */    @Scheduled(fixedDelay = 30000)    public void systemDate () {        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();        factory.setReadTimeout(3000);        factory.setConnectTimeout(6000);        RestTemplate restTemplate = new RestTemplate(factory);        try {            Map<String, String> paramMap = new HashMap<>();            String result = restTemplate.getForObject(SERVER_NAME, String.class, paramMap);            LOG.info("service-name-resp::::" + result);        } catch (Exception e) {            e.printStackTrace();        }        try {            Map<String, String> paramMap = new HashMap<>();            String result = restTemplate.getForObject(SERVER_IP, String.class, paramMap);            LOG.info("service-ip-resp::::" + result);        } catch (Exception e) {            e.printStackTrace();        }    }}

在代码中通过服务名:端口和IP:端口都可以正常访问,在Pod中查看两个应用的日志,请求和响应都正常;sdn28资讯网——每日最新资讯28at.com

图片图片sdn28资讯网——每日最新资讯28at.com

四、外部服务发现

1、NodePort类型

指定类型为NodePort的脚本:app-np-service.yaml;sdn28资讯网——每日最新资讯28at.com

apiVersion: v1kind: Servicemetadata:  name: app-np-servicespec:  type: NodePort  selector:    app: auto-serve  ports:    - protocol: TCP      port: 8082      targetPort: 8082      nodePort: 30010

创建【Service】sdn28资讯网——每日最新资讯28at.com

kubectl apply -f app-np-service.yaml

使用NodePort类型,K8S控制平面会在指定的范围内分配端口,如果需要特定的端口号可以指定nodePort字段中的值,但是该类型需要自己设置负载均衡解决方案;sdn28资讯网——每日最新资讯28at.com

2、LoadBalancer类型

指定类型为LoadBalancer的脚本:app-lb-service.yaml;sdn28资讯网——每日最新资讯28at.com

apiVersion: v1kind: Servicemetadata:  name: app-lb-servicespec:  type: LoadBalancer  selector:    app: auto-serve  ports:    - protocol: TCP      port: 8082      targetPort: 8082

创建【Service】sdn28资讯网——每日最新资讯28at.com

kubectl apply -f app-lb-service.yaml

查看【Service】sdn28资讯网——每日最新资讯28at.com

在查看「app-lb-service」时,值得注意一下Endpoints的字段属性,这里就是Pod选择器选中的Pod;sdn28资讯网——每日最新资讯28at.com

kubectl get svc app-lb-service -o wideNAME             TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE     SELECTORapp-lb-service   LoadBalancer   10.111.65.220   localhost     8082:30636/TCP   6m49s   app=auto-servekubectl describe svc app-lb-serviceName:                     app-lb-serviceNamespace:                defaultLabels:                   <none>Annotations:              <none>Selector:                 app=auto-serveType:                     LoadBalancerIP Family Policy:         SingleStackIP Families:              IPv4IP:                       10.111.65.220IPs:                      10.111.65.220LoadBalancer Ingress:     localhostPort:                     <unset>  8082/TCPTargetPort:               8082/TCPNodePort:                 <unset>  30636/TCPEndpoints:                10.1.0.160:8082,10.1.0.161:8082,10.1.0.162:8082Session Affinity:         NoneExternal Traffic Policy:  ClusterEvents:                   <none>kubectl get pods -o wideNAME                               READY   STATUS    RESTARTS   AGE   IP           NODE          serve-deployment-f6f6c5bbd-9qvgr   1/1     Running   0          39m   10.1.0.162   docker-desktopserve-deployment-f6f6c5bbd-w7nj2   1/1     Running   0          39m   10.1.0.161   docker-desktopserve-deployment-f6f6c5bbd-x7v4d   1/1     Running   0          39m   10.1.0.160   docker-desktop

图片图片sdn28资讯网——每日最新资讯28at.com

五、参考源码

文档仓库:https://gitee.com/cicadasmile/butte-java-note脚本仓库:https://gitee.com/cicadasmile/butte-auto-parent

本文链接:http://www.28at.com/showinfo-26-88-0.htmlK8S | Service服务发现

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Golang 中的 io 包详解:组合接口

下一篇: SpringBoot中使用Cache提升接口性能详解

标签:
  • 热门焦点
  • Mate60手机壳曝光 致敬自己的经典设计

    8月3日消息,今天下午博主数码闲聊站带来了华为Mate60的第三方手机壳图,可以让我们在真机发布之前看看这款华为全新旗舰的大致轮廓。从曝光的图片看,Mate 60背后摄像头面积依然
  • 太卷!Redmi MAX 100英寸电视便宜了:12999元买Redmi史上最大屏

    8月5日消息,从小米商城了解到,Redmi MAX 100英寸巨屏电视日前迎来官方优惠,到手价12999元,比发布价便宜了7000元,在大屏电视市场开卷。据了解,Redmi MAX 100
  • Flowable工作流引擎的科普与实践

    一.引言当我们在日常工作和业务中需要进行各种审批流程时,可能会面临一系列技术和业务上的挑战。手动处理这些审批流程可能会导致开发成本的增加以及业务复杂度的上升。在这
  • 之家push系统迭代之路

    前言在这个信息爆炸的互联网时代,能够及时准确获取信息是当今社会要解决的关键问题之一。随着之家用户体量和内容规模的不断增大,传统的靠"主动拉"获取信息的方式已不能满足用
  • 使用LLM插件从命令行访问Llama 2

    最近的一个大新闻是Meta AI推出了新的开源授权的大型语言模型Llama 2。这是一项非常重要的进展:Llama 2可免费用于研究和商业用途。(几小时前,swyy发现它已从LLaMA 2更名为Lla
  • 品牌洞察丨服务本地,美团直播成效几何?

    来源:17PR7月11日,美团App首页推荐位出现&ldquo;美团直播&rdquo;的固定入口。在直播聚合页面,外卖&ldquo;神枪手&rdquo;直播间、美团旅行直播间、美团买菜直播间等均已上线,同时
  • 微博大门常打开,迎接海外画师漂洋东渡

    作者:互联网那些事&ldquo;起猛了,我能看得懂日语了&rdquo;。&ldquo;为什么日本人说话我能听懂?&rdquo;&ldquo;中文不像中文,日语不像日语,但是我竟然看懂了&rdquo;&hellip;&hell
  • 超级标准版旗舰!iQOO 11S全球首发iQOO超算独显芯片

    上半年已接近尾声,截至目前各大品牌旗下的顶级旗舰都已悉数亮相,而下半年即将推出的顶级旗舰已经成为了数码圈爆料的主流,其中就包括全新的iQOO 11S系
  • 回归OPPO两年,一加赢了销量,输了品牌

    成为OPPO旗下主打性能的先锋品牌后,一加屡创佳绩。今年618期间,一加手机全渠道销量同比增长362%,凭借一加 11、一加 Ace 2、一加 Ace 2V三款爆品,一加
Top