将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的人肯定可以做更多细节性的设置。如果有最佳实践的话,一定请您告诉我!

广告
将在 10 秒后关闭
bannerAds