Slide 1

Slide 1 text

CNCF Sandbox Project CloudNative Days Kansai Eve 2019.11.27 Cyberblack28

Slide 2

Slide 2 text

Profile Twitter:cyberblack28 Hatena Blog:https://cyberblack28.hatenablog.com/ SpeakerDeck:https://speakerdeck.com/cyberblack28 Job Educational Solution Architect Developer Advocate / Technical Evangelist Infrastructure Engineer Frontend Engineer Community & Certification Publications #deepcn #rancherjp CKA KCM100 CKAD 2018 2019

Slide 3

Slide 3 text

Agenda •What’s Longhorn ? •Longhorn Deep Dive •Let’s try Longhorn

Slide 4

Slide 4 text

What’s Longhorn ?

Slide 5

Slide 5 text

What’s Longhorn ? Cloud-native Distributed Block Storage for Kubernetes.

Slide 6

Slide 6 text

What’s Longhorn ? Developed by Rancher Labs since 2017

Slide 7

Slide 7 text

What’s Longhorn ? • Intro to Longhorn: Open Source Cloud-Native Distributed Block Storage Built On and For K8s - Sheng Yang, Rancher Labs KubeCon + CloudNativeCon NA 2019 https://static.sched.com/hosted_files/kccncna19/8b/Longhorn-KubeCon-NA-ppt-2019.pdf https://www.youtube.com/watch?v=hvVnfZf9V6o

Slide 8

Slide 8 text

What’s Longhorn ? Longhorn Accepted into CNCF 2019.10.29 Sandbox Project

Slide 9

Slide 9 text

What’s Longhorn ? 1. 単⼀障害点のないエンタープライズグレード︖の分散ストレージ 2. ブロックストレージの増分スナップショット 3. NFSまたはS3互換オブジェクトストレージへのバックアップ 4. スナップショットとバックアップの循環実装 5. ⾃動化された無停⽌アップグレード。実⾏中のボリュームを中断することな く、Longhornソフトウェアスタック全体をアップグレード可能 6. 直感的なGUIダッシュボード Features

Slide 10

Slide 10 text

What’s Longhorn ? • ベータ品質のソフトウェア • 最新バージョンは、v0.7.0.(2019年11⽉現在) Current status • Longhorn CRD APIバージョンがlonghorn.rancher.io/v1alpha1からlonghorn.io/v1beta1にアップグレード • ノードの再起動、Dockerの再起動、Kubernetesのアップグレードなどが原因でデタッチが発⽣した場合、ボ リュームを⾃動的に再接続可能 • コンテナストレージインターフェイス(CSI)v1.1.0、rawブロックボリュームのサポート • K3S v0.10.0+ • NFSv4.1サポート Release Note

Slide 11

Slide 11 text

What’s Longhorn ? 1. Docker v1.13以上 2. Kubernetes v1.14以上 3. open-iscsi が、Kubernetesクラスターのすべてのノードにインストールされている必要がある GKE: open-iscsi がすでに含まれているUbuntuのゲストイメージを推奨 Debian / Ubuntu: 「apt-get install open-iscsi」を使⽤してインストール RHEL / CentOS: 「yum install iscsi-initiator-utils」を使⽤してインストール 4. ホストファイルシステムは、データを保存するためにノード上のファイルエクステント機能をサポート 現状のサポート対象: ext4、XFS Requirements

Slide 12

Slide 12 text

What’s Longhorn ? • longhorn.io (https://longhorn.io/) • GitHub (https://github.com/longhorn/longhorn) • Longhorn Accepted into CNCF (https://rancher.com/blog/2019/longhorn-accepted-into-cncf/) • an open source project for microservices-based distributed block storage (https://rancher.com/blog/2017/announcing-longhorn-microservices-block-storage/) • Rancherのヤツ知ってる︖いや、そっちじゃなくてLonghornのほう (https://speakerdeck.com/tsukaman/rancherfalseyatuzhi-tuteru-iya-sotutiziyanakutelonghornfalsehou) Documents

Slide 13

Slide 13 text

Longhorn Deep Dive

Slide 14

Slide 14 text

Longhorn Deep Dive ブロックストレージは、ストレージの論理ボリュームを固定サイズに分割すること により、ブロック単位でアクセスできるストレージ。単⼀ホストからのマウントに 基づくストレージ。 Block Storage 主なプロトコルは、iSCSI、FC。 ブロックストレージは、⼤容量データを⾼速転送して読み書きできることが特⻑。 向いている⽤途としては、OS、DB。

Slide 15

Slide 15 text

Longhorn Deep Dive Longhorn design philosophy 1. コンテナー普及に合わせたボリュームの増加への対応 2. 他の分散ストレージよりも分散ブロックストレージはシンプルで扱いやすい 3. 分散コントローラー設計(1ボリューム1コントローラー) 4. ストレージシステムのマイクロサービス化を狙う 参照(https://rancher.com/blog/2017/announcing-longhorn-microservices-block-storage/)

Slide 16

Slide 16 text

Longhorn Deep Dive Longhorn Architecture 参照(https://rancher.com/blog/2017/announcing-longhorn-microservices-block-storage/)

Slide 17

Slide 17 text

Longhorn Deep Dive Controller & Replica Architecture • ブロックデバイスボリュームご とに専⽤のストレージコント ローラーを作成する • 複数のノードに保存されている 複数のレプリカに同期してボ リュームを複製する • ストレージコントローラーとレ プリカ⾃体は、Kubernetesによ るオーケストレーション ※例︓ボリュームごとに2つのレプリカを作成します。 参照(https://rancher.com/blog/2017/announcing-longhorn-microservices-block-storage/)

Slide 18

Slide 18 text

Longhorn Deep Dive Replica Operations • ブロック使⽤状況のメタデータ無し • ブロックサイズは4KB • スナップショット取得時に差分ディスクを作成 • Read Indexによる⾼速化 • Read Indexはインメモリ ü Read: 内容を遅延埋め込み ü Write: Live Dataを指定 ブロックごとに1バイトのメモリ消費 (1TBボリュームで256MBのメモリ消費) 参照(https://rancher.com/blog/2017/announcing-longhorn-microservices-block-storage/)

Slide 19

Slide 19 text

Longhorn Deep Dive Replica Rebuild 1. Longhorn Volume Managerが新レプリカを作成 2. すべての読み取りおよび書き込み操作を⼀時停⽌ 3. 追加された新レプリカをWO(書き込み専⽤)モードに変更 4. 既存のすべてのレプリカのスナップショットを作成 5. すべての読み取りおよび書き込み操作を⼀時停⽌解除 ・新レプリカには書き込み操作のみがディスパッチされる 6. バックグラウンドプロセスを開始し、レプリカから新レプリカに同期 ・最新のLive Data以外の既存スナップショットが新レプリカと同期される 7. 同期完了後、新レプリカをRW(読み取り/書き込み)モードに設定 8. Longhorn Volume Managerが障害レプリカを削除 参照(https://rancher.com/blog/2017/announcing-longhorn-microservices-block-storage/)

Slide 20

Slide 20 text

Longhorn Deep Dive Backup of Snapshots • Amazon EBSを参考に開発 • スナップショット世代間の差分のみ増分バッ クアップ • 2MB単位ブロックでバックアップ • スナップショット間でブロックを共有 参照(https://rancher.com/blog/2017/announcing-longhorn-microservices-block-storage/)

Slide 21

Slide 21 text

Let’s try Longhorn

Slide 22

Slide 22 text

Let’s try Longhorn Longhorn Install Patter kubectl helm rancher

Slide 23

Slide 23 text

Let’s try Longhorn WordPress + Longhorn on GKE

Slide 24

Slide 24 text

Let’s try Longhorn Prepare LonghornがGKEにインストールする場合、ノードで使⽤するOSは、GKEデフォルトの「コンテナ最 適OS」ではなく「Ubuntu OS」を選択する必要があります。 GKEのプロビジョニング時に変更します。 Longhornをインストールする前に次のコマンドを実⾏して、クラスタ構成の完了後、RBACを有効に します。 $ kubectl create clusterrolebinding cluster-admin-binding --clusterrole=cluster-admin --user= [email protected] は、ご⾃分のGoogleアカウントのメールアドレスとします。

Slide 25

Slide 25 text

Longhorn Install Kubectl

Slide 26

Slide 26 text

Longhorn Install Kubectl 1.Longhornをインストール $ kubectl apply -f https://raw.githubusercontent.com/longhorn/longhorn/master/deploy/longhorn.yaml namespace/longhorn-system created serviceaccount/longhorn-service-account created clusterrole.rbac.authorization.k8s.io/longhorn-role created clusterrolebinding.rbac.authorization.k8s.io/longhorn-bind created customresourcedefinition.apiextensions.k8s.io/engines.longhorn.rancher.io created customresourcedefinition.apiextensions.k8s.io/replicas.longhorn.rancher.io created customresourcedefinition.apiextensions.k8s.io/settings.longhorn.rancher.io created customresourcedefinition.apiextensions.k8s.io/volumes.longhorn.rancher.io created customresourcedefinition.apiextensions.k8s.io/engineimages.longhorn.rancher.io created customresourcedefinition.apiextensions.k8s.io/nodes.longhorn.rancher.io created customresourcedefinition.apiextensions.k8s.io/instancemanagers.longhorn.rancher.io created configmap/longhorn-default-setting created daemonset.apps/longhorn-manager created service/longhorn-backend created deployment.apps/longhorn-ui created service/longhorn-frontend created deployment.apps/longhorn-driver-deployer created

Slide 27

Slide 27 text

2.Podの確認 $ kubectl -n longhorn-system get pod NAME READY STATUS RESTARTS AGE csi-attacher-9df5cfb99-7qjt2 1/1 Running 0 13m csi-attacher-9df5cfb99-d246j 1/1 Running 0 13m csi-attacher-9df5cfb99-wq47z 1/1 Running 0 13m csi-provisioner-5bd8d7cb74-bs9kz 1/1 Running 0 13m csi-provisioner-5bd8d7cb74-vwrxs 1/1 Running 0 13m csi-provisioner-5bd8d7cb74-xspb5 1/1 Running 0 13m engine-image-ei-3827e67c-fhz8w 1/1 Running 0 15m engine-image-ei-3827e67c-q7tpj 1/1 Running 0 15m engine-image-ei-3827e67c-zwq8v 1/1 Running 0 15m instance-manager-e-52b53b48 1/1 Running 0 13m instance-manager-e-bd7d7bb1 1/1 Running 0 13m instance-manager-e-fe19c451 1/1 Running 0 13m instance-manager-r-346984ea 1/1 Running 0 13m instance-manager-r-78d20189 1/1 Running 0 13m instance-manager-r-aa6cd210 1/1 Running 0 13m longhorn-csi-plugin-4rhb7 2/2 Running 0 13m longhorn-csi-plugin-5nb42 2/2 Running 0 13m longhorn-csi-plugin-v7pwc 2/2 Running 0 13m longhorn-driver-deployer-647688999c-db8rm 1/1 Running 0 15m longhorn-manager-cqdtn 1/1 Running 0 15m longhorn-manager-vt2g2 1/1 Running 0 15m longhorn-manager-zwwsm 1/1 Running 1 15m longhorn-ui-76dfddf9cd-ktk82 1/1 Running 0 15m Longhorn Install Kubectl

Slide 28

Slide 28 text

3.Serviceの確認 $ kubectl -n longhorn-system get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE csi-attacher ClusterIP 10.12.1.41 12345/TCP 18m csi-provisioner ClusterIP 10.12.2.61 12345/TCP 18m longhorn-backend ClusterIP 10.12.9.174 9500/TCP 20m longhorn-frontend LoadBalancer 10.12.6.218 34.69.255.105 80:30063/TCP 20m ブラウザを起動して、EXTERNAL-IPにアクセス。 Longhorn Install Kubectl

Slide 29

Slide 29 text

Longhorn Install Kubectl

Slide 30

Slide 30 text

Longhorn Install Helm

Slide 31

Slide 31 text

Longhorn Install Helm 1.git cloneを実⾏ $ git clone https://github.com/longhorn/longhorn.git 2.Helmをインストール $ helm install ./longhorn/chart --name longhorn --namespace longhorn-system 3.Serviceを確認 $ kubectl -n longhorn-system get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE csi-attacher ClusterIP 10.0.1.11 12345/TCP 16m csi-provisioner ClusterIP 10.0.0.46 12345/TCP 16m longhorn-backend ClusterIP 10.0.11.53 9500/TCP 17m longhorn-frontend LoadBalancer 10.0.1.213 34.84.3.65 80:30016/TCP 17m ブラウザを起動して、EXTERNAL-IPにアクセス。

Slide 32

Slide 32 text

Longhorn Install Helm

Slide 33

Slide 33 text

Longhorn Install Rancher

Slide 34

Slide 34 text

Longhorn Install Helm 1.LONGHORNのカタログを選択

Slide 35

Slide 35 text

Longhorn Install Helm 2.プロビジョニング 「0.6.2」を選択

Slide 36

Slide 36 text

Longhorn Install Helm 「L4 Balancer」を選択 「Launch」ボタンをクリック

Slide 37

Slide 37 text

Longhorn Install Helm 3.「80/tcp」をクリック

Slide 38

Slide 38 text

Longhorn Install Helm

Slide 39

Slide 39 text

Deploy WordPress

Slide 40

Slide 40 text

Deploy WordPress $ kubectl create -f https://raw.githubusercontent.com/longhorn/longhorn/master/examples/storageclass.yaml storageclass.storage.k8s.io/longhorn created Create Longhorn Volume Kubernetesボリュームを作成する前に、最初にストレージクラスを作成する必要があります。 longhornというStorageClassを作成します。 storageclass.yaml kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: longhorn provisioner: rancher.io/longhorn parameters: numberOfReplicas: "3" staleReplicaTimeout: "2880" fromBackup: "" # diskSelector: "ssd,fast" # nodeSelector: "storage,fast" # recurringJobs: '[{"name":"snap", "task":"snapshot", "cron":"*/1 * * * *", "retain":1}, # {"name":"backup", "task":"backup", "cron":"*/2 * * * *", "retain":1, # "labels": {"interval":"2m"}}]'

Slide 41

Slide 41 text

Deploy WordPress $ vim longhorn-pvc.yaml ------------------------------------------------------------------- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: longhorn-volv-pvc spec: accessModes: - ReadWriteOnce storageClassName: longhorn resources: requests: storage: 10Gi ------------------------------------------------------------------- Esc + :wq Longhorn StorageClassを使⽤してPVCを作成します。 (WordPress) $ kubectl create -f longhorn-pvc.yaml persistentvolumeclaim/longhorn-volv-pvc created Create PersistentVolumeClaim

Slide 42

Slide 42 text

Deploy WordPress $ vim longhorn-pvc2.yaml ------------------------------------------------------------------- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: longhorn-volv-pvc2 spec: accessModes: - ReadWriteOnce storageClassName: longhorn resources: requests: storage: 10Gi ------------------------------------------------------------------- Esc + :wq Longhorn StorageClassを使⽤してPVCを作成します。(MySQL) $ kubectl create -f longhorn-pvc2.yaml persistentvolumeclaim/longhorn-volv-pvc2 created

Slide 43

Slide 43 text

Deploy WordPress $ kubectl get pv,pvc NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE persistentvolume/pvc-d2eaf832-02bc-11ea-b04c-42010a800123 10Gi RWO Delete Bound default/longhorn-volv-pvc longhorn 25m persistentvolume/pvc-e089f32f-02bf-11ea-b04c-42010a800123 10Gi RWO Delete Bound default/longhorn- volv-pvc2 longhorn 3m25s NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE persistentvolumeclaim/longhorn-volv-pvc Bound pvc-d2eaf832-02bc-11ea-b04c-42010a800123 10Gi RWO longhorn 25m persistentvolumeclaim/longhorn-volv-pvc2 Bound pvc-e089f32f-02bf-11ea-b04c-42010a800123 10Gi RWO longhorn 3m27s pvおよびpvcのステータスを確認します。

Slide 44

Slide 44 text

Deploy WordPress $ kubectl create secret generic mysql --from-literal=password=longhorn secret/mysql created 1.Secretを作成 Deploy WordPress

Slide 45

Slide 45 text

Deploy WordPress $ vim mysql.yml ----------------------------------------------------- apiVersion: extensions/v1beta1 kind: Deployment metadata: name: mysql labels: app: mysql spec: replicas: 1 selector: matchLabels: app: mysql template: metadata: labels: app: mysql spec: containers: - image: mysql:5.6 name: mysql env: - name: MYSQL_ROOT_PASSWORD valueFrom: secretKeyRef: name: mysql key: password ports: - containerPort: 3306 name: mysql volumeMounts: - name: mysql-local-storage mountPath: /var/lib/mysql volumes: - name: mysql-local-storage persistentVolumeClaim: claimName: longhorn-volv-pvc ----------------------------------------------------- Esc + :wq 2.MySQL Deploymentを作成

Slide 46

Slide 46 text

Deploy WordPress $ kubectl create -f mysql.yml deployment.extensions/mysql created 3.MySQL Deploymentをデプロイ $ kubectl get pods NAME READY STATUS RESTARTS AGE mysql-656cf9f974-5l4bs 1/1 Running 0 3m37s 4.Podの確認

Slide 47

Slide 47 text

Deploy WordPress $ vim wordpress.yml ----------------------------------------------------- apiVersion: extensions/v1beta1 kind: Deployment metadata: name: wordpress labels: app: wordpress spec: replicas: 1 selector: matchLabels: app: wordpress template: metadata: labels: app: wordpress spec: containers: - image: wordpress name: wordpress env: - name: WORDPRESS_DB_HOST value: mysql:3306 - name: WORDPRESS_DB_PASSWORD valueFrom: secretKeyRef: name: mysql key: password ports: - containerPort: 80 name: wordpress volumeMounts: - name: wordpress-local-storage mountPath: /var/www/html volumes: - name: wordpress-local-storage persistentVolumeClaim: claimName: longhorn-volv-pvc2 ----------------------------------------------------- Esc + :wq 5.WordPress Deploymentを作成

Slide 48

Slide 48 text

Deploy WordPress $ kubectl create -f wordpress.yml deployment.extensions/wordpress created 6.WordPress Deploymentをデプロイ $ kubectl get pods NAME READY STATUS RESTARTS AGE mysql-656cf9f974-5l4bs 1/1 Running 0 15m wordpress-7f4768b5cc-bxvcr 1/1 Running 0 44s 7.Podの確認 $ vim mysql-service.yml ----------------------------------------------------- apiVersion: v1 kind: Service metadata: name: mysql labels: app: mysql spec: type: ClusterIP ports: - port: 3306 selector: app: mysql ----------------------------------------------------- Esc + :wq 8.MySQL Serviceの作成

Slide 49

Slide 49 text

Deploy WordPress $ kubectl create -f mysql-service.yml service/mysql created 9.MySQL Serviceをデプロイ $ vim wordpress-service.yml ----------------------------------------------------- apiVersion: v1 kind: Service metadata: labels: app: wordpress name: wordpress spec: type: LoadBalancer ports: - port: 80 targetPort: 80 protocol: TCP selector: app: wordpress ----------------------------------------------------- Esc + :wq 10.WordPress Serviceの作成 $ kubectl create -f wordpress-service.yml service/wordpress created 11.WordPress Serviceのデプロイ

Slide 50

Slide 50 text

Deploy WordPress $ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.12.0.1 443/TCP 114m mysql ClusterIP 10.12.7.159 3306/TCP 3m37s wordpress LoadBalancer 10.12.12.30 34.70.77.28 80:31566/TCP 96s 12.Serviceの確認 ブラウザを起動して、EXTERNAL-IPにアクセス。

Slide 51

Slide 51 text

DashboardUI

Slide 52

Slide 52 text

DashboardUI Dashboard

Slide 53

Slide 53 text

DashboardUI Node

Slide 54

Slide 54 text

DashboardUI Volume

Slide 55

Slide 55 text

DashboardUI Volume

Slide 56

Slide 56 text

DashboardUI Backup

Slide 57

Slide 57 text

DashboardUI Setting - General

Slide 58

Slide 58 text

DashboardUI Setting - Engine Image

Slide 59

Slide 59 text

Information

Slide 60

Slide 60 text

Information ハンズオンドキュメントとして、Qiitaの「Advent Calendar 2019 Kubernetes(その2)」に投稿予定です。 2019.12.18に書きます︕ • Kubernetes Advent Calendar 2019 その1 (https://qiita.com/advent-calendar/2019/kubernetes) • Kubernetes Advent Calendar 2019 その2 (https://qiita.com/advent-calendar/2019/kubernetes2) • Kubernetes Advent Calendar 2019 その3 (https://qiita.com/advent-calendar/2019/kubernetes3)

Slide 61

Slide 61 text

Thank You !!