0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

YellowfinをEKSのKubernetesでクラスター化してスティッキーセッションで動かす

Posted at

はじめに

YellowfinをKubernetesでクラスター化する際に公式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 のインストールまたは更新

リポジトリDBの作成

アプリ側はコンテナのイメージを使用しますが、リポジトリDBは事前にDBサーバーに設定しておく必要があります。そのため、一度はDBサーバーにリポジトリDBを構築するためにをYellowfinをインストールしなければなりません。Yellowfinインストール手順を参考にインストールします。その後ファイルを展開するために一度起動し、終了させて準備OKです。
このインストール時に指定したリポジトリDBの設定を後のマニフェスト上に書くことになるので、Yellowfinインストールフォルダ/appserver/webApps/ROOT/WEB-INF/web.xmlの中のDBに関する部分をメモしておきます。

とにかくクラスターを作成

Amazon EKS の開始方法 – eksctlからクラスターを作成します。この時点で権限が足りない場合(ロールを作る必要があるかも)やkubeconfigを作成しなければならない場合はクラスターへの IAM ユーザーおよびロールアクセスを有効にするAmazon EKS クラスターの kubeconfig ファイルを作成または更新するなどを参考にしてみてください。
他にもAWSCLIv2が必要だったような気がしますが、すみません、試行し始めて長くなっていたので覚えていません。。必要そうであればここを参考に入れてください。

AWS Load Balancer Controller アドオンのインストール

Ingressを作成する際に、AWSのアプリケーションロードバランサーを使用したいので、AWSではアドオンとして提供されているこのアドオンをインストールします。これがなければAWSのロードバランサーが使えないらしく、存在を知らなかったらなかなかたどり着けなかったなという感じです。他のAzureやGoogleのクラスターではわかりませんが、AWSのクラスターでは必須の設定と言えそうです。

マニフェストファイル

一番伝えたい情報がここです。とはいえ、重要な部分はIngressのannotationsの部分だけです。自分で試していてできなかった頃はアドオンを知らなかったことと、このスティッキーセッションを可能にするannotationの書き方がわからず苦戦していました。。
公式には、ここのサイトの部分に小さく載っていて、やっと記述を見つけることができました。
AWS以外の環境だとこの記述相当の設定を追加すればスティッキーセッションが可能なんじゃないかと思います。公式ではTraefikというリバースプロキシを使っていましたが、全く詳しくないためALBでの設定にしました。

annotation.yaml
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-group-attributes: stickiness.enabled=true
    alb.ingress.kubernetes.io/target-type: ip

そして全てをひっくるめたマニフェストファイルがこちらです。
DeploymentのDBの設定部分は前にメモしたweb.xmlからそのまま引っ張ってきてください。その他アプリケーションの負荷によってはメモリやタスクの数などの調整をします。

cluster.yml
---
### 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を推しているらしいです。

バージョンアップについて

コンテナ側についてはimageのバージョンを変えてあげればよいのですが、DBはDBで対象のバージョンを一致させて上げてあげないと正常な操作はできません。そのため、DBのほうはこれまで通りのアップデートファイルを使用して、DBのみのバージョンアップをする必要があります。公式のwikiだとこのページになります。

DBverup.sh
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詳しい方はもっと細かい設定を追加できるんだろうなと思います。ベストプラクティスがあったらぜひ教えていただきたいです!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?