Upgrade to Pro — share decks privately, control downloads, hide ads and more …

TopoLVMをRancherで動かしてみた話 / TopoLVM Rancher

Masayuki Ishii
February 07, 2020

TopoLVMをRancherで動かしてみた話 / TopoLVM Rancher

Rancher Meetup Osaka #11 での発表スライドです。
https://rancherjp.connpass.com/event/156187/

サイボウズで開発しているKubernetes向けのストレージプラグイン"TopoLVM"をRancherでデプロイしたKubernetesで動作させる方法を説明しています。

Masayuki Ishii

February 07, 2020
Tweet

More Decks by Masayuki Ishii

Other Decks in Technology

Transcript

  1. Neco プロジェクトとは ▌ ⾃社データセンターに Kubernetes クラスタを構築するプロジェクト ▌ ほとんどの成果は OSS として公開

    ▌ 3年計画の3年⽬ n これまで (2018、2019) • データセンターの構築、 • 物理マシンの管理ツール、Kubernetesクラスタの管理ツール • ドメインや SSL/TLS 証明書の⾃動管理、ロードバランサーなど n これから (2020) • Rook/Ceph、Elasticsearch、MySQLクラスタの構築 • モニタリング、ログ管理 • マルチテナント 4
  2. TopoLVM ▌サイボウズで開発している Kubernetes 向けのストレージプラグイン ▌特⻑は3つ 1. ノードのローカルストレージを LVM (Logical Volume

    Manager) で管理 2. 必要な時に、必要な場所(ノード) で、動的にボリュームを確保 3. ノードのローカルストレージの空き容量を考慮した、Pod のスケジューリング Ø ボリューム管理のための、オペレーションコストが削減できる ※ これらを実現するストレージプラグインは TopoLVM だけ 6
  3. TopoLVM ▌OSS として公開中 Ø https://github.com/cybozu-go/topolvm • 社外の利⽤者もちらほら、外部からの Issue や Pull

    Request も ▌KubeCon + CloudNativeCon Europe 2020 (3/30〜4/2) で、 TopoLVM を題材に サイボウズから登壇予定 (⾃分ではないです、念のため…) Ø https://sched.co/ZerD 7
  4. TopoLVM の構成 ▌4つのモジュールから構成される 1. topolvm-controller (Deployment) • クラスタ全体のボリュームを管理するコントローラ 2. topolvm-node

    (DaemonSet) • 動作中のノードに関する処理をハンドリングするコントローラ 3. lvmd (Systemd サービス) • LVM の操作 (ボリュームの確保や削除等) を⾏うデーモン 4. topolvm-scheduler (DaemonSet ⼜は Deployment) • ノードのローカルストレージの空き容量を判定する Webhook • Scheduler Extension で kube-scheduler から呼び出される 8
  5. Scheduler Extension ▌Scheduler Extension とは • Pod のスケジューリング処理 (ノードへの割当て処理) を拡張するための機能

    • kube-scheduler から Webhook を実⾏する Ø https://kubernetes.io/docs/concepts/extend-kubernetes/extend-cluster/#scheduler-extensions ▌TopoLVM では • ローカルストレージの空き容量を元に、配置先ノードの候補をフィルタリング Ø ストレージを考慮した スケジューリングを実現 9
  6. TopoLVM の動作 (1): ボリュームの確保 10 topolvm-controller (Deployment) topolvm-node (DaemonSet) worker2

    lvmd worker1 disk VG VG disk topolvm-node (DaemonSet) lvmd LV クラスタ全体のボリュームを管理 H/W LVM Systemd サービス Kubernetes ワークロード アプリ (Pod) PV 該当ノードに関する処理をハンドリング LVM の操作 LV … LV LV
  7. TopoLVM の動作 (2): Pod スケジューリング ▌デフォルトのスケジューリング Ø CPU、メモリ しか考慮しない 11

    master H/W Kubernetes コンポーネント Kubernetes ワークロード kube-apiserver kube-scheduler etcd kubelet アプリ (Pod) Pod の 割当て先ノードを決める (CPU、メモリ だけを考慮) Pod を起動 worker1 CPU: 4コア 空きメモリ: 8GB ストレージ: 空きなし worker2 CPU: 8コア 空きメモリ: 8GB ストレージ: 100GB ストレージないから 動けないよ… 条件的には どちらもOK
  8. TopoLVM の動作 (2): Pod スケジューリング ▌topolvm-scheduler で、ストレージの空き容量を判定 12 master kube-apiserver

    kube-scheduler etcd kubelet アプリ (Pod) 空き容量を判定 (Scheduler Extension) Pod を起動 worker1 CPU: 4コア 空きメモリ: 8GB ストレージ: 空きなし worker2 CPU: 8コア 空きメモリ: 8GB ストレージ: 100GB OK! H/W Kubernetes コンポーネント Kubernetes ワークロード topolvm-scheduler ストレージ、ヨシ︕
  9. ▌GCP の VM インスタンス × 計4台 (いずれも n1-standard-2、Ubuntu 18.04) •

    Rancher Server⽤ × 1 (ホスト名: rancher) • Master ノード⽤ × 1 (ホスト名: master) • Worker ノード⽤ × 2 (ホスト名: worker1、worker2) Ø TopoLVM で管理するボリューム(SSD)を追加しておく master worker1 worker2 ranhcer 確認したクラスタ構成 Kubernetes SSD SSD etcd Control Plane Pod Pod Pod LV LV LV デプロイ /管理 ノードローカルな ボリュームへアクセス 16
  10. 確認したバージョン ▌以下のバージョンで動作確認しました • TopoLVM: v0.2.2 • Rancher: v2.3.4 • Kubernetes:

    v1.16 (v1.16.4-rancher1-1) Ø TopoLVM v0.2.2 は Kubernetes v1.14〜v1.16 をサポート 17
  11. 動作確認時の⼤まかな⼿順 1. Rancher Server の起動 2. Kubernetes クラスタの構築 3. Kubernetes

    上での準備: Ø cert-manager デプロイ、namespace にラベル追加 4. lvmd インストール 5. TopoLVM デプロイ 6. topolvm-scheduler の設定 7. Scheduler Extension の設定 19 クラスタの準備 TopoLVM のインストール & 設定
  12. はまりポイント ▌以下3つの⼿順で、Rancher⽤ ⼜は 環境固有 の設定が必要 4. lvmd のインストール Ø VG

    (Volume Group) の設定 & ノードに直接デプロイが必要 6. topolvm-scheduler の設定 Ø topolvm-scheduler を kube-scheduler と同じノード (Master ノード) に配置する 7. Scheduler Extension の設定 Ø kube-scheduler の設定変更が必要 (将来的には簡略化できるかも) 21
  13. 1. Rancher Server の起動 ▌rancher 上で、Rancher Server を起動します 22 $

    sudo docker run -d --restart=unless-stopped -p 80:80 -p 443:443 rancher/rancher 早い︕ 安い︕ 旨い︕
  14. 2. Kubernetes クラスタの構築 ▌Rancher Server の Web UI から カスタムクラスタ

    を⽣成 • 「Add Cluster」 → 「From existing nodes (Custom)」 • Kubernetes Version: v1.16系 • Master ノードのロール: etcd、Control Plane • Worker ノードのロール: Worker Ø 後は、表⽰されたコマンドを、各ノードで実⾏するだけ 23
  15. 3. Kubernetes 上での準備(1): cert-manager デプロイ ▌Scheculer Extension の呼び出しは HTTPS •

    SSL/TLS 証明書⽣成のため cert-manager をデプロイする Ø https://cert-manager.io/docs/installation/kubernetes/ ⼿動で証明書を作成し利⽤することも可能 ただし、⼿順が複雑なので cert-manager の利⽤を推奨します Ø ⼿動で証明書を発⾏したい場合は、以下の内容を参照のこと • https://github.com/cybozu-go/topolvm/blob/v0.2.2/example/Makefile#L83-L88 • https://github.com/cybozu-go/topolvm/blob/v0.2.2/example/kustomization.yaml#L12-L27 24
  16. 3. Kubernetes 上での準備(2): namespaceにラベル追加 ▌システム⽤の namespace に、次のラベルを追加する Ø このラベルを設定した namespace

    では、TopoLVM が動作しなくなる ▌今回の場合、kube-system ns、cert-manager ns にラベルを設定する 25 topolvm.cybozu.com/webhook: ignore $ kubectl label namespace kube-system topolvm.cybozu.com/webhook=ignore $ kubectl label namespace cert-manager topolvm.cybozu.com/webhook=ignore
  17. 4. lvmd インストール (1) ▌lvmd のインストールは、次の3ステップ 1. VG の⽣成 2.

    lvmd のインストール 3. Systemd でサービス化 Ø 難しくはないけど、環境固有の設定やノード上での操作がある 26
  18. 4. lvmd インストール (2) 1. VG (Volume Group) の⽣成 •

    Worker ノードで、以下のコマンドを実⾏する ※ vgcreate のコマンドの引数 • 第1引数 … VG名(上記では`myvg`) 任意の⽂字列でOK • 第2引数 … 使⽤するブロックデバイス、環境に応じて変更 (今回は`/dev/nvme0n1`) 27 $ sudo vgcreate myvg /dev/nvme0n1
  19. 4. lvmd インストール (3) 2. lvmd のインストール • lvmd のバイナリを、GitHub

    のリリースページから取得し Worker ノードの /opt/sbin に配置 Ø https://github.com/cybozu-go/topolvm/releases/tag/v0.2.2 28
  20. 4. lvmd インストール (4) 3. Systemd でサービス化 29 # →のファイルを⽣成する

    $ sudo vi /etc/systemd/system/lvmd.service # サービスの登録 & 起動 $ sudo systemctl enable lvmd $ sudo systemctl start lvmd [Unit] Description=lvmd for TopoLVM Wants=lvm2-monitor.service After=lvm2-monitor.service [Service] Type=simple Restart=on-failure RestartForceExitStatus=SIGPIPE ExecStartPre=/bin/mkdir -p /run/topolvm ExecStart=/opt/sbin/lvmd --volume-group=myvg --listen=/run/topolvm/lvmd.sock [Install] WantedBy=multi-user.target VG名 (環境に合わせて変更する) https://github.com/cybozu-go/topolvm/blob/v0.2.2/deploy/systemd/lvmd.service topolvm-node との通信に使⽤するソケットファイル (変更する場合はtopolvm-nodeのマニフェストも修正する)
  21. 5. TopoLVM デプロイ ▌GitHub にあるマニフェストを apply する Ø https://github.com/cybozu-go/topolvm/tree/v0.2.2/deploy/manifests ▌以下の2つのコマンドを実⾏する

    30 # CRD や DaemonSet、Deployment 等 $ kubectl apply -k https://github.com/cybozu-go/topolvm/deploy/manifests?ref=v0.2.2 # certificate リソース # apply後、cert-manager によって webhook-ca secret、mutatingwebhook secretが⽣成される $ kubectl apply -f https://raw.githubusercontent.com/cybozu-go/topolvm/v0.2.2/deploy/manifests/certificates.yaml
  22. 6. topolvm-schedulerの設定 (1) ▌マニフェストの apply だけでは topolvm-scheduler が起動しない • topolvm-scheduler

    と kube-scheduler を同じノードで動作させたい • GitHub にある TopoLVM のマニフェストは kubeadm ⽤ Ø Node affinity と Toleration の設定を Rancher ⽤に変更する 31
  23. 6. topolvm-schedulerの設定 (2) ▌今回の⼿順で起動した master には、次の Label / Taint が設定されている

    n Label 1. node-role.kubernetes.io/controlplane=true 2. node-role.kubernetes.io/etcd=true n Taint 1. node-role.kubernetes.io/controlplane=true:NoSchedule 2. node-role.kubernetes.io/etcd=true:NoExecute 32
  24. 6. topolvm-schedulerの設定 (3) ▌topolvm-scheduler の Node affinity と Toleration を書き換る

    Ø 変更がうまくいくと、topolvm-scheduler の Pod が起動し始める 33 $ kubectl edit daemonset topolvm-scheduler -n topolvm-system affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - - key: node-role.kubernetes.io/master + - key: node-role.kubernetes.io/controlplane operator: Exists tolerations: - key: CriticalAddonsOnly operator: Exists - - key: node-role.kubernetes.io/master - effect: NoSchedule + - key: node-role.kubernetes.io/controlplane + operator: Exists + - key: node-role.kubernetes.io/etcd + operator: Exists Ø 指定した Label を持つノードに、Pod を配置する。 Ø 指定した Taint があっても、Pod を配置する。
  25. 7. Scheduler Extension の設定 (1) ▌Scheduler Extension の設定は、次の2ステップ 1. kube-scheduler

    が読込める場所に設定ファイルを置き 2. kube-scheduler の起動オプションを変更する Ø Rancher でデプロイした Kubernetes では、どうやって設定するのだろうか︖ 34
  26. 7. Scheduler Extension の設定 (2) ▌設定ファイルの配置場所確認 • kube-scheduler は docker

    で動作している Ø master の /etc/kubernetes に置けばよい (docker inspect の結果から確認できる) 35 master $ sudo docker inspect kube-scheduler … "Mounts": [ { "Type": "bind", "Source": "/etc/kubernetes", "Destination": "/etc/kubernetes", "Mode": "z", "RW": true, "Propagation": "rprivate" } ],
  27. 7. Scheduler Extension の設定 (3) ▌TopoLVM では、2つのファイルを配置する 1. KubeSchedulerConfiguration (yaml)

    • kube-scheduler の設定 2. スケジューラポリシー (json) • Scheduler Extendsion の設定 36
  28. 7. Scheduler Extension の設定 (4) ▌KuberSchedulerConfiguration • /etc/kubernetes/scheduler/scheduler-config.yaml に配置 Ø

    Rancher ⽤に設定する (TopoLVM のリポジトリにあるものは使えない) 37 apiVersion: kubescheduler.config.k8s.io/v1alpha1 kind: KubeSchedulerConfiguration schedulerName: default-scheduler algorithmSource: policy: file: path: /etc/kubernetes/scheduler/scheduler-policy.cfg clientConnection: kubeconfig: /etc/kubernetes/ssl/kubecfg-kube-scheduler.yaml https://github.com/masa213f/example-topolvm/blob/master/scheduler-config/scheduler-config.yaml スケジューラポリシー(次のスライド参照)のパス クライアント証明書(このファイルが適切なのか⾃信はない)
  29. 7. Scheduler Extension の設定 (5) ▌スケジューラポリシー • /etc/kubernetes/scheduler/scheduler-policy.cfg 配置 Ø

    これは TopoLVM のリポジトリにあるファイルがそのまま使える https://github.com/cybozu-go/topolvm/blob/v0.2.2/deploy/scheduler-config/scheduler-policy.cfg 38
  30. 7. Scheduler Extension の設定 (7) ▌kube-scheduler の起動オプションを変更する 2. scheduler の項⽬を次のように変更し

    「Save」 Ø extra_args で KubeSchedulerConfiguration を読み込ませる 40 services: ... - scheduler: {} + scheduler: + extra_args: + config: /etc/kubernetes/scheduler/scheduler-config.yaml ssh_agent_auth: false
  31. 動作確認 ▌PVC の storageClassName に、topolvm-provisioner を指定すると TopoLVM でボリュームを確保できます 42 kind:

    PersistentVolumeClaim apiVersion: v1 metadata: name: topolvm-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi storageClassName: topolvm-provisioner https://github.com/cybozu-go/topolvm/blob/v0.2.2/example/podpvc.yaml
  32. さいごに ▌TopoLVM は Rancher でも使えるので、ぜひ試してみてください︕ • GitHub Ø https://github.com/cybozu-go/topolvm •

    今回の動作確認⼿順 Ø https://github.com/masa213f/example-topolvm • Kubernetesでローカルストレージを有効活⽤しよう – Cybozu Inside Out Ø https://blog.cybozu.io/entry/2019/11/08/090000 • Kubernetes向けストレージプラグイン TopoLVM の紹介 Ø https://speakerdeck.com/masa213f/topolvm-intro 43
  33. さいごに、その2 ▌次の KEP (Kubernetes Enhancement Proposal) で ストレージの空き容量を考慮したPodスケジューリングの標準的な⽅法が議論された (なので、将来的には topolvm-scheduler

    の設定を簡略化できるかも) 1. Storage Capacity Constraints for Pod Scheduling #1353 Ø https://github.com/kubernetes/enhancements/pull/1353 2. CSI inline volume size #1409 Ø https://github.com/kubernetes/enhancements/pull/1409 Ø サイボウズもレビューに参加 TopoLVM の開発で得られた知⾒をコミュニティに共有 44
  34. Maneki & Neco Meetup のご案内 ▌以下の⽇程で Meetup を開催予定です • ⽇時︓2020/02/18(⽕)

    19:00〜21:00 • 場所︓東京、⼤阪 + インターネット配信 Ø Maneki & Neco Meetup (connpass) https://cybozu.connpass.com/event/162304/ インターネット配信を予定しているので 興味がありましたらぜひ︕ 45