🦅

Pravegaをk8s上で動作させる

2021/12/23に公開

Pravegaの動作確認をいろいろやろうとしてた、特にスケーラビリティの確認をしたかったのでk8s上で動作させたかった。
2021/12時点での最新バージョンで動作しようとしたらドキュメントから一部変えないといけないとことかあったので導入手順をまとめます。

AWS上のEKSでPravegaを構築して、Long term storage(Tier2 Storage)としてEFSを利用, 最後にcliから動作確認する部分までを記載します

各種バージョンなど

ソフトウェア バージョン
eksctl 0.76.0
k8s 1.21
helm v3.4.2
pravega 0.10.1
zookeeper[1] 0.2.13
bookkeeper[2] 0.10.1
// 各種最新のバージョン
$ helm search repo pravega
NAME                            CHART VERSION   APP VERSION     DESCRIPTION
pravega/pravega                 0.10.2          0.10.1          Pravega Helm chart for Kubernetes
pravega/pravega-bk              0.7.1           0.7.1           Pravega Helm chart for Kubernetes
pravega/pravega-operator        0.6.1           0.5.5           Pravega Operator Helm chart for Kubernetes
pravega/bookkeeper              0.10.2          0.10.1          Bookkeeper Helm chart for Kubernetes
pravega/bookkeeper-operator     0.2.1           0.1.6           Bookkeeper Operator Helm chart for Kubernetes
pravega/zookeeper               0.2.13          0.2.13          Zookeeper Helm chart for Kubernetes
pravega/zookeeper-operator      0.2.13          0.2.13          Zookeeper Operator Helm chart for Kubernetes

前提条件

  • すでにEKSクラスタ構築済み
  • kubectlで作成済みのEKSクラスタに接続可能

参考に自分では下記のようなクラスタを構築しました

apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
  name: pravega-cluster
  region: ap-northeast-1
vpc:
  id: "vpc-****"
  subnets:
    private:
      ap-northeast-1a:
        id: "subnet-****"
      ap-northeast-1c:
        id: "subnet-****"
      ap-northeast-1d:
        id: "subnet-****"
  clusterEndpoints:
    publicAccess: true
    privateAccess: true

nodeGroups:
  - name: pravega-cluster-ng
    instanceType: t3.xlarge
    desiredCapacity: 3
    maxSize: 5
    minSize: 1
    volumeSize: 30
    privateNetworking: true

Pravegaの構築

Cert-manager のインストール

kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v0.14.2/cert-manager.yaml

Zookeeper のインストール

pravega関連チャートを更新しておく

helm repo add pravega https://charts.pravega.io
helm repo update

zookeeper のインストール

helm install zookeeper-operator pravega/zookeeper-operator --version=0.2.13
helm install zookeeper pravega/zookeeper --version=0.2.13

ちなみにzookeeprのreplica数を変更したい場合は下記のように指定して作成してください
(デフォルトだと3つのreplicaが作成されます)

helm install zookeeper pravega/zookeeper --version=0.2.13 --set replicas=5

さらに細かく設定を変更したい場合は、一度チャートをダウンロードしてvalues.yamlを変更後にinstallしてください

helm pull pravega/zookeeper --version=0.2.1
tar xzvf zookeeper-0.2.13.tgz
// 設定を変更する
vi zookeeper/values.yaml
// デプロイする
helm install zookeeper ./zookeeper

Bookkeeper のインストール

Bookkeeprはドキュメント通りデプロイすると動かないので少し弄ります。
まず https://github.com/pravega/bookkeeper-operator/blob/v0.1.6/deploy/certificate.yaml を取得した後にnamespaceをbookkeeper-operatorに変更しておきます。このファイル名はbookkeeper-cert.yamlとします

apiVersion: cert-manager.io/v1alpha2
kind: Issuer
metadata:
  name: selfsigned-issuer-bk
  namespace: bookkeeper-operator
spec:
  selfSigned: {}
---
apiVersion: cert-manager.io/v1alpha2
kind: Certificate
metadata:
  name: selfsigned-cert-bk
  namespace: bookkeeper-operator
spec:
  secretName: selfsigned-cert-tls-bk
  commonName: bookkeeper-webhook-svc.bookkeeper-operator.svc.cluster.local
  dnsNames:
    - bookkeeper-webhook-svc
    - bookkeeper-webhook-svc.bookkeeper-operator.svc.cluster.local
    - bookkeeper-webhook-svc.bookkeeper-operator.svc
  issuerRef:
    name: selfsigned-issuer-bk

これでデプロイしていきます。

kubectl create ns bookkeeper-operator
kubectl apply -f bookkeeper-cert.yaml
helm install bookkeeper-operator pravega/bookkeeper-operator --version=0.2.1 -n bookkeeper-operator
helm install bookkeeper pravega/bookkeeper --version=0.10.2

こちらも同様にreplica数や設定をいじりたい場合はzookeeper同様に--setで指定できたり、pullで一度落としたりが可能です。

Tier2 Storage用のEFS Volumeの作成

本当はS3でやりたいのですが、ドキュメントの記載がほぼなく、設定がよくわからなかったのでEFSでやりました。
S3で動作できるようになったらまた記事書きます。

EFSをk8sのPVCで参照できるようにしていきます。下記の記事を参考にさせてもらいました。

EFS csiドライバーのインストール

kubectl apply -k "github.com/kubernetes-sigs/aws-efs-csi-driver/deploy/kubernetes/overlays/stable/ecr/?ref=release-1.1"

デプロイしているVPCのCIDRを確認

aws eks describe-cluster --name <EKSのcluster名> --query "cluster.resourcesVpcConfig.vpcId" --output text
// 出力
-> vpc-*********
aws ec2 describe-vpcs --vpc-ids <vpc-*********> --query "Vpcs[].CidrBlock" --output text
// 出力
-> xxx.xxx.xxx.xxx/xx

EFS用のsgを作成

先程確認したVPCのidを指定しています。作成されたsgのidは後ほど参照するのでメモっておいてください

aws ec2 create-security-group --description efs-test-sg --group-name efs-sg --vpc-id <vpc-*********>
// 出力
{
    "GroupId": "sg-*********"
}

ingress rule を追加します。
作成したsgのidと確認したVPCのCIDRを指定します

aws ec2 authorize-security-group-ingress --group-id <sg-*********> --protocol tcp --port 2049 --cidr <xxx.xxx.xxx.xxx/xx>

EFSを作成

FileSystemIdは後に参照するためメモっておいてください

aws efs create-file-system --creation-token eks-efs
// 出力
{
...
    "FileSystemId": "fs-*******",
...
}

マウントさせます。eksctlで指定したEKSのノードが動く可能性があるsubnet全てに対して下記を実施します。(自分の環境だとaz1つ毎に1subnetあり、3azで運用していたので、下記を3つのsubnetに対して実施しました。

aws efs create-mount-target --file-system-id <fs-*******> --subnet-id <subnet-******> --security-group <先程作成しておいたEFS用のsgのid>

最後に上で作成したEFSを利用するk8sのstorageclass, pvc, pvを作成しておきます。
pvcの名前は後にpravegaが参照されます。楽なようにpravegaのhelm chartのデフォルト値を設定しておきます

pravega-tier2-storage.yamlというファイルを作成します
pvのvolumeHandleの値を作成したEFSのFileSystemIdに変更しておきます。

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: efs-sc
provisioner: efs.csi.aws.com
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: efs-pv
spec:
  capacity:
    storage: 20Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  storageClassName: efs-sc
  csi:
    driver: efs.csi.aws.com
    # ここの値を自前で作成したEFSの値に変更すること
    volumeHandle: fs-************
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pravega-tier2
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: efs-sc
  resources:
    requests:
      storage: 20Gi

編集後デプロイします

kubectl apply -f pravega-tier2-storage.yaml

Pravegaのインストール

operatorをインストール

helm install pravega-operator pravega/pravega-operator --version=0.6.1

証明書をデプロイ

kubectl create -f https://raw.githubusercontent.com/pravega/pravega-operator/master/deploy/certificate.yaml

pravegaインストール

helm install pravega pravega/pravega --version=0.10.2

cert-managerの関係かinstall失敗することがあります。
その場合は一度uninstallして再度作成するとうまくいったりします

helm uninstall pravega
helm install pravega pravega/pravega --version=0.10.2

Pravegaの動作確認

全てインストールできたら下記のようにPodが起動しているはずです

$ kubectl get po
NAME                                          READY   STATUS    RESTARTS   AGE
bookkeeper-bookie-0                           1/1     Running   0          12m
bookkeeper-bookie-1                           1/1     Running   0          12m
bookkeeper-bookie-2                           1/1     Running   0          12m
bookkeeper-operator-98dcb8777-w8ns6           1/1     Running   0          13m
pravega-operator-668bb8b68f-kwjdx             1/1     Running   0          10m
pravega-pravega-controller-64d4f8d75b-nhfwp   1/1     Running   0          2m32s
pravega-pravega-segment-store-0               1/1     Running   0          2m32s
zookeeper-0                                   1/1     Running   0          16m
zookeeper-1                                   1/1     Running   0          15m
zookeeper-2                                   1/1     Running   0          14m
zookeeper-operator-78675f5c56-hhm7b           1/1     Running   0          16m

pravega-cli を利用した動作確認をしていきます。

参考手順は下記

k8s内のpodで動いているsegment-store内にpravega-cliがインストールされているのでそれを利用します。

// segment-storeにshログインする
$ kubectl exec pravega-pravega-segment-store-0 -it -- sh

// Pod内, pravega-cliを起動
/opt/pravega # ./bin/pravega-cli
...

// まず接続先を指定
// ドキュメントだと10080ポートを指定してるけど、9090じゃないと動作しなかった
> config set controller-uri=pravega-pravega-controller.default.svc.cluster.local:9090

// scopeとstreamを作成
> scope create my-scope
Scope 'my-scope' created successfully.

> stream create my-scope/my-stream
Stream 'my-scope/my-stream' created successfully.

// streamにeventを追加
> stream append my-scope/my-stream 5
Appending 5 Event(s) with payload prefix 'bb67259c-31b1-43eb-ab7e-66aa10e404af' having routing key 'null'.
Done.

// eventをstreamから取得
> stream read my-scope/my-stream
Press 'q <enter>' to cancel ongoing operation.
	bb67259c-31b1-43eb-ab7e-66aa10e404af_2
	bb67259c-31b1-43eb-ab7e-66aa10e404af_4
	bb67259c-31b1-43eb-ab7e-66aa10e404af_0
	bb67259c-31b1-43eb-ab7e-66aa10e404af_1
	bb67259c-31b1-43eb-ab7e-66aa10e404af_3
q
Done.

ストリームへの書き込みと読み込みまで確認できた。

脚注
  1. pravegaのhelmで管理されているバージョンです ↩︎

  2. pravegaのhelmで管理されているバージョンです ↩︎

Discussion