akka-Cluster在k8s部署

akka-Cluster:k8s部署

背景:在 Spring Boot 中整合akka集群。现在需要将其部署在k8s中。

以下仅是一个节点的配置过程。若存在多个节点,则需要配置多次。
假设当前项目为3个akka节点。则在kubernetes中结构为:
在这里插入图片描述

代码层面:

  1. 嵌入 启动 managementbootstrap 自动发现代码
    • 可在配置类中(@configurationActorSystem.create 创建 actorSystem
    • 再使用 @Resource 注入;
        public void init(){AkkaManagement.get(actorSystem).start();ClusterBootstrap.get(actorSystem).start();}
  1. 健康检查类:
    • 注意: 在后续的 conf配置时,需要配置该全限定类名
public class MyhealthCheck implements Supplier<CompletionStage<Boolean>> {private final Cluster cluster;public ClusterCheck(ActorSystem system) {cluster = Cluster.get(system);}@Overridepublic CompletionStage<Boolean> get() {return CompletableFuture.completedFuture(cluster.selfMember().status() == MemberStatus.up());}
}

kubernetes.yaml 配置

apiVersion: apps/v1  #必选,版本号,例如v1
kind: Deployment  #必选,Pod
metadata:  #必选,元数据labels: #自定义标签app: appka-testname: appka-testnamespace: appka-1
spec: #必选,Pod中容器的详细定义replicas: 1selector:matchLabels:app: appka-testtemplate:metadata: # 资源的元数据/属性labels: # 设定资源的标签app: appka-testactorSystemName: appka-testspec:containers: #必选,Pod中容器列表- name: appka-test # 容器的名字image: appka-test-k8s:latest # 容器使用的镜像地址readinessProbe:  # Pod 准备服务健康检查设置httpGet: # 通过httpget检查健康,返回200-399之间,则认为容器正常path: "/ready"port: managementperiodSeconds: 10 # 检查间隔时间failureThreshold: 3 # 失败门槛,连接失败5次,pod杀掉,重启一个新的podinitialDelaySeconds: 10 # 表明第一次检测在容器启动后多长时间后开始livenessProbe: # pod 内部健康检查的设置httpGet:path: "/alive"port: managementperiodSeconds: 10failureThreshold: 5initialDelaySeconds: 20ports:  #需要暴露的端口库号列表# akka remoting- name: remotingcontainerPort: 2552 #容器需要监听的端口号protocol: TCP  #端口协议,支持TCP和UDP,默认TCP# akka-management and bootstrap- name: managementcontainerPort: 8558protocol: TCP- name: httpcontainerPort: 8080protocol: TCPenv: #容器运行前需设置的环境变量列表- name: NAMESPACE #环境变量名称valueFrom:fieldRef:fieldPath: metadata.namespace- name: REQUIRED_CONTACT_POINT_NRvalue: "2"---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: pod-readernamespace: appka-1
rules:- apiGroups: [""] # "" indicates the core API groupresources: ["pods"]verbs: ["get", "watch", "list"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: read-podsnamespace: appka-1
subjects:# serviceAccount是用于控制对Kubernetes API的访问的一种身份验证机制。# 每个命名空间默认有一个名为default的服务账号,当你不指定服务账号时,Kubernetes会默认使用这个账号。# 这种指定方式有助于明确哪些资源可以访问,从而提高系统的安全性。# 在某些情况下,可能需要创建和使用自定义的服务账号,以便更好地控制资源的访问。- kind: Username: system:serviceaccount:appka-1:default
roleRef:kind: Rolename: pod-readerapiGroup: rbac.authorization.k8s.io

tips:

  1. appka-test 需要适配自己的项目名
  2. appka-1 命名空间 namespace 需要自己适配
  3. containers.image 容器镜像:需要项目自定义部署
  4. subjects.name: 服务账号;其中 appka-1 是命名空间。若需自定义,需要注意!
  5. kind: Role 角色配置次数选择官网默认。
    1. kubernetes 快速入门:K8S系列一:概念入门 - 知乎
    2. K8S系列二:实战入门 - 知乎
    3. K8S系列三:单服务部署 - 知乎
    4. K8S系列四:服务管理 - 知乎

akka conf 文件配置

  1. coordinated-shutdown.exit-jvm = on
    • 当集群节点看到自己处于 Exit 状态时,CoordinatedShutdown 自动运行,将所有组件和资源关闭,包括终止JVM进程。
  2. allow-java-serialization : 设置 允许使用Java序列化来序列化和反序列化Akka的消息
  3. cluster集群配置:
    1. akka.actor.provider = "cluster" 设置akka集群模式
    2. shutdown-after-unsuccessful-join-seed-nodes
      1. 种子节点无法成功加入的最大 时间
    3. 脑裂配置
    4. contact-point-discovery 节点 发现配置
      1. k8s服务发现的名称:需要自定义
      2. k8s发现方式:本项目采用 kubernetes-api
      3. Akka组成集群最少节点数
    5. health-checks 健康就绪检查
    akka {loglevel = "DEBUG"coordinated-shutdown.exit-jvm = onactor {allow-java-serialization = onprovider = "cluster"}cluster {shutdown-after-unsuccessful-join-seed-nodes = 60sdowning-provider-class = "akka.cluster.sbr.SplitBrainResolverProvider"}}akka.management {cluster.bootstrap {contact-point-discovery {// ; k8s 服务发现的名称, 自定义service-name = "%s"discovery-method = kubernetes-apirequired-contact-point-nr = 2// ; akka组成集群最少节点数required-contact-point-nr = ${?REQUIRED_CONTACT_POINT_NR}}}}akka.management {health-checks {readiness-checks {// ; 健康探测的类example-ready = "com.src.akka.check.MyhealthCheck"}}}

Akka Management HTTP

	Akka Management HTTP 的默认配置适合在 Kubernetes 中使用,它将绑定到 Pod 外部 IP 地址上的默认端口 8558。

配置完成后,需要对不同的节点打jar包,创建对应的docker镜像,进而部署至不同的pod中。

下面是后续需要考虑的问题。(皆来自官网) 

其他存在的问题

配置后 akka-cluster在k8s还可能存在其他问题:

  1. 集群节点发现方式若两者其中有一个挂掉(如:a挂掉),a重新加入集群后,是否产生新的集群?

    1. Akka Cluster Bootstrap

    2. image

  2. 【脑裂】akka cluster split-brain-resolver(SBR)_lease-majority-CSDN博客

    1. k8s 不同的pod ip不一样。若其中一个节点挂掉,重启pod会改变ip,但akka 集群会继续连接该ip

    2. 解决方式:配置相关策略

      1. Akka集群脑裂_akka脑裂-CSDN博客

主要参考官网的部署步骤:
Deploying Akka Cluster to Kubernetes
学习文章:
Akka 集群如何部署到 k8s 中,实现自动发现管理节点 – 墨烟客 – 不只是代码,更是文学

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【python】Ubuntu下安装spyder及matplotlib中文显示

一、查看Ubuntu版本 $ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.3 LTS Release: 22.04 Codename: jammy尝试用cat /etc/debian_version命令&#xff0c;竟然可以显示出来Debian的版本。 $ cat /etc/debian_version …

fastadmin 跳转到输入的指定页面

fastadmin 跳转到输入的指定页面 实现效果&#xff1a; table.on(load-success.bs.table, function (e, tabledata) {var html<li class"jumpto"><input type"text" class"form-control"><button class"btn btn-default&q…

《LIO-SAM阅读笔记》1.IMU预积分模块

前言&#xff1a; LIO-SAM是一个多传感器融合的紧耦合SLAM框架&#xff0c;融合的传感器类型有雷达、IMU和GPS&#xff0c;其中雷达和IMU在LIO-SAM框架中必须使用的。LIO-SAM的优化策略采用了GTSAM库&#xff0c;GTSAM库采用了因子图的优化方法&#xff0c;其提供了一些列C的外…

SpringSecurity安全框架 ——认证与授权

目录 一、简介 1.1 什么是Spring Security 1.2 工作原理 1.3 为什么选择Spring Security 1.4 HttpSecurity 介绍&#x1f31f; 二、用户认证 2.1 导入依赖与配置 2.2 用户对象UserDetails 2.3 业务对象UserDetailsService 2.4 SecurityConfig配置 2.4.1 BCryptPasswo…

第11章 GUI Page436 使用缓冲DC, wxBufferedPaintDC

所谓“缓冲DC”&#xff0c;是指将所有图元都先划到一个人眼看不到的“设备上下文”之上&#xff0c;最后再一次性复制到真正的屏幕DC之上&#xff0c;这样我们就看不到中间画的过程了&#xff0c;也就不会感到闪烁了。 注意&#xff0c;这时不能解除ScrolledWindow1的背景擦除…

Golang实现JAVA虚拟机-运行时数据区

一、运行时数据区概述 JVM学习&#xff1a; JVM-运行时数据区 运行时数据区可以分为两类&#xff1a;一类是多线程共享的&#xff0c;另一类则是线程私有的。 多线程共享的运行时数据区需要在Java虚拟机启动时创建好&#xff0c;在Java虚拟机退出时销毁。对象实例存储在堆区类信…

探索 Vue3 (四) keep-alive缓存组件

keep-alive 的作用 官网介绍&#xff1a;KeepAlive | Vue.js keep-alive为抽象组件&#xff0c;主要用于缓存内部组件数据状态。可以将组件缓存起来并在需要时重新使用&#xff0c;而不是每次重新创建。这可以提高应用的性能和用户体验&#xff0c;特别是在需要频繁切换组件时…

【Linux】僵尸与孤儿 进程等待

目录 一&#xff0c;僵尸进程 1&#xff0c;僵尸进程 2&#xff0c;僵尸进程的危害 二&#xff0c;孤儿进程 1&#xff0c;孤儿进程 三&#xff0c;进程等待 1&#xff0c;进程等待的必要性 2&#xff0c;wait 方法 3&#xff0c;waitpid 方法 4&#xff0c;回收小结…

vue场景 无分页列表条件过滤,子组件多选来自父组件的列表

日常开发中&#xff0c;经常会遇到下面场景&#xff1a; 页面加载一个无分页列表&#xff0c;同时工具栏设置多个条件可对列表过滤的场景(典型的就是关键字模糊查询)父组件传给子组件列表&#xff0c;子组件中需要多选列表多选&#xff0c;选择结果返回父组件 1 无分页列表过…

Tg5032smn:高稳定性105℃高温

TG5032SMN是一款频率范围10MHz ~ 54MHz,具有高稳定的TCXO晶振&#xff0c;可与CMOS或限幅正弦输出。外部尺寸5.0 3.2 1.45mm&#xff0c;超小型,质地轻。该系列晶振的额定工作范围-40℃~&#xfe62;105C内可高稳定性工作&#xff0c;使得信号频率的误差很小。TG5032SMN与其他…

Android Termux安装SSH结合内网穿透实现远程SFTP文件传输

文章目录 1. 安装openSSH2. 安装cpolar3. 远程SFTP连接配置4. 远程SFTP访问4. 配置固定远程连接地址 SFTP&#xff08;SSH File Transfer Protocol&#xff09;是一种基于SSH&#xff08;Secure Shell&#xff09;安全协议的文件传输协议。与FTP协议相比&#xff0c;SFTP使用了…

Linux的安装及管理程序

一、如何在linux安装卸载软件 1. 编译安装 灵活性较高 难度较大 可以安装较新的版本 2. rpm安装&#xff08;redhat&#xff09; linux 包安装 查软件信息&#xff1a;是否安装&#xff0c;文件列表 rpm 软件名 3. yum yum是RPM升级版本&#xff0c;解决rpm的弊端 安装软件 首…