K8S | Service服务发现

这篇具有很好参考价值的文章主要介绍了K8S | Service服务发现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

服务发现与负载均衡。

一、背景

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

K8S | Service服务发现

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

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

在K8S集群中,通过Service组件,可以快速简单的实现服务发现和负载均衡;

二、Service组件

1、简介

在K8S集群中是通过Pod组件来部署应用服务,Deployment组件实现Pod编排管理,Service组件实现应用的访问;

K8S | Service服务发现

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

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

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

基于Pod、Deployment、Service三个组件的协作,同一个应用的部署脚本可以在开发、测试、生产不同环境中复用;

2、基础语法

这里提供一个简单的【Service】语法做参考;

K8S | Service服务发现

需要注意的是:在该脚本中没有指定服务类型即ServiceType,默认采用的是ClusterIP,通过集群的内部IP暴露服务,选择该值时服务只能够在集群内部访问;

三、内部服务发现

1、Pod创建

基于【Deployment】组件,创建「auto-serve」应用;

apiVersion: apps/v1
kind: Deployment
metadata:
  name: serve-deployment
  labels:
    app: auto-serve
spec:
  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

执行创建命令

kubectl apply -f serve-deployment.yaml

2、Service创建

简单的脚本文件:app-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: app-service
spec:
  selector:
    app: auto-serve
  ports:
  - name: app-service-port
    protocol: TCP
    port: 8082
    targetPort: auto-serve-port

创建【Service】

kubectl apply -f app-service.yaml

查看【Service】,可以使用命令行或者界面;

kubectl describe svc app-service

K8S | Service服务发现

删除【Service】

kubectl delete -f app-service.yaml

3、内部访问

在上面已经说明,当Type不指定时采用的是ClusterIP,只能在集群内部访问,集群外部的网络是无法访问的;

在【auto-client】服务中提供一段访问【auto-serve】接口的代码,并制作镜像【auto-client:3.3.3】,完成部署后查看日志打印;

@Component
public 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中查看两个应用的日志,请求和响应都正常;

K8S | Service服务发现

四、外部服务发现

1、NodePort类型

指定类型为NodePort的脚本:app-np-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: app-np-service
spec:
  type: NodePort
  selector:
    app: auto-serve
  ports:
    - protocol: TCP
      port: 8082
      targetPort: 8082
      nodePort: 30010

创建【Service】

kubectl apply -f app-np-service.yaml

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

2、LoadBalancer类型

指定类型为LoadBalancer的脚本:app-lb-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: app-lb-service
spec:
  type: LoadBalancer
  selector:
    app: auto-serve
  ports:
    - protocol: TCP
      port: 8082
      targetPort: 8082

创建【Service】

kubectl apply -f app-lb-service.yaml

查看【Service】

在查看「app-lb-service」时,值得注意一下Endpoints的字段属性,这里就是Pod选择器选中的Pod

kubectl get svc app-lb-service -o wide


NAME             TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE     SELECTOR
app-lb-service   LoadBalancer   10.111.65.220   localhost     8082:30636/TCP   6m49s   app=auto-serve


kubectl describe svc app-lb-service


Name:                     app-lb-service
Namespace:                default
Labels:                   <none>
Annotations:              <none>
Selector:                 app=auto-serve
Type:                     LoadBalancer
IP Family Policy:         SingleStack
IP Families:              IPv4
IP:                       10.111.65.220
IPs:                      10.111.65.220
LoadBalancer Ingress:     localhost
Port:                     <unset>  8082/TCP
TargetPort:               8082/TCP
NodePort:                 <unset>  30636/TCP
Endpoints:                10.1.0.160:8082,10.1.0.161:8082,10.1.0.162:8082
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>


kubectl get pods -o wide


NAME                               READY   STATUS    RESTARTS   AGE   IP           NODE          
serve-deployment-f6f6c5bbd-9qvgr   1/1     Running   0          39m   10.1.0.162   docker-desktop
serve-deployment-f6f6c5bbd-w7nj2   1/1     Running   0          39m   10.1.0.161   docker-desktop
serve-deployment-f6f6c5bbd-x7v4d   1/1     Running   0          39m   10.1.0.160   docker-desktop

K8S | Service服务发现文章来源地址https://www.toymoban.com/news/detail-622714.html

五、参考源码

文档仓库:
https://gitee.com/cicadasmile/butte-java-note

脚本仓库:
https://gitee.com/cicadasmile/butte-auto-parent

到了这里,关于K8S | Service服务发现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • k8s-服务发现service和ingress

    回到目录 service用于集群内部应用的网络调用,处理东西流量 ingress用于集群外部用户访问内部服务,处理南北流量 kubernetes集群中有三层网络,一类是真实存在的,例如Node Network、Pod Network,提供真实IP地址;一类是虚拟的,例如Cluster Network或Service Network,提供虚拟IP地址,不会

    2024年02月14日
    浏览(47)
  • Kubernetes(k8s)服务service:service的发现和service的发布

    目录 一.系统环境 二.前言 三.Kubernetes service简介 四.使用hostPort向外界暴露应用程序 4.1 创建deploy 4.2 使用hostPort向外界暴露pod的端口 五.使用service服务向外界暴露应用程序 5.1 使用service服务向外界暴露pod 5.1.1 创建service服务 5.1.2 测试svc的负载均衡 六.service服务的发现 6.1 使用

    2024年02月08日
    浏览(54)
  • k8s服务发现之第二弹Service详解

    Kubernetes Servies 是一个 RESTFul 接口对象,可通过 yaml 文件创建。 例如,假设您有一组 Pod: 每个 Pod 都监听 9376 TCP 端口 每个 Pod 都有标签 app=MyApp 上述 YAML 文件可用来创建一个 Service: 名字为 my-service 目标端口为 TCP 9376 选取所有包含标签 app=MyApp 的 Pod 关于 Service,您还需要了解

    2024年02月16日
    浏览(48)
  • k8s服务发现之第一弹Service概述

    Kubernetes 中 Pod 是随时可以消亡的(节点故障、容器内应用程序错误等原因)。如果使用 Deployment 运行您的应用程序,Deployment 将会在 Pod 消亡后再创建一个新的 Pod 以维持所需要的副本数。每一个 Pod 有自己的 IP 地址,然而,对于 Deployment 而言,对应 Pod 集合是动态变化的。

    2024年02月12日
    浏览(52)
  • k8s服务发现之第五弹--使用 Service 连接到应用

    通过前面教程的学习,我们已经可以将容器化的应用程序在 Kubernetes 中运行起来,并且发布到 Kubernetes 内/外的网络上。 通常,Docker 使用一种 host-private 的联网方式,在此情况下,只有两个容器都在同一个节点(主机)上时,一个容器才可以通过网络连接另一个容器。为了使

    2024年02月15日
    浏览(40)
  • 持续集成部署-k8s-服务发现-Service:Service、Endpoint、Pod之间的关系与原理

    在 Kubernetes 中, Service 是一种抽象的逻辑概念,用于将一组具有相同功能的 Pod 组合成一个逻辑服务。 Service 提供了一种稳定的 IP 地址和 DNS 域名,供客户端访问这个逻辑服务。同时, Service 还提供了负载均衡、会话保持等功能,可以很方便地实现服务发现与调用。 在 Kuber

    2024年02月06日
    浏览(51)
  • 【Spring Cloud Kubernetes】使用k8s原生service实现服务注册和发现

    @TOC 现在微服务开发模式应用的越来越广泛,注册中心 Eureka 也逐渐被其它注册中心产品替代,比如阿里出品的 Nacos 。随着云原生相关技术的普及, k8s 迅猛发展,我们把 K8s 中的 Pod 暴露给外部访问,通过少了 Service ,这也是今天的主角。 有没有发现,其实 Service 已经解决了

    2024年02月12日
    浏览(85)
  • k8s服务发现(service discovery)常用的两种方式Nodeport和ClusterIP

    NodePort: 主要特点: 为Service在每个节点上分配一个固定的端口(NodePort),允许外部流量通过节点的IP地址和NodePort访问Service。 NodePort将流量从集群外部引入到Service内部。 Service类型为NodePort时,还会创建一个ClusterIP,但它只是一个内部的ClusterIP,通常不会直接使用。 使用场

    2024年02月05日
    浏览(45)
  • k8s 负载均衡工具Ingress

    Kubernetes是一种流行的容器编排平台,它提供了一种简单而强大的方式来管理容器化应用程序。Kubernetes Ingress是一种用于管理HTTP和HTTPS流量的API对象。它允许您将多个服务公开到Internet上,并提供负载均衡、TLS终止和基于主机名的路由等功能。本文将介绍Kubernetes Ingress的概念、

    2024年02月12日
    浏览(53)
  • k8s+负载均衡+防火墙

    目录 实验拓扑  实验要求 实验部署 一、kubeadm部署k8s集群 1、环境准备(所有节点) 2、所有节点安装docker 3、所有节点安装Kubeadm、Kubelet和Kuberctl 4、部署k8s集群 初始化kubeadm 设置kubectl 5、部署网络插件flannel(所有节点) 二、创建两个自主式Pod资源 三、创建service资源(mast

    2024年02月07日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包