Spring Cloud Kubernetes配置使用详情

news2024/11/15 21:53:15

目录

一、 为什么你需要 Spring Cloud Kubernetes?

二、 Starter

三、 用于 Kubernetes 的 DiscoveryClient

四、Kubernetes 原生服务发现(service discovery)

五、Kubernetes PropertySource 的实现

1、使用 ConfigMap PropertySource


一、 为什么你需要 Spring Cloud Kubernetes?

Spring Cloud Kubernetes提供了众所周知的Spring Cloud接口的实现,允许开发者在Kubernetes上构建和运行Spring Cloud应用。虽然这个项目在构建云原生应用时可能对你有用,但它也不是在Kubernetes上部署Spring Boot应用的必要条件。如果你刚刚开始在Kubernetes上运行你的Spring Boot应用,你只需要一个基本的Spring Boot应用和Kubernetes本身就可以完成很多事情

二、 Starter

Starter 是方便的依赖描述,你可以在你的应用程序中包含它。导入一个Starter,以获得功能集的依赖和Spring Boot自动配置。以 spring-cloud-starter-kubernetes-fabric8 开头的Starter提供了使用 Fabric8 Kubernetes Java 客户端 的实现。以 spring-cloud-starter-kubernetes-client 开头的Starter提供了使用 Kubernetes Java 客户端 的实现。

StarterFeatures

Fabric8 依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-kubernetes-fabric8</artifactId>
</dependency>

Kubernetes Client 依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-kubernetes-client</artifactId>
</dependency>

 Discovery Client 实现,将服务名称(service name)

解析为Kubernetes服务。

Fabric8 依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-kubernetes-fabric8-config</artifactId>
</dependency>

Kubernetes Client 依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-kubernetes-client-config</artifactId>
</dependency>

从Kubernetes ConfigMap 和 Secret 加载应用

application properties。当 ConfigMap 或 Secret

发生变化时,重新加载 application properties。

Fabric8 依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-kubernetes-fabric8-all</artifactId>
</dependency>

Kubernetes Client 依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-kubernetes-client-all</artifactId>
</dependency>

所有 Spring Cloud Kubernetes 的特性。

三、 用于 Kubernetes 的 DiscoveryClient

该项目提供了 Kubernetes 的 Discovery Client 的实现。这个客户端(Client)可以让你按名称查询Kubernetes端点(见 services)。服务通常由Kubernetes API服务器公开,是代表 http 和 https 地址的端点的集合,客户端可以从作为pod运行的Spring Boot应用程序中访问这些端点。

这是你通过在你的项目中添加以下依赖而自动得到的东西。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-kubernetes-discoveryclient</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-kubernetes-fabric8</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-kubernetes-client</artifactId>
</dependency>

要启用 DiscoveryClient 的加载,请将 @EnableDiscoveryClient 添加到相应的配置或 application 类中,如下例所示。

@SpringBootApplication
@EnableDiscoveryClient
public class Application {
  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }
}

然后,你可以通过自动注入将 client 注入你的代码中,如下例所示。

@Autowired
private DiscoveryClient discoveryClient;

你可以通过在 application.properties 中设置以下属性来选择从所有命名空间启用 DiscoveryClient

spring.cloud.kubernetes.discovery.all-namespaces=true

要想只从指定的命名空间发现服务和端点,你应该将属性 all-namespaces 设置为 false,并在 application.properties 中设置以下属性(在这个例子中命名空间是:ns1ns2)。

spring.cloud.kubernetes.discovery.namespaces[0]=ns1
spring.cloud.kubernetes.discovery.namespaces[1]=ns2

要发现未被 kubernetes api 服务器标记为 "ready" 的服务端点地址,可以在 application.properties 中设置以下属性(默认:false):

spring.cloud.kubernetes.discovery.include-not-ready-addresses=true

如果你的服务暴露了多个端口,你将需要指定 DiscoveryClient 应该使用哪个端口。 DiscoveryClient 将使用以下逻辑来选择端口。

  1. 如果该服务有一个标签(label) primary-port-name,它将使用标签值中指定的名称的端口。
  2. 如果没有标签,那么将使用 spring.cloud.kubernetes.discovery.primary-port-name 中指定的端口名称。
  3. 如果以上两项都没有指定,它将使用名为 https 的端口。
  4. 如果上述条件都不满足,它将使用名为 http 的端口。
  5. 作为最后的手段,它将选择端口列表中的第一个端口。

默认情况下,所有的端口和它们的名字将被添加到 ServiceInstance 的元数据(metadata)中。

如果出于任何原因,你需要禁用 DiscoveryClient,你可以在 application.properties 中设置以下属性:

spring.cloud.kubernetes.discovery.enabled=false

一些Spring Cloud组件使用 DiscoveryClient,以获取本地服务实例的信息。要做到这一点,你需要将 Kubernetes 服务名称与 spring.application.name 属性对齐。

Spring Cloud Kubernetes还可以观察Kubernetes服务目录的变化,并相应地更新 DiscoveryClient 实现。我们所说的 "观察"(watch)是指每隔 spring.cloud.kubernetes.discovery.catalog-services-watch-delay 毫秒(默认为30000)发布一个心跳事件。该心跳事件将包含目标引用以及所有端点地址的命名空间(关于返回的确切细节,你可以看看 KubernetesCatalogWatch 内部)。这是一个实现细节,心跳事件的监听者不应该依赖这些细节。相反,他们应该通过 equals 方法查看两个后续心跳之间是否存在差异。我们会注意返回一个正确的实现,遵守 equals 契约。端点将以两种方式进行查询。

  • 所有命名空间 (通过 spring.cloud.kubernetes.discovery.all-namespaces=true 启用)
  • 特定的命名空间 (通过 spring.cloud.kubernetes.discovery.namespaces 启用), 例如:
spring:
  cloud:
    kubernetes:
      discovery:
        namespaces:
          - namespace-a
          - namespace-b

  • 如果不采取上述两种途径,我们将使用 命名空间解析(Namespace Resolution)。

为了启用这个功能,你需要在你的 application 中的配置(configuration)类上添加 @EnableScheduling。 默认情况下,我们使用 Endpoints(见 kubernetes.io/docs/concepts/services-networking/service/#endpoints ) API来查找服务的当前状态。但还有另一种方法,通过 EndpointSlices( kubernetes.io/docs/concepts/services-networking/endpoint-slices/ )。这种支持可以通过一个属性启用:spring.cloud.kubernetes.discovery.use-endpoint-slices=true(默认为 false)。当然,你的集群也必须支持它。事实上,如果你启用了这个属性,但你的集群不支持它,我们将无法启动应用程序。如果你决定启用这种支持,你还需要适当地设置 Role/ClusterRole。例如:

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: namespace-reader
rules:
  - apiGroups: ["discovery.k8s.io"]
    resources: ["endpointslices"]
    verbs: ["get", "list", "watch"]

四、Kubernetes 原生服务发现(service discovery)

Kubernetes 本身能够进行(服务端)服务发现(见: kubernetes.io/docs/concepts/services-networking/service/#discovering-services )。使用原生的kubernetes服务发现确保了与其他工具的兼容性,如Istio( istio.io ),这是一个能够进行负载均衡、断路器、故障转移等的 service mesh。

然后,调用者服务只需引用特定Kubernetes集群中可解析的名称。一个简单的实现可以使用一个指向完整域名(FQDN)的 spring RestTemplate,例如 {service-name}.{namespace}.svc.{cluster}.local:{service-port}。

此外,你还可以将 Hystrix 用于:

通过在 spring boot application 中注解 @EnableCircuitBreaker,在调用方实现断路器。

Fallback 功能,通过用 @HystrixCommand(fallbackMethod=…) 注解相应的方法。

五、Kubernetes PropertySource 的实现

配置Spring Boot应用程序的最常见方法是创建 application.properties 或 application.yaml 或 application-profile.properties 或 application-profile.yaml 文件,其中包含为你的应用程序或Spring Boot Starter 提供定制值的键值对。你可以通过指定系统属性(system properties)或环境变量来覆盖这些属性。

要启用这一功能,你需要在应用程序的配置属性中设置 spring.config.import=kubernetes:目前,你不能使用 spring.config.import 指定要加载的 ConfigMap 或 Secret,默认情况下,Spring Cloud Kubernetes 将根据 spring.application.name 属性加载 ConfigMap 和 / 或 Secret。如果没有设置 spring.application.name,它将加载一个带有 application 名称的 ConfigMap 和 / 或 Secret。

如果你想在启动阶段加载 Kubernetes PropertySource,就像3.0.x版本之前那样,你可以将 spring-cloud-starter-bootstrap 添加到你的应用程序的 classpath 中,或者将 spring.cloud.bootstrap.enabled=true 作为一个环境变量。

1、使用 ConfigMap PropertySource

Kubernetes提供了一种名为 ConfigMap 的资源,以键值对或嵌入式 application.properties 或 application.yaml 文件的形式将参数外部化,以传递给你的应用程序。Spring Cloud Kubernetes Config 项目使Kubernetes ConfigMap 实例在应用程序启动期间可用,并在观察到的 ConfigMap 实例上检测到变化时触发Bean或Spring上下文的热重载。

下面的一切解释主要是指使用 ConfigMap 的例子,但对 Secret 来说也是如此,即:两者都支持每一个功能。

默认行为是基于 Kubernetes ConfigMap 创建 Fabric8ConfigMapPropertySource(或 KubernetesClientConfigMapPropertySource),其 metadata.name 值为Spring应用程序的名称(由其 spring.application.name 属性定义)或在 application.properties 文件中定义的自定义名称,key如下:spring.cloud.kubernetes.config.name。

然而,更高级的配置是可能的,你可以使用多个 ConfigMap 实例。spring.cloud.kubernetes.config.sources 列表使这成为可能。例如,你可以定义以下 ConfigMap 实例:

spring:
  application:
    name: cloud-k8s-app
  cloud:
    kubernetes:
      config:
        name: default-name
        namespace: default-namespace
        sources:
         # Spring Cloud Kubernetes looks up a ConfigMap named c1 in namespace default-namespace
         - name: c1
         # Spring Cloud Kubernetes looks up a ConfigMap named default-name in whatever namespace n2
         - namespace: n2
         # Spring Cloud Kubernetes looks up a ConfigMap named c3 in namespace n3
         - namespace: n3
           name: c3

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

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

相关文章

Unreal Engine 5.1 AI行为树基础入门

ai行为树理解起来其实是npc根据自身一些情况进行一些逻辑执行&#xff0c;而这些逻辑是我们使用ai行为树去实现的。 ai行为树需要一个寻路网格体边界体积&#xff0c;在ue引擎中&#xff0c;体积Actor分为多种&#xff0c;寻路网格体边界体积只是其中的一种。 关于其它的体积&a…

leetcode:448. 找到所有数组中消失的数字(python3解法)

难度&#xff1a;简单 给你一个含 n 个整数的数组 nums &#xff0c;其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字&#xff0c;并以数组的形式返回结果。 示例 1&#xff1a; 输入&#xff1a;nums [4,3,2,7,8,2,3,1] 输出&…

初识网络之https的加密与解密

目录 一、https协议的概念 二、加密的概念 三、为什么需要加密 四、常见的加密方式 1. 对称加密 2. 非对称加密 五、数据摘要&#xff08;数据指纹&#xff09; 六、数据签名 七、加密方案 1. 方案一&#xff1a;只使用对称加密 2. 方案二&#xff1a;只使用非对称加…

院士大咖齐聚蓉城,论道“疑难眼眶病学术论坛”

“全国疑难眼眶病诊疗带教基地”成立&#xff0c;力促“病有所医 ” 大咖云集&#xff0c;这是一场眼科界领军人汇聚一堂&#xff0c;聚焦疑难眼眶病突破性学术成果及前沿技术的高规格论坛; 规模空前&#xff0c;这是一场围绕眼眶病诊疗技术议题深入探讨交流&#xff0c;为我国…

行为型设计模式08-职责链模式

&#x1f9d1;‍&#x1f4bb;作者&#xff1a;猫十二懿 ❤️‍&#x1f525;账号&#xff1a;CSDN 、掘金 、个人博客 、Github &#x1f389;公众号&#xff1a;猫十二懿 职责链模式 1、职责链模式介绍 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;…

seatunnel入门案例,集群模式

目录 安装部署 解压 环境变量 安装plugin 添加资源jar包 SEATUNNEL 配置文件 env&#xff1a;环境设置 source&#xff1a;数据源设置 sink&#xff1a;数据去向设置 transform: 数据转换设置 运行方式 seatunnel 引擎(zeta) 本地模式 集群模式 安装部署 解压 tar…

Centos7在Nginx中配置SSL证书

我的环境 阿里云轻量应用服务器&#xff08;Linux, Centos7.9 x64&#xff09; 一、申请免费SSL证书 一年可以创建20个 下载证书&#xff08;我是Nginx服务器&#xff09; 下载到本地后&#xff0c;打开有两个文件&#xff1a; 二、将SSL证书文件上传至服务器 通过WinScp拖…

图像sensor的特性和驱动解析

1、更换OV9712并且做配置更改和测试 1.1、更改配置脚本 修改Hi3518E_SDK_V1.0.3.0\package\mpp\sample\Makefile.param 1.2、测试运行 运行官方SDK sample的测试版本&#xff08;打包到本地&#xff09; 运行ORTP传输的测试版本&#xff08;RTP实时预览&#xff09; 1.3、更…

如何高效合理规划每天的工作?

如何高效合理规划每天的工作&#xff1f; 〇、基本原则 梳理工作&#xff0c;明确目标。&#xff08;SMART法则&#xff09;轻重缓急&#xff0c;排优先级。&#xff08;四象限管理法则&#xff09;要事第一&#xff0c;尽管去做。&#xff08;GTD 理论&#xff09;限时deadl…

新买的电脑怎么用U盘重装系统?新买的电脑用U盘重装系统教程

新买的电脑怎么用U盘重装系统&#xff1f;用户新买了电脑&#xff0c;想知道怎么用U盘来重装新买的电脑&#xff0c;用U盘来重装电脑其实非常简单&#xff0c;用户需要准备一个U盘&#xff0c;然后完成U盘启动盘的安装&#xff0c;接着按照以下分享的新买的电脑用U盘重装系统教…

[Hadoop安装配置 ]

目录 前言: 执行步骤: 1 创建好目录文件,上传Hadoop版本压缩包,一般都是tar.gz 结尾包 1.1这里压缩包可以直接拖拽到指定虚拟机目录下, 例如xshell连接指定虚拟机, 然后可以拖拽,如果拖拽不了,那就需要设置一下配置, 或者 使用 xftp工具 连接xshell 然后上传文件 2 解压…

pandas---数据合并(concat、append、merge)

1. concat函数 pd.concat([data1, data2], axis1) 按照行或列进行合并&#xff0c;axis0为列索引&#xff0c;axis1为行索引。 df1 make_df([1, 2], [A, B]) df2 make_df([3, 4], [A, B]) display(df1, df2) # 默认上下合并&#xff0c;垂直合并 pd.concat([df1, df2]) …

【机器学习】——学习的基本分类:算法模拟的根本出发点!

目录 引入 一、分类 1、基于学习策略的分类 2、基于所获取知识的表示形式分类 3、按应用领域分类 4、综合分类 二、研究领域 引入 机器学习是继专家系统后人工智能的又一重要研究领域&#xff01;机器学习是研究计算机怎样模拟或实现人类的学习行为&#xff0c;以获取新…

前端面试经验技巧分享

&#x1f469; 个人主页&#xff1a;不爱吃糖的程序媛 &#x1f64b;‍♂️ 作者简介&#xff1a;前端领域新星创作者、CSDN内容合伙人&#xff0c;专注于前端各领域技术&#xff0c;成长的路上共同学习共同进步&#xff0c;一起加油呀&#xff01; ✨系列专栏&#xff1a;前端…

NVIDIA的StyleGAN、StyleGAN2、StyleGAN3系列论文解读,梳理基于风格的生成器架构

通俗来讲就是&#xff0c;张三造假币(Generator生成器)&#xff0c;然后用验钞机去验证真假(Discriminator辨别器)&#xff0c;如果是假的就继续提高造假技术&#xff0c;直到验钞机检验不出来为止&#xff0c;也就是说一个造假一个验假(验钞机也需升级)&#xff0c;两者互相学…

Redis集群部署

Redis集群部署 1.单机安装Redis2.Redis主从集群2.1.集群结构2.2.准备实例和配置2.3.启动2.4.开启主从关系2.5.测试 3.搭建哨兵集群3.1.集群结构3.2.准备实例和配置3.3.启动3.4.测试 4.搭建分片集群4.1.集群结构4.2.准备实例和配置4.3.启动4.4.创建集群4.5.测试4.5.测试 本章是基…

安全 --- 内网基础知识(01)

内网基础知识 &#xff08;1&#xff09;概念 内网也称局域网&#xff08;Local Area Network&#xff0c;LAN&#xff09;是指在某一工作区域内由多台计算机互联形成的计算机组&#xff0c;一般是方圆几千米内。局域网可实现文件管理、应用软件共享、打印机共享、工作内的历…

新一代绿色智慧数据中心电气规划设计与常识(一)

绿色智慧数据中心 随着大数据、云计算、人工智能、区块链、ChatGPT等技术加速创新&#xff0c;数字文化产业发展动力强劲&#xff0c;不断解锁新兴业态。近年来&#xff0c;各级政府重要会议中也多次强调“新基建”今后一段时期驱动新一轮产业革命的战略性新兴产业&#xff0c…

软件测试06:软件测试原则和黑盒测试用例设计方法

软件测试原则 所有测试的标准都是建立在用户需求之上软件测试必须基于"质量第一"的思想去开展各项工作&#xff0c;当时间和质量冲突时&#xff0c;时间要服从质量事先定义好产品的质量标准&#xff0c;只有有了质量标准&#xff0c;才嫩如果根据测试的结果&#xf…

今年找工作真的好难啊,一秒泪崩

在入行前端开发之前&#xff0c;我看过了很多从学校毕业之后一事无成的人&#xff0c;而我心气比较高&#xff0c;接受不了自己也一样浑浑噩噩地过。偶然机会接触到了前端开发&#xff0c;觉得很有意思&#xff0c;思考再三之后&#xff0c;决定去做这件自己喜欢又能有所成就的…