Pravegaをk8s上で動作させる
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で参照できるようにしていきます。下記の記事を参考にさせてもらいました。
- https://aws.amazon.com/jp/premiumsupport/knowledge-center/eks-persistent-storage/
- https://qiita.com/yuta_vamdemic/items/7ffd051361afdc9719d4
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 を利用した動作確認をしていきます。
参考手順は下記
- https://github.com/pravega/pravega/blob/master/cli/user/README.md
- https://pravega.io/docs/nightly/getting-started/quick-start/
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.
ストリームへの書き込みと読み込みまで確認できた。
Discussion