CNCF Sandbox Project Longhorn

7bcf6f29a0b9a348fe422a31a4f44752?s=47 cyberblack28
November 27, 2019

CNCF Sandbox Project Longhorn

CloudNative Days Kansai 前夜祭 2019 #CNDK2019

7bcf6f29a0b9a348fe422a31a4f44752?s=128

cyberblack28

November 27, 2019
Tweet

Transcript

  1. 2.

    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
  2. 7.

    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
  3. 9.

    What’s Longhorn ? 1. 単⼀障害点のないエンタープライズグレード︖の分散ストレージ 2. ブロックストレージの増分スナップショット 3. NFSまたはS3互換オブジェクトストレージへのバックアップ 4.

    スナップショットとバックアップの循環実装 5. ⾃動化された無停⽌アップグレード。実⾏中のボリュームを中断することな く、Longhornソフトウェアスタック全体をアップグレード可能 6. 直感的なGUIダッシュボード Features
  4. 10.

    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
  5. 11.

    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
  6. 12.

    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
  7. 15.

    Longhorn Deep Dive Longhorn design philosophy 1. コンテナー普及に合わせたボリュームの増加への対応 2. 他の分散ストレージよりも分散ブロックストレージはシンプルで扱いやすい

    3. 分散コントローラー設計(1ボリューム1コントローラー) 4. ストレージシステムのマイクロサービス化を狙う 参照(https://rancher.com/blog/2017/announcing-longhorn-microservices-block-storage/)
  8. 17.

    Longhorn Deep Dive Controller & Replica Architecture • ブロックデバイスボリュームご とに専⽤のストレージコント

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

    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/)
  10. 19.

    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/)
  11. 20.

    Longhorn Deep Dive Backup of Snapshots • Amazon EBSを参考に開発 •

    スナップショット世代間の差分のみ増分バッ クアップ • 2MB単位ブロックでバックアップ • スナップショット間でブロックを共有 参照(https://rancher.com/blog/2017/announcing-longhorn-microservices-block-storage/)
  12. 26.

    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
  13. 27.

    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
  14. 28.

    3.Serviceの確認 $ kubectl -n longhorn-system get svc NAME TYPE CLUSTER-IP

    EXTERNAL-IP PORT(S) AGE csi-attacher ClusterIP 10.12.1.41 <none> 12345/TCP 18m csi-provisioner ClusterIP 10.12.2.61 <none> 12345/TCP 18m longhorn-backend ClusterIP 10.12.9.174 <none> 9500/TCP 20m longhorn-frontend LoadBalancer 10.12.6.218 34.69.255.105 80:30063/TCP 20m ブラウザを起動して、EXTERNAL-IPにアクセス。 Longhorn Install Kubectl
  15. 31.

    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 <none> 12345/TCP 16m csi-provisioner ClusterIP 10.0.0.46 <none> 12345/TCP 16m longhorn-backend ClusterIP 10.0.11.53 <none> 9500/TCP 17m longhorn-frontend LoadBalancer 10.0.1.213 34.84.3.65 80:30016/TCP 17m ブラウザを起動して、EXTERNAL-IPにアクセス。
  16. 40.

    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"}}]'
  17. 41.

    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
  18. 42.

    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
  19. 43.

    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のステータスを確認します。
  20. 45.

    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を作成
  21. 46.

    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の確認
  22. 47.

    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を作成
  23. 48.

    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の作成
  24. 49.

    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のデプロイ
  25. 50.

    Deploy WordPress $ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP

    PORT(S) AGE kubernetes ClusterIP 10.12.0.1 <none> 443/TCP 114m mysql ClusterIP 10.12.7.159 <none> 3306/TCP 3m37s wordpress LoadBalancer 10.12.12.30 34.70.77.28 80:31566/TCP 96s 12.Serviceの確認 ブラウザを起動して、EXTERNAL-IPにアクセス。
  26. 60.

    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)