概念验证:在Kubernetes中部署ABAP
对于将SAP ABAP应用服务器组件容器化和在Kubernetes中部署它们,我们在SPA LinuxLab中做了概念验证(PoC),本文将介绍一些我们的发现和经验。本文会也会指出这项工作的一些潜在的收益和挑战。
作者:Richard Treu, Henning Sackewitz
英文原文:Proof of Concept: Deploying ABAP in Kubernetes
本文链接:https:////www.cnblogs.com/hhelibeb/p/12320295.html
请注意,本文档并非完整解决方案,当前不提供任何产品或开发内容。
参考 SAP note 1122387,可以获取有关当前ABAP应用服务器在容器(-orchestration)中运行的支持文档。
请随意评论和分享本文。
范围
每个ABAP系统都由三层组成:包含数据和程序的数据库,应用服务器和客户端。 此PoC的范围是ABAP应用服务器。
SAP NetWeaver Application Server ABAP可以分解为多个组件,因此它是容器化的主题。 容器化的第一个自然选择是应用服务器实例(AS),因为它们是堆栈中最无状态的部分,并且可以相对轻松地进行扩展。尽管如此,我们选择部署ABAP Central Services的强制性组件,即消息服务器(Message Server)和队列服务器(Enqueue Server
)。 最后,我们还将可选的SAP Web Dispatcher和SAProuter添加到设置中。
底层SAP HANA数据库不在我们的PoC范围之内——它被视为给定的外部资源,可以通过安全存储证书连接。
我们的尝试是上面的组件放到单独的容器镜像里,把它们映射到合适的Kubernetes对象并通过某种方式关联到一起,使之可以良好的发挥Kubernetes的特性。
目标
创建一个通用的ABAP Kubernetes部署,可以集成到任何Kubernetes环境,无论它是on-premise, self-managed的k8s产品(比如CaasP, OpenShift)还是作为公有云服务的k8s产品(比如,GKE)。
安装
Docker镜像和k8s部署文件
在Kubernetes中,应用通过预构建的容器镜像和Kubernetes YAML部署文件分发。
我们的目标是构建通用ABAP镜像。可以使用特定于环境的输入参数来自定义ABAP镜像,输入参数可以通过Kubernetes YAML文件配置。 在部署时,参数被注入到Kubernetes环境中。 例如,HANA数据库连接参数将作为Kubernetes密钥注入。
一些属性是静态的、不可变的值,不能在此PoC中配置:
- SAP系统ID
- SAP实例号
- SAP管理员用户
另外,我们选择了最新的、向后兼容的SAP内核,可以与大多数NetWeaver和S/4 HANA版本一起工作。
部署应用服务器(AS)
ABAP系统中的实际工作负载是在服务器端会话中的应用服务器上执行的。 除了数据库,这是消耗大部分内存和处理能力的地方,因此这是最需要根据工作负载使用Kubernetes伸缩的实体。
随着工作负载的增加,扩展应用程序服务器Pod非常容易,但是如果随意销毁Pod,可能导致系统中的用户会话中断。
我们将应用程序服务器放置在具有一个初始副本的Deployment中。 可以按用户控制的顺序按比例缩小Deployment的大小。和StatefulSet不同,无论实际的用户会话负载如何,StatefulSet都只能按相反顺序的缩减Pod。
-----------------------------------
名词解释:
Pod:https://www.kubernetes.org.cn/kubernetes-pod
StatefulSet: https://www.kubernetes.org.cn/statefulset
Deployment: https://www.kubernetes.org.cn/deployment
-----------------------------------
我们通过“Pod水平自动伸缩”(Horizontal Pod Autoscaler
)逻辑解决了硬关闭问题:根据当前的会话负载给Pod分配优先级注解。当执行缩减的时候,具有最低优先级的服务器会接收到软关机指令,会话会逐渐从该Pod结束。
应用工作进程会产生多个日志文件,sidecar container用于拉日志并把它们转发到每个应用服务器Pod的相应位置。因此日志文件可以持久化,用于分析工作进程失败和随之而来的容器重启。
消息服务器和队列服务器
根据设计,消息服务器是一个单例,队列服务器也是。为了更加灵活,我们为它们创建了单独的容器镜像,但是把它们放在了同一个Pod里,Pod的名字是ASCS(ABAP SAP Central Services)。
应用服务器需要通过静态DNS名访问消息服务器,我们将ASCS Pod放到了一个StatefulSet中,解决了这个问题。
消息服务器基本上无状态,因此容器重启并不重要。队列服务器会保持对表的锁,所以它不是完全无状态的。为了实现队列服务器的高可用,建议启用二级锁服务器,来保持一个锁表的副本。这被称为队列复制,可以通过创建另一个单例Pod实现。然而,这已经不在Poc的范围内了。
SAProuter和Web Dispatcher
为了通过GUI访问系统,SAProuter可以做到将客户端连接到正确的应用服务器。和Kubernetes负载均衡器相比,SAProuter拥有专有的SAP DIAG协议,可以把连接转发给相应的会话。SAProuter是无状态的,可以按需轻松伸缩。它可以被部署为Pod, DaemonSet或Deployment。
最后一个组件是Web Dispatcher,它是一个包含了专有安全特性和端点控制的负载均衡器。它同样是无状态的,可以按需伸缩。因为我们在PoC中只需要一个Web Dispatcher实例,我们把它和消息服务器、队列服务器绑到一个Pod中。
注意:可以跳过Web Dispatcher,使用Kubernetes负载均衡器直接连接应用服务器容器的ICM(Internet Communication Manager)进程。但是从安全角度来考虑,这么做可能有问题,并且会形成一个非标准的SAP安装。
通信和客户端连接
在全部的SAP组件都被组织成为Kubernetes Pod之后,我们必须确定它们彼此间、和外部客户端之间都可以正常通信。
服务
同一个Kubernetes集群中的Pod之间通过服务(Service)通信。由于Kubernetes会在节点(Node)进行自动的端口映射,不同的Pod会通过不同的端口暴露,这允许SAP应用服务器在单一节点扩展时不产生端口冲突。
-----------------------------------
名词解释:
Service: https://www.kubernetes.org.cn/kubernetes-services
-----------------------------------
应用服务器Deployment和ASCS StatefulSet都会封装到Kubernetes服务中。
负载均衡器
外部客户端(SAP GUI,Web浏览器)与服务的连接是通过外部负载均衡器完成的。 负载均衡器类型取决于运行Kubernetes的底层基础架构。 对于本PoC,我们将OpenStack与HAProxy负载平衡器以及裸机基础结构一起使用。 部署负载均衡器需要对IaaS层进行API调用,因此必须配置IaaS-specific Kubernetes Cloud Provider Interface(CPI)。 为简单起见,最后我们使用MetalLB作为负载均衡器。 我们还成功测试了HAProxy和硬件负载均衡器。
外部负载平衡器IP(其DNS可解析的主机名)是所有客户端通信的单一入口点。
负载均衡器实际上并不像其名称所表示的那样工作。 在此设置中,它仅用作外部通信入口点。 实际上,负载是由Web Dispatcher和消息服务器使用SAP登录组(SAP Logon Groups)来分配的。
命名空间
最后,我们将所有SAP Kubernetes对象组织在专用的Kubernetes命名空间“sap”中,以便与其它集群进行逻辑分离。
此外,可以通过将多个SAP实例分配到单独的命名空间(例如, “ sapqa”,“ sapdev”,“ sapprod”)来将它们部署在单个集群上。
PoC架构图
下图展示了所有这些东西是如何结合到一起的,
结论
原则上,可以在Kubernetes环境中运行ABAP。 它允许快速,灵活地部署,尤其是针对测试、开发和培训系统。 由于ABAP应用程序服务器组件的综合架构,会存在一些挑战和与Kubernetes功能的重叠之处,因此必须有对应地解决(例如负载均衡、名称解析、生命周期)。
好处
无需安装过程
在几秒钟内(重新)部署ABAP实例
一键扩展大型系统
自动伸缩应用程序服务器
部署多个相邻landscape
另一个好处是可以在同一环境中简单快速地部署多个ABAP实例。 可以在单个Kubernetes集群中启动ABAP实例,也可以与多个ABAP实例共享Kubernetes集群。 所有ABAP实例都可以通过基础架构(on-premise/self-managed或公有云)提供的负载平衡器地址使用。 Kubernetes还负责端口映射,并通过分配唯一的中间端口来避免在同一节点上具有相同端口的SAP实例之间的冲突。
挑战
自动伸缩与会话粘滞
ABAP体系结构在整个用户会话期间将用户会话上下文保留在一台特定的Dialog实例服务器上,直到用户注销或会话达到超时为止。缩小Dialog实例服务器的规模可能导致终止用户会话。
此外,批处理(也存在于Dialog实例服务器上)也不应该被终止。在这个的PoC中,我们通过优先级机制确定可以终止哪个容器,从而解决了这一问题。
负载均衡机制
Kubernetes的优点之一是在工作节点之间的内置均衡平衡。但是,ABAP根据使用的访问方法(SAP GUI,Web GUI,RFC等)提供了自己的负载平衡和排队机制。因此,存在功能重叠,所以Kubernetes负载均衡只能以受限的方式使用。
系统连接的复杂性增高
容器化和基础架构平台增加了多个网络层,因此从客户端(SAP GUI,浏览器)访问SAP系统比访问裸机系统更为复杂。另一方面,Kubernetes工具提供了持久性地检查系统可用性和网络性能以发现问题的能力。
需要具有兼容的SAP NetWeaver或S/4 HANA内容的数据库
数据库包含ABAP程序,所有业务逻辑和所有客户数据。要将容器化的ABAP系统与特定内核连接,需要兼容的SAP HANA数据库,其中包含正确的初始数据库载荷。
特定应用需求
我们假设SAP应用服务器及其ABAP应用可能有其他要求,例如web service端点,远程系统连接或移动应用程序连接。对于基础架构也可能有一些隐含的假设,例如SAP许可证key的硬件ID; Linux内核参数值等。
概念验证:在Kubernetes中部署ABAP的更多相关文章
- 在 Kubernetes 中部署 Redis 集群
在 Kubernetes 中部署 Redis 集群 在Kubernetes中部署Redis集群面临挑战,因为每个 Redis 实例都依赖于一个配置文件,该文件可以跟踪其他集群实例及其角色.为此,我们需 ...
- Kubernetes入门(四)——如何在Kubernetes中部署一个可对外服务的Tensorflow机器学习模型
机器学习模型常用Docker部署,而如何对Docker部署的模型进行管理呢?工业界的解决方案是使用Kubernetes来管理.编排容器.Kubernetes的理论知识不是本文讨论的重点,这里不再赘述, ...
- Helm, 在Kubernetes中部署应用的利器
一.背景 Kubernetes(k8s)是一个基于容器技术的分布式架构领先方案.它在Docker技术的基础上,为容器化的应用提供部署运行.资源调度.服务发现和动态伸缩等一系列完整功能,提高了大规模容器 ...
- Kubernetes 中部署 NFS-Subdir-External-Provisioner 为 NFS 提供动态分配卷
文章转载自:http://www.mydlq.club/article/109/ 系统环境: 操作系统: CentOS 7.9 Docker 版本: 19.03.13 Kubernetes 版本: 1 ...
- 在Kubernetes中部署GlusterFS+Heketi
目录 简介 Gluster-Kubernetes 部署 环境准备 下载相关文件 部署glusterfs 部署heketi server端 配置heketi client 简介 在上一篇<独立部署 ...
- 在虚拟机环境(CentOS7系统)下将kubernetes中部署服务成功,但在虚拟机外部无法访问到服务
在CentOS7环境下,kubernetes单机版环境,成功部署一个服务,在虚拟机中访问服务没问题,下面这样: curl http://172.27.73.26:8888/eureka-server/ ...
- kubernetes中部署kube-prometheus项目解决ControllerManager与Scheduler无法监控问题
文章转载自:https://www.kococ.cn/20210302/cid=697.html 一.问题描述 在部署 kube-prometheus 到 kubernetes 集群中总会遇到一个问题 ...
- Kubernetes 中部署 MySQL 集群
文章转载自:https://www.cnblogs.com/ludongguoa/p/15319861.html 一般情况下 Kubernetes 可以通过 ReplicaSet 以一个 Pod 模板 ...
- Kubernetes中部署wordpress+mysql(六)
经过前面的内容其实对k8s已经有了服务迁移的能力了,下面这篇文章主要是用来搭建一些后面要用的组件 一.创建wordpress命名空间 kubectl create namespace wordpres ...
随机推荐
- mysql中emoji表情存储
mysql中emoji表情存储 背景 在mysql 5.7.19,创建的数据库默认选择的编码是utf8 -- UTF-8 Unicode,因此字段默认的编码为utf-8,但在项目开发中存在一个需求:在 ...
- wannafly 27 D 巧妙求取约数
链接:https://www.nowcoder.com/acm/contest/215/D来源:牛客网 题目描述 “我不知道你在说什么,因为我只是个pupil.”--绿魔法师 一个空的可重集合S. n ...
- SQLiteOpenHelperde的oncreate方法
main中
- Docker + node(koa) + nginx + mysql 开发环境搭建
什么是Docker Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然 ...
- IDEA中的JUNIT测试
安装插件 Ctrl+Alt+s→Plugins→junitgenerator v2.0 Alt+insert 选中JUnit test 中JUnit4 package test.com.demo.co ...
- java.lang.UnsupportedOperationException: Manual close is not allowed over a Spring managed SqlSession
java.lang.UnsupportedOperationException: Manual close is not allowed over a Spring managed SqlSessio ...
- 大叔 EF 来分析 EntityFrameworks.Data.Core 2
Extensions 1DbCommand拦截器扩展DbCommandInterceptorExtensions 2Class for IQuerable extensions methods Inc ...
- UVA A Spy in the Metro
点击打开题目 题目大意: 在一个有n个站台的地铁线路里,给你列车通向每相邻两个车站所花费的时间,从0时刻开始,从1号站出发,要在T这个时间点上,到达n号站,给你m1辆从1开到n的列车及其出发时间,和m ...
- C#数字图像处理(十四)击中击不中变换 (Hit-miss)
击中击不中变换定义 击中击不中变换(HMT)需要两个结构元素B1和B2,合成一个结构元素对B=(B1,B2) 一个用于探测图像内部,作为击中部分;另一个用于探测图像外部,作为击不中部分.显然,B1和B ...
- [ Python入门教程 ] Python中日期时间datetime模块使用实例
Python中datetime模块提供强大易用的日期处理功能,用于记录程序操作或修改时间.时间计算.日志时间显示等功能.datatime模块重新封装了time模块,提供的类包括date.time.da ...