将Yellowfin在EKS的Kubernetes中进行集群化,并使用黏性会话来运行
首先
我打算在Kubernetes上将Yellowfin进行集群处理,并查看了Yellowfin官方Wiki中有关使用负载均衡的Kubernetes引入页面,但由于负载均衡器使用了Traefik,或者不太理解清单的编写方式,所以尝试使用AWS的EKS来运行Yellowfin。以下是我的尝试记录。
首要的準備
kubectl的安装
安装用于运行Kubernetes的标准命令。这在AWS上运行Kubernetes之前就是必需的。
虽然这是AWS官方链接,但我们将参考此链接来安装kubectl。
kubectl的安装或更新
官方文档中也有写到,您需要使用与Amazon EKS集群控制平面的小版本最多相差1个的kubectl版本。例如,1.22 kubectl客户端可在Kubernetes 1.21、1.22和1.23集群上运行。
eksctl的安装
我们将安装创建AWS EKS集群所需的命令。可以通过官方链接参考进行安装。安装或更新eksctl。
创建数据库存储库。
应用程序使用容器映像,但需要先在数据库服务器上设置存储库数据库。因此,必须首先在数据库服务器上安装Yellowfin以构建存储库数据库。按照Yellowfin安装步骤进行安装。然后,启动并关闭一次以展开文件,准备完毕。
由于在安装过程中指定了存储库数据库的设置,所以需要将其写入后续清单的设置中。请记下Yellowfin安装文件夹/appserver/webApps/ROOT/WEB-INF/web.xml中与数据库相关的部分。
无论如何创建集群。
通过使用eksctl创建集群来开始使用Amazon EKS。如果在这一步权限不足(可能需要创建角色)或需要创建kubeconfig,则可以参考启用对集群的IAM用户和角色访问,以及创建或更新Amazon EKS集群的kubeconfig文件等方法。
此外,我记得可能还需要AWSCLIv2,但很抱歉,由于开始尝试已经变得很长,我已经记不清楚了。如果需要的话,请参考这里。
安装 AWS 负载均衡器控制器的插件。
为了创建Ingress,我想在AWS上使用应用程序负载均衡器,所以我会安装这个作为AWS插件提供的插件。如果没有这个插件,似乎无法使用AWS的负载均衡器,如果不知道它的存在,可能会很难找到。我不知道其他Azure或Google的集群,但在AWS集群中似乎是必要的设置。
清单文件
我想传达的信息是在这里。然而,重要的部分只是关于Ingress的annotations。在我自己尝试但失败的时候,我不知道有插件可用,也不知道如何编写使这个粘性会话成为可能的annotation,所以困扰了很久。
在官方文档中,这个部分以很小的字体显示,终于找到了描述。
我认为在除了AWS以外的环境中,只需添加与这个描述相对应的设置,就可以实现粘性会话。官方文档中使用了一个名为Traefik的反向代理,但由于我对此不熟悉,所以选择在ALB上进行设置。
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/target-group-attributes: stickiness.enabled=true
alb.ingress.kubernetes.io/target-type: ip
请看这里,这就是包含了所有内容的宣言文件。
请从之前备忘录中记录的web.xml中直接提取Deployment的DB配置部分。根据其他应用程序的负载情况,我们可能需要对内存和任务数量等进行调整。
---
### Yellowfin Cluster Service ###
apiVersion: v1
kind: Service
metadata:
name: yellowfin-cluster
spec:
type: NodePort
ports:
- protocol: TCP
name: web
port: 80
targetPort: 8080
selector:
app: yellowfin-cluster
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: yellowfin-cluster-ingress-alb-instance
annotations:
kubernetes.io/ingress.class: alb
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/target-group-attributes: stickiness.enabled=true
alb.ingress.kubernetes.io/target-type: ip
spec:
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: yellowfin-cluster
port:
number: 80
---
### Yellowfin Cluster Deployment ###
kind: Deployment
apiVersion: apps/v1
metadata:
namespace: default
name: yellowfin-cluster
labels:
app: yellowfin-cluster
spec:
replicas: 2
selector:
matchLabels:
app: yellowfin-cluster
template:
metadata:
labels:
app: yellowfin-cluster
spec:
containers:
- env:
- name: APP_MEMORY
value: "6144"
- name: CLUSTER_PORT
value: "7800"
- name: JDBC_CLASS_NAME
value: org.postgresql.Driver
- name: JDBC_CONN_ENCRYPTED
value: "false"
- name: JDBC_CONN_PASS
value: password
- name: JDBC_CONN_URL
value: jdbc:postgresql://test.jp:5432/yellowfinDB
- name: JDBC_CONN_USER
value: yellowfin
- name: NODE_BACKGROUND_TASKS
value: REPORT_BROADCAST_BROADCASTTASK,REPORT_BROADCAST_MIREPORTTASK,FILTER_CACHE,SOURCE_FILTER_REFRESH,SOURCE_FILTER_UPDATE_REMINDER,THIRD_PARTY_AUTORUN,ORGREF_CODE_REFRESH,ETL_PROCESS_TASK,SIGNALS_DCR_TASK,SIGNALS_ANALYSIS_TASK,SIGNALS_CLEANUP_TASK,COMPOSITE_VIEW_REFRESH,SIGNALS_CORRELATION_TASK
- name: NODE_PARALLEL_TASKS
value: 4,4,4,4,4,4,4,4,4,4,4,4,4
name: yellowfin-cluster
image: yellowfinbi/yellowfin-app-only:9.7.0
ports:
- name: web
containerPort: 8080
---
日志相关
由于当前的设置可能会导致启动后的Yellowfin日志等丢失,因此AWS官方建议使用Fluentd将日志转存到某个地方。但是,我还没有进行验证。据Yellowfin推荐,似乎他们偏向使用Elastic Cloud。
关于版本更新
只需要给容器端变更镜像版本即可,但是对于数据库来说,如果不使其与目标版本相一致,就无法进行正常操作。所以,数据库仍需使用以往的更新文件,只对数据库进行升级。在官方维基上,可以在此页面找到相关信息。
java -jar yellowfin-20200701-update.jar -silent option.upgrade=database jdbcUser=Yellowfin_DB_Admin jdbcPassword=Yellowfin_DB_PASSWORD jdbcURL=jdbc:mysql://TARGET_DATABASE:3306/yellowfin
結束
由于对使用Kubernetes进行操作不太熟悉,我觉得在集群中运行也走了很多弯路。不过,在AWS上进行了一次建设,这是一个好的开端。我相信了解Kubernetes的人肯定可以做更多细节性的设置。如果有最佳实践的话,一定请您告诉我!