K8s如何实现服务发现与配置管理

本文涉及的产品
应用型负载均衡 ALB,每月750个小时 15LCU
云解析 DNS,旗舰版 1个月
传统型负载均衡 CLB,每月750个小时 15LCU
简介: K8s在实现负载均衡与配置管理上的原理是咋样的呢?

K8s如何实现服务注册与发现

  我们一直在说K8s具备服务发现以及配置管理的能力,K8s是如何实现服务的注册与发现,然后如何做到服务的转发、实现负载均衡的。

  其实服务在K8s中,也定义了一种资源:Service,Service,顾名思义是一个服务,什么样的服务呢?它是定义了一个服务的多种 pod 的逻辑合集以及一种访问 pod 的策略。

service 的类型有四种:

  • ExternalName:创建一个 DNS 别名指向 service name,这样可以防止 service name 发生变化,但需要配合 DNS 插件使用。
  • NodePort:基于 ClusterIp,用于为集群外部访问 Service 后面 Pod 提供访问接入端口。
  • LoadBalancer:它是基于 NodePort。
  • ClusterIP:默认的类型,用于为集群内 Pod 访问时,提供的固定访问地址,默认是自动分配地址,可使用 ClusterIP 关键字指定固定 IP。

从上面讲的 Service,我们可以看到一种场景:所有的微服务在一个局域网内,或者说在一个 K8s 集群下,那么可以通过 Service 用于集群内 Pod 的访问,这就是 Service 默认的一种类型 ClusterIP,ClusterIP 这种的默认会自动分配地址。

  那么问题来了,既然可以通过上面的 ClusterIp 来实现集群内部的服务访问,那么如何注册服务呢?其实 K8s 并没有引入任何的注册中心,使用的就是 K8s 的 kube-dns 组件。然后 K8s 将 Service 的名称当做域名注册到 kube-dns 中,每一个Service在kube-dns中都有一条DNS记录,同时,如果有服务的ip更换,kube-dns自动会同步,对服务来说是不需要改动的。通过 Service 的名称就可以访问其提供的服务。那么问题又来了,如果一个服务的 pod 对应有多个,那么如何实现 LB?其实,最终通过 kube-proxy,实现负载均衡。也就是说kube-dns通过 servicename 找到指定 clusterIP,kube-proxy完成通过 clusterIP 到 PodIP 的过程。

说到这,我们来看下 Service 的服务发现与负载均衡的策略,Service 负载分发策略有两种:

  • RoundRobin:轮询模式,即轮询将请求转发到后端的各个 pod 上,其为默认模式。
  • SessionAffinity:基于客户端 IP 地址进行会话保持的模式,类似 IP Hash 的方式,来实现服务的负载均衡。

下面写一个很简单的例子:

apiVersion: v1
kind: Service
metadata:
  name: cas-server-service
  namespace: default
spec:
  ports:
  - name: cas-server01
    port: 2000
    targetPort: cas-server01
  selector:
    app: cas-server

可以看到执行 kubectl apply -f service.yaml 后:

root@ubuntu:~$ kubectl get svc
NAME                          TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)              AGE
admin-web-service             ClusterIP   10.16.129.24    <none>        2001/TCP              84d
cas-server-service            ClusterIP   10.16.230.167   <none>        2000/TCP               67d
cloud-admin-service-service   ClusterIP   10.16.25.178    <none>        1001/TCP         190d

这样,我们可以看到默认的类型是 ClusterIP,用于为集群内 Pod 访问时,可以先通过域名来解析到多个服务地址信息,然后再通过 LB 策略来选择其中一个作为请求的对象。

K8s 如何处理微服务中常用的配置

  接下来我们看看微服务中场景的居多配置该如何来利用K8s实现统一管理。其实,在K8s中,定义了一种资源:ConfigMap,我们来看看这种资源。

  ConfigMap,看到这个名字可以理解:它是用于保存配置信息的键值对,可以用来保存单个属性,也可以保存配置文件。对于一些非敏感的信息,比如应用的配置信息,则可以使用 ConfigMap。

创建一个 ConfigMap 有多种方式如下。

  1. key-value 字符串创建

    kubectl create configmap test-config --from-literal=baseDir=/usr
    

      上面的命令创建了一个名为 test-config,拥有一条 key 为 baseDir,value 为 "/usr" 的键值对数据。

  2. 根据 yml 描述文件创建

    apiVersion: v1
    kind: ConfigMap
    metadata:
    name: test-config
    data:
    baseDir: /usr
    

    也可以这样,创建一个 yml 文件,选择不同的环境配置不同的信息:

    kind: ConfigMap
    apiVersion: v1
    metadata:
    name: cas-server
    data:
    application.yaml: |-
     greeting:
       message: Say Hello to the World
     ---
     spring:
       profiles: dev
     greeting:
       message: Say Hello to the Dev
     spring:
       profiles: test
     greeting:
       message: Say Hello to the Test
     spring:
       profiles: prod
     greeting:
       message: Say Hello to the Prod
    

    注意点:

  • ConfigMap 必须在 Pod 使用其之前创建。
  • Pod 只能使用同一个命名空间的 ConfigMap。

  当然,还有其他更多用途,具体可以参考官网
前面讲述了几种创建ConfigMap的方式,其中有一种在 Java 中常常用到:通过创建 yml 文件来实现配置管理。比如:

kind: ConfigMap
apiVersion: v1
metadata:
  name: cas-server
data:
  application.yaml: |-
    greeting:
      message: Say Hello to the World
    ---
    spring:
      profiles: dev
    greeting:
      message: Say Hello to the Dev
    spring:
      profiles: test
    greeting:
      message: Say Hello to the Test
    spring:
      profiles: prod
    greeting:
      message: Say Hello to the Prod

  这样,当我们启动容器时,通过 --spring.profiles.active=dev 来指定当前容器的活跃环境,即可获取 ConfigMap 中对应的配置。是不是感觉跟 Java 中的 Config 配置多个环境的配置有点类似呢?但是,我们不用那么复杂,这些统统可以交给 K8s 来处理。只需要你启动这一命令即可,是不是很简单?

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
22天前
|
缓存 监控 网络协议
深入解析微服务架构中的服务发现机制
深入解析微服务架构中的服务发现机制
25 1
|
5月前
|
存储 负载均衡 算法
深入理解微服务架构中的服务发现与注册机制
【7月更文挑战第28天】在现代软件开发的复杂性中,微服务架构以其灵活性和可扩展性受到青睐。本文将深入探讨微服务架构的核心组件之一——服务发现与注册机制,分析其工作原理、实现方式及面临的挑战,并结合实际案例,为读者提供全面的理解和应用指南。
|
5月前
|
存储 负载均衡 网络协议
微服务之服务发现机制
微服务的服务发现机制是一种在微服务架构中动态定位服务实例以进行通信的方法。
48 2
|
5月前
|
负载均衡 Apache 开发者
微服务架构中的服务发现与注册机制
【7月更文挑战第4天】在微服务架构的复杂网络中,服务发现与注册是确保各独立服务高效、可靠通信的关键。本文将探讨服务发现与注册的重要性、实现方式及其在现代分布式系统中的应用实践,旨在为后端开发者提供深入理解和实践指南。
|
5月前
|
敏捷开发 存储 设计模式
探索微服务架构中的服务发现与注册机制
在微服务架构的复杂网络中,服务的发现与注册是确保高效通信的关键。本文将深入剖析服务发现与注册的核心原理、主流技术实现及其在现代后端系统中的应用,旨在为开发者提供一套实践指南,以应对动态变化的云环境挑战。 【7月更文挑战第20天】
43 0
|
7月前
|
缓存 负载均衡 中间件
微服务架构下的服务发现与注册机制
【5月更文挑战第23天】在微服务架构的动态环境中,服务实例可能会频繁地上下线。为了维护系统的高可用性和伸缩性,服务发现与注册机制成为了一个关键因素。本文将探讨服务发现与注册的重要性,分析不同的实现策略,并展示如何利用这些机制来优化后端服务的交互流程。通过深入解析服务发现的多种模式及其对系统设计的影响,我们将提供一个清晰的指导,帮助开发者构建更加健壮和灵活的微服务系统。
|
7月前
|
负载均衡 网络协议 数据管理
深入解析Nacos:服务发现、配置管理与更多特性解析
深入解析Nacos:服务发现、配置管理与更多特性解析
800 0
|
NoSQL API Nacos
Nacos是一个开源的微服务架构下的服务发现和配置管理工具,
Nacos是一个开源的微服务架构下的服务发现和配置管理工具,
159 2
|
缓存 Kubernetes 监控
服务发现与配置管理高可用最佳实践
本篇是微服务高可用最佳实践系列分享的开篇,系列内容持续更新中,期待大家的关注。
服务发现与配置管理高可用最佳实践
|
网络协议 Nacos 数据中心
Nacos:服务发现与配置管理利器
在现代分布式系统中,服务的动态发现和配置管理变得越来越重要。Nacos(发音为 "na-kos",中文名:诺克斯)作为一个开源的服务发现和配置管理平台,在这个领域发挥着重要作用。本文将介绍Nacos的基本概念、特性以及在构建可靠分布式系统中的应用。
389 0