Spring Cloud Kubernetes使用全解(二)—官方原版

简介: Spring Cloud Kubernetes使用全解(二)—官方原版

六、Kubernetes 生态系统的感知

无论你的应用程序是否在Kubernetes内运行,本指南前面描述的所有功能都同样有效。这对开发和故障排除真的很有帮助。从开发的角度来看,这可以让你启动你的Spring Boot应用,并调试属于这个项目的一个模块。你不需要将其部署在Kubernetes中,因为该项目的代码依赖于 Fabric8 Kubernetes Java客户端,它是一个fluent DSL,可以通过使用 http 协议与Kubernetes服务器的REST API进行通信。

Kubernetes 感知是基于Spring Boot API的,特别是基于 ConditionalOnCloudPlatform。该属性将自动检测你的应用程序当前是否部署在kubernetes中。可以通过 spring.main.cloud-platform 来覆盖该设置。

例如,如果你需要测试一些功能,但不想部署到一个集群,只需设置:spring.main.cloud-platform=KUBERNETES。这将使 spring-cloud-kubernetes 像部署在一个真正的集群中一样行动。

如果你的 classpath 上有 spring-cloud-starter-bootstrap 或者正在设置 spring.cloud.bootstrap.enabled=true,那么你将不得不在 bootstrap.{properties|yml} 中设置 spring.main.cloud-platform(或特定的配置文件)。此外,请注意这些属性:spring.cloud.kubernetes.config.enabledspring.cloud.kubernetes.secrets.enabled 只有在你的 classpath 上有 spring-cloud-starter-bootstrap 或者设置 spring.cloud.bootstrap.enabled=true 时,在 bootstrap.{properties|yml} 中的设置才会生效。

1、3.0.x 中的破坏性变化

在3.0.x之前的Spring Cloud Kubernetes版本中,Kubernetes 感知是通过 spring.cloud.kubernetes.enabled 属性实现的。该属性已被删除,不受支持。相反,我们使用Spring Boot API ConditionalOnCloudPlatform。如果需要明确启用或禁用这一感应,请使用 spring.main.cloud-platform=NONE/KUBERNETES。

2、Kubernetes Profile 的自动配置

当应用程序在Kubernetes内以pod形式运行时,一个名为 kubernetes 的 Spring profile 会自动被激活。这让你可以定制配置,定义Spring Boot应用在 Kubernetes 平台内部署时应用的bean(例如,不同的开发和生产配置)。

3、Istio 感知

当你在应用程序的 classpath 中包含 spring-cloud-kubernetes-fabric8-istio 模块时,一个新的 profile 就会被添加到应用程序中,前提是该应用程序是在安装了 Istio 的Kubernetes集群中运行。然后你可以在你的Bean和 @Configuration 类中使用spring @Profile("istio") 注解。

Istio 感知模块使用 me.snowdrop:istio-client 与 Istio API 交互,让我们发现流量规则、断路器等,使我们的Spring Boot应用能够轻松地消费这些数据,根据环境动态地配置自己。

七、Pod 健康指标

Spring Boot使用 HealthIndicator 来暴露应用程序的健康信息。这使得它在向用户公开与健康有关的信息方面非常有用,并使它很适合作为 readiness 探针 使用。

Kubernetes健康指标(是核心模块的一部分)暴露了以下信息:

    • Pod名称、IP地址、命名空间、服务账户、节点名称及其IP地址。
    • 表示Spring Boot应用程序是在Kubernetes内部还是外部的一个flag。

    你可以通过在 application.[properties | yaml] 中设置 management.health.kubernetes.enabled 为 false 来禁用这个 HealthContributor。

    八、Info Contributor

    Spring Cloud Kubernetes 包括一个 InfoContributor,它将Pod信息添加到Spring Boot的 /info Acturator端点。

    你可以通过在 application.[properties | yaml] 中设置 management.info.kubernetes.enabled 为 false 来禁用这个 InfoContributor。

    九、Leader 选举

    Spring Cloud Kubernetes Leader 选举机制使用Kubernetes ConfigMap 实现了Spring Integration 的 Leader 选举API。

    多个应用程序实例竞争领导权(leadership),但领导权只授予一个。当被授予领导权时,leader 应用程序会收到一个带有 leadership Context 的 OnGrantedEvent application event。应用程序周期性地尝试获得领导权,领导权授予第一个调用者。一个leader将一直是一个leader,直到它被从集群中移除,或者它放弃了它的领导权。当领导权被移除时,前一个 leader 会收到 OnRevokedEvent application event。在移除之后,集群中的任何实例都可以成为新的 leader,包括旧的 leader。

    要在你的项目中包含它,请添加以下依赖:

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

    image.gif

    要指定用于 leader 选举的 configmap 的名称,请使用以下属性:

    spring.cloud.kubernetes.leader.config-map-name=leader

    image.gif

    十、 适用于 Kubernetes 的 LoadBalancer

    该项目包括Spring Cloud Load Balancer,用于基于 Kubernetes Endpoints 的负载均衡,并提供了基于Kubernetes Service的负载均衡器的实现。要将其纳入你的项目,请添加以下依赖 :

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

    image.gif

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

    image.gif

    要启用基于 Kubernetes Service name 的负载均衡,请使用以下属性。然后负载均衡器将尝试使用地址调用应用程序,例如 service-a.default.svc.cluster.local:

    spring.cloud.kubernetes.loadbalancer.mode=SERVICE

    image.gif

    要启用所有命名空间的负载均衡,请使用以下属性。遵守 spring-cloud-kubernetes-discovery 模块的属性。

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

    image.gif

    如果一个服务需要通过HTTPS访问,你需要在你的服务定义中添加一个标签(add)或注解(annotation),名称为 secured,值为 true,然后负载均衡器将使用HTTPS向该服务发出请求。

    十一、Kubernetes 内部的安全配置

    1、命名空间(Namespace)

    本项目中提供的大多数组件都需要知道命名空间。对于Kubernetes(1.3以上),命名空间作为 service account secret 的一部分提供给pod,并由客户端自动检测。对于早期版本,它需要作为环境变量指定给pod。做到这一点的快速方法如下:

    env:
          - name: "KUBERNETES_NAMESPACE"
            valueFrom:
              fieldRef:
                fieldPath: "metadata.namespace"

    image.gif

    2、 Service Account

    对于支持集群内更精细的基于角色的访问的Kubernetes发行版,你需要确保使用 spring-cloud-kubernetes 运行的pod能够访问 Kubernetes API。对于你分配给deployment或pod的任何服务账户(service account),你需要确保它们有正确的角色。

    根据要求,你需要 get、list 和 watch 以下资源的许可

    Table 4. Kubernetes 资源权限

    依赖 资源

    spring-cloud-starter-kubernetes-fabric8

    pods, services, endpoints

    spring-cloud-starter-kubernetes-fabric8-config

    configmaps, secrets

    spring-cloud-starter-kubernetes-client

    pods, services, endpoints

    spring-cloud-starter-kubernetes-client-config

    configmaps, secrets

    出于开发的目的,你可以在你的 default 服务账户中添加 cluster-reader 的权限。在生产系统中,你可能希望提供更细化的权限。

    下面 的Role 和 RoleBinding 是 default 账户的命名空间权限的一个例子:

    kind: Role
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      namespace: YOUR-NAME-SPACE
      name: namespace-reader
    rules:
      - apiGroups: [""]
        resources: ["configmaps", "pods", "services", "endpoints", "secrets"]
        verbs: ["get", "list", "watch"]
    ---
    kind: RoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: namespace-reader-binding
      namespace: YOUR-NAME-SPACE
    subjects:
    - kind: ServiceAccount
      name: default
      apiGroup: ""
    roleRef:
      kind: Role
      name: namespace-reader
      apiGroup: ""

    image.gif

    十二、服务注册的实现

    在Kubernetes中,服务注册由平台控制,应用程序本身并不像在其他平台中那样控制注册。因此,使用 spring.cloud.service-registry.auto-registration.enabled 或设置 @EnableDiscoveryClient(autoRegister=false) 在Spring Cloud Kubernetes中没有效果。

    十三、 Spring Cloud Kubernetes Configuration Watcher

    Kubernetes 提供了 将 ConfigMap 或 Secret 挂载到应用程序的容器中作为卷 的能力。当 ConfigMap 或 Secret 的内容发生变化时, 挂载的卷就会根据这些变化进行更新。

    然而,除非你重新启动应用程序,否则Spring Boot不会自动更新这些变化。Spring Cloud 提供了刷新 application context 的能力,无需重启应用程序,方法是点击 actuator 的 /refresh 端点,或通过使用 Spring Cloud Bus 发布 RefreshRemoteApplicationEvent。

    为了实现在Kubernetes上运行的Spring Cloud应用程序的这种配置刷新,你可以将 Spring Cloud Kubernetes Configuration Watcher controller 部署到你的Kubernetes集群中。

    该应用程序以容器形式发布,可在 Docker Hub 上使用。然而,如果你需要定制配置 watcher 的行为,或者喜欢自己构建镜像,你可以很容易地从 GitHub上的源代码 构建自己的镜像并使用它。

    Spring Cloud Kubernetes Configuration Watcher 可以通过两种方式向应用程序发送刷新通知。

    通过HTTP,在这种情况下,被通知的应用程序必须有 /refresh actuator 端点暴露出来,并且可以从集群内访问。

    使用Spring Cloud Bus,在这种情况下,你将需要在你的集群中部署一个message broker,以便应用程序使用。

    1、 Deployment YAML

    下面是一个 deployment YAML 的样本,你可以用来将 Kubernetes Configuration Watcher 部署到 Kubernetes:

    ---
    apiVersion: v1
    kind: List
    items:
      - apiVersion: v1
        kind: Service
        metadata:
          labels:
            app: spring-cloud-kubernetes-configuration-watcher
          name: spring-cloud-kubernetes-configuration-watcher
        spec:
          ports:
            - name: http
              port: 8888
              targetPort: 8888
          selector:
            app: spring-cloud-kubernetes-configuration-watcher
          type: ClusterIP
      - apiVersion: v1
        kind: ServiceAccount
        metadata:
          labels:
            app: spring-cloud-kubernetes-configuration-watcher
          name: spring-cloud-kubernetes-configuration-watcher
      - apiVersion: rbac.authorization.k8s.io/v1
        kind: RoleBinding
        metadata:
          labels:
            app: spring-cloud-kubernetes-configuration-watcher
          name: spring-cloud-kubernetes-configuration-watcher:view
        roleRef:
          kind: Role
          apiGroup: rbac.authorization.k8s.io
          name: namespace-reader
        subjects:
          - kind: ServiceAccount
            name: spring-cloud-kubernetes-configuration-watcher
      - apiVersion: rbac.authorization.k8s.io/v1
        kind: Role
        metadata:
          namespace: default
          name: namespace-reader
        rules:
          - apiGroups: ["", "extensions", "apps"]
            resources: ["configmaps", "pods", "services", "endpoints", "secrets"]
            verbs: ["get", "list", "watch"]
      - apiVersion: apps/v1
        kind: Deployment
        metadata:
          name: spring-cloud-kubernetes-configuration-watcher-deployment
        spec:
          selector:
            matchLabels:
              app: spring-cloud-kubernetes-configuration-watcher
          template:
            metadata:
              labels:
                app: spring-cloud-kubernetes-configuration-watcher
            spec:
              serviceAccount: spring-cloud-kubernetes-configuration-watcher
              containers:
              - name: spring-cloud-kubernetes-configuration-watcher
                image: springcloud/spring-cloud-kubernetes-configuration-watcher:2.0.1-SNAPSHOT
                imagePullPolicy: IfNotPresent
                readinessProbe:
                  httpGet:
                    port: 8888
                    path: /actuator/health/readiness
                livenessProbe:
                  httpGet:
                    port: 8888
                    path: /actuator/health/liveness
                ports:
                - containerPort: 8888

    image.gif

    Service Account 和相关的角色绑定对于 Spring Cloud Kubernetes 配置的正常工作非常重要。controller 需要读取 Kubernetes 集群中的 ConfigMaps、Pods、Services、Endpoints和Secrets 数据的权限。


    📢文章下方有交流学习区!一起学习进步!也可以前往官网,加入官方微信交流群💪💪💪

    📢创作不易,如果觉得文章不错,可以点赞👍收藏📁评论📒

    📢你的支持和鼓励是我创作的动力❗❗❗

    大家好,欢迎来到Doker品牌,我们专注3C产品。欢迎点赞和评论,您的鼓励是我们持续更新的动力!需要完整资料欢迎加微信进入技术群聊,请前往官网:

    Doker 多克

    官方旗舰店

    Doker多克官方旗舰店

    相关实践学习
    容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
    通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
    云原生实践公开课
    课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务&nbsp;ACK 容器服务&nbsp;Kubernetes&nbsp;版(简称&nbsp;ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
    目录
    相关文章
    |
    6天前
    |
    负载均衡 Java API
    Java一分钟之-Spring Cloud OpenFeign:声明式服务调用
    【6月更文挑战第9天】Spring Cloud OpenFeign是声明式服务调用库,简化了微服务间调用。通过动态代理,它允许开发者用Java接口调用HTTP服务,支持服务发现、负载均衡。本文介绍了OpenFeign的基本概念,展示了如何添加依赖、开启客户端和定义服务接口。还讨论了接口调用失败、超时重试和日志配置等问题及其解决方案,并提供了自定义Feign配置的代码示例。通过学习,读者可以更好地在微服务架构中使用OpenFeign进行服务通信。
    158 4
    |
    7天前
    |
    消息中间件 负载均衡 Java
    Java一分钟之-Spring Cloud:微服务架构工具集
    【6月更文挑战第8天】本文介绍了Spring Cloud的核心组件,包括Eureka(服务注册与发现)、Ribbon(客户端负载均衡)、Zuul(API网关)、Hystrix(断路器)、Spring Cloud Config(配置中心)和Spring Cloud Bus(事件总线)。文中强调了各组件的易错点,如Eureka的服务注册失败、Ribbon的配置、Zuul的路由错误、Hystrix的启用及配置、Config Server的加载失败和Bus的通讯问题,并给出了相应的代码示例和解决建议。在实际开发中,关注日志和使用调试工具是保证微服务系统稳定运行的关键。
    89 6
    |
    1天前
    |
    Java 数据库 开发者
    深入解析 Spring Cloud Seata:分布式事务的全面指南
    深入解析 Spring Cloud Seata:分布式事务的全面指南
    11 1
    |
    1天前
    |
    监控 Java API
    深入解析 Spring Cloud Sentinel:分布式系统流量控制与熔断降级的全面指南
    深入解析 Spring Cloud Sentinel:分布式系统流量控制与熔断降级的全面指南
    5 0
    深入解析 Spring Cloud Sentinel:分布式系统流量控制与熔断降级的全面指南
    |
    1天前
    |
    Java Nacos 数据格式
    Spring Cloud Nacos 详解:服务注册与发现及配置管理平台
    Spring Cloud Nacos 详解:服务注册与发现及配置管理平台
    13 3
    |
    1天前
    |
    负载均衡 Java API
    Spring Cloud Gateway 详解:构建高效的API网关解决方案
    Spring Cloud Gateway 详解:构建高效的API网关解决方案
    5 0
    |
    3天前
    |
    负载均衡 前端开发 Java
    OpenFeign:Spring Cloud声明式服务调用组件
    该文本是关于OpenFeign在Spring Cloud中的使用的问答总结。涉及的问题包括:OpenFeign是什么,Feign与OpenFeign的区别,如何使用OpenFeign进行远程服务调用,OpenFeign的超时控制以及日志增强。OpenFeign被描述为Spring官方的声明式服务调用和负载均衡组件,它支持使用注解进行接口定义和服务调用,如@FeignClient和@EnableFeignClients。OpenFeign与Feign的主要区别在于OpenFeign支持Spring MVC注解。超时控制通过Ribbon进行设置,默认超时时间为1秒。
    |
    5天前
    |
    Java API 开发者
    Java一分钟之-Spring Cloud Gateway:API网关
    【6月更文挑战第10天】Spring Cloud Gateway是Spring Cloud生态中的API网关组件,基于Spring Framework 5、Reactor和Spring Boot 2.0,支持响应式编程。它提供路由转发、过滤器链(包括预处理、路由和后处理)和断言功能。快速入门涉及添加相关依赖和配置路由规则。常见问题包括路由冲突、过滤器顺序和性能瓶颈。通过动态路由和过滤器示例,展示了其灵活性。Spring Cloud Gateway是微服务架构的有力工具,可提升系统稳定性和开发效率。
    111 0
    |
    6天前
    |
    监控 Java UED
    Java一分钟之-Spring Cloud Netflix Hystrix:容错管理
    【6月更文挑战第9天】Spring Cloud Hystrix是用于微服务容错管理的库,通过断路器模式防止服务雪崩。本文介绍了Hystrix的基本概念,如断路器、线程隔离和fallback机制,并展示了如何快速上手,包括添加依赖、启用注解和编写Hystrix命令。此外,还讨论了常见问题(如断路器打开、资源泄漏和不当的Fallback策略)及其解决方案。通过自定义Hystrix指标监控,可以进一步优化系统性能。理解Hystrix工作原理并适时调整配置,对于构建健壮的微服务至关重要。
    113 3
    |
    6天前
    |
    缓存 负载均衡 Java
    Java一分钟之-Spring Cloud Netflix Ribbon:客户端负载均衡
    【6月更文挑战第9天】Spring Cloud Netflix Ribbon是客户端负载均衡器,用于服务间的智能路由。本文介绍了Ribbon的基本概念、快速入门步骤,包括添加依赖、配置服务调用和使用RestTemplate。此外,还讨论了常见问题,如服务实例选择不均、超时和重试设置不当、服务列表更新不及时,并提供了相应的解决策略。最后,展示了如何自定义负载均衡策略。理解并正确使用Ribbon能提升微服务架构的稳定性和效率。
    75 3