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

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

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. Rancher Meetup #11 in Osaka
    TopoLVM を Rancher で動かしてみた話
    2020-02-07
    サイボウズ株式会社
    ⽯井 正將 (masa213f)

    View Slide

  2. ⾃⼰紹介
    ▌サイボウズ ⼤阪オフィス勤務
    • OSや仮想化に興味があったエンジニア
    ▌経歴
    • 前職では、電機メーカーでOS・仮想化の開発
    • 2018/09 サイボウズ キャリア⼊社
    • 2019/03 運⽤本部 インフラ刷新プロジェクト Neco へ異動
    1

    View Slide

  3. 今⽇の内容
    ▌Neco プロジェクトの紹介
    ▌ストレージプラグイン TopoLVM の紹介
    ▌TopoLVM を Rancher で動かしてみた話
    2

    View Slide

  4. Neco プロジェクトの紹介

    View Slide

  5. Neco プロジェクトとは
    ▌ ⾃社データセンターに Kubernetes クラスタを構築するプロジェクト
    ▌ ほとんどの成果は OSS として公開
    ▌ 3年計画の3年⽬
    n これまで (2018、2019)
    • データセンターの構築、
    • 物理マシンの管理ツール、Kubernetesクラスタの管理ツール
    • ドメインや SSL/TLS 証明書の⾃動管理、ロードバランサーなど
    n これから (2020)
    • Rook/Ceph、Elasticsearch、MySQLクラスタの構築
    • モニタリング、ログ管理
    • マルチテナント
    4

    View Slide

  6. ストレージプラグイン TopoLVM の紹介

    View Slide

  7. TopoLVM
    ▌サイボウズで開発している Kubernetes 向けのストレージプラグイン
    ▌特⻑は3つ
    1. ノードのローカルストレージを LVM (Logical Volume Manager)
    で管理
    2. 必要な時に、必要な場所(ノード)
    で、動的にボリュームを確保
    3. ノードのローカルストレージの空き容量を考慮した、Pod のスケジューリング
    Ø ボリューム管理のための、オペレーションコストが削減できる
    ※ これらを実現するストレージプラグインは TopoLVM だけ
    6

    View Slide

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

    View Slide

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

    View Slide

  10. Scheduler Extension
    ▌Scheduler Extension とは
    • Pod のスケジューリング処理 (ノードへの割当て処理) を拡張するための機能
    • kube-scheduler から Webhook を実⾏する
    Ø https://kubernetes.io/docs/concepts/extend-kubernetes/extend-cluster/#scheduler-extensions
    ▌TopoLVM では
    • ローカルストレージの空き容量を元に、配置先ノードの候補をフィルタリング
    Ø ストレージを考慮した スケジューリングを実現
    9

    View Slide

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

    View Slide

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

    View Slide

  13. 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
    ストレージ、ヨシ︕

    View Slide

  14. TopoLVM を
    Rancher で動かしてみた話

    View Slide

  15. 今回のモチベーション
    ▌TopoLVM を試してみたけど 動かないよ︕ といった話がちらほら
    14
    どうやらインストールが難しいらしい……
    ぼくらの環境ではちゃんと動くのに……
    おや、Rancher 利⽤者からの報告が多いぞ︖

    View Slide

  16. だから試してみた
    ▌Rancher で動すことができれば、TopoLVM の利⽤者が増えるね︕
    15

    View Slide

  17. ▌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

    View Slide

  18. 確認したバージョン
    ▌以下のバージョンで動作確認しました
    • 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

    View Slide

  19. デモ
    ▌PVC と Pod を⽣成して、PV を動的に作成
    ▌Rancher Server 上で、PV を確認
    ▌LVM の容量を確認
    18

    View Slide

  20. 動作確認時の⼤まかな⼿順
    1. Rancher Server の起動
    2. Kubernetes クラスタの構築
    3. Kubernetes 上での準備:
    Ø cert-manager デプロイ、namespace にラベル追加
    4. lvmd インストール
    5. TopoLVM デプロイ
    6. topolvm-scheduler の設定
    7. Scheduler Extension の設定
    19
    クラスタの準備
    TopoLVM のインストール & 設定

    View Slide

  21. 詳細な⼿順
    ▌以下のリポジトリに詳細な⼿順が書いてあります
    Ø https://github.com/masa213f/example-topolvm
    20

    View Slide

  22. はまりポイント
    ▌以下3つの⼿順で、Rancher⽤ ⼜は 環境固有 の設定が必要
    4. lvmd のインストール
    Ø VG (Volume Group) の設定 & ノードに直接デプロイが必要
    6. topolvm-scheduler の設定
    Ø topolvm-scheduler を kube-scheduler と同じノード (Master ノード) に配置する
    7. Scheduler Extension の設定
    Ø kube-scheduler の設定変更が必要 (将来的には簡略化できるかも)
    21

    View Slide

  23. 1. Rancher Server の起動
    ▌rancher 上で、Rancher Server を起動します
    22
    $ sudo docker run -d --restart=unless-stopped -p 80:80 -p 443:443 rancher/rancher
    早い︕
    安い︕
    旨い︕

    View Slide

  24. 2. Kubernetes クラスタの構築
    ▌Rancher Server の Web UI から カスタムクラスタ を⽣成
    • 「Add Cluster」 → 「From existing nodes (Custom)」
    • Kubernetes Version: v1.16系
    • Master ノードのロール: etcd、Control Plane
    • Worker ノードのロール: Worker
    Ø 後は、表⽰されたコマンドを、各ノードで実⾏するだけ
    23

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  29. 4. lvmd インストール (3)
    2. lvmd のインストール
    • lvmd のバイナリを、GitHub のリリースページから取得し
    Worker ノードの /opt/sbin に配置
    Ø https://github.com/cybozu-go/topolvm/releases/tag/v0.2.2
    28

    View Slide

  30. 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のマニフェストも修正する)

    View Slide

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

    View Slide

  32. 6. topolvm-schedulerの設定 (1)
    ▌マニフェストの apply だけでは topolvm-scheduler が起動しない
    • topolvm-scheduler と kube-scheduler を同じノードで動作させたい
    • GitHub にある TopoLVM のマニフェストは kubeadm ⽤
    Ø Node affinity と Toleration の設定を Rancher ⽤に変更する
    31

    View Slide

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

    View Slide

  34. 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 を配置する。

    View Slide

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

    View Slide

  36. 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"
    }
    ],

    View Slide

  37. 7. Scheduler Extension の設定 (3)
    ▌TopoLVM では、2つのファイルを配置する
    1. KubeSchedulerConfiguration (yaml)
    • kube-scheduler の設定
    2. スケジューラポリシー (json)
    • Scheduler Extendsion の設定
    36

    View Slide

  38. 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
    スケジューラポリシー(次のスライド参照)のパス
    クライアント証明書(このファイルが適切なのか⾃信はない)

    View Slide

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

    View Slide

  40. 7. Scheduler Extension の設定 (6)
    ▌kube-scheduler の起動オプションを変更する
    1. Rancher のクラスタ設定画⾯から Cluster Options: を選択
    Ø Web UI から RKE の cluster.yml を編集できる
    39

    View Slide

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

    View Slide

  42. 設定完了︕
    41

    View Slide

  43. 動作確認
    ▌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

    View Slide

  44. さいごに
    ▌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

    View Slide

  45. さいごに、その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

    View Slide

  46. Maneki & Neco Meetup のご案内
    ▌以下の⽇程で Meetup を開催予定です
    • ⽇時︓2020/02/18(⽕) 19:00〜21:00
    • 場所︓東京、⼤阪 + インターネット配信
    Ø Maneki & Neco Meetup (connpass)
    https://cybozu.connpass.com/event/162304/
    インターネット配信を予定しているので
    興味がありましたらぜひ︕
    45

    View Slide