Share
Embed
TopoLVMをRancherで動かしてみた話 / TopoLVM Rancher
Rancher Meetup Osaka #11 での発表スライドです。
https://rancherjp.connpass.com/event/156187/
サイボウズで開発しているKubernetes向けのストレージプラグイン"TopoLVM"をRancherでデプロイしたKubernetesで動作させる方法を説明しています。
Masayuki Ishii
February 07, 2020
Transcript
46 slides
-
Rancher Meetup #11 in Osaka TopoLVM を Rancher で動かしてみた話 2020-02-07
サイボウズ株式会社 ⽯井 正將 (masa213f) -
⾃⼰紹介 ▌サイボウズ ⼤阪オフィス勤務 • OSや仮想化に興味があったエンジニア ▌経歴 • 前職では、電機メーカーでOS・仮想化の開発 • 2018/09
サイボウズ キャリア⼊社 • 2019/03 運⽤本部 インフラ刷新プロジェクト Neco へ異動 1 -
Neco プロジェクトとは ▌ ⾃社データセンターに Kubernetes クラスタを構築するプロジェクト ▌ ほとんどの成果は OSS として公開
▌ 3年計画の3年⽬ n これまで (2018、2019) • データセンターの構築、 • 物理マシンの管理ツール、Kubernetesクラスタの管理ツール • ドメインや SSL/TLS 証明書の⾃動管理、ロードバランサーなど n これから (2020) • Rook/Ceph、Elasticsearch、MySQLクラスタの構築 • モニタリング、ログ管理 • マルチテナント 4 -
TopoLVM ▌サイボウズで開発している Kubernetes 向けのストレージプラグイン ▌特⻑は3つ 1. ノードのローカルストレージを LVM (Logical Volume
Manager) で管理 2. 必要な時に、必要な場所(ノード) で、動的にボリュームを確保 3. ノードのローカルストレージの空き容量を考慮した、Pod のスケジューリング Ø ボリューム管理のための、オペレーションコストが削減できる ※ これらを実現するストレージプラグインは TopoLVM だけ 6 -
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 -
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 -
Scheduler Extension ▌Scheduler Extension とは • Pod のスケジューリング処理 (ノードへの割当て処理) を拡張するための機能
• kube-scheduler から Webhook を実⾏する Ø https://kubernetes.io/docs/concepts/extend-kubernetes/extend-cluster/#scheduler-extensions ▌TopoLVM では • ローカルストレージの空き容量を元に、配置先ノードの候補をフィルタリング Ø ストレージを考慮した スケジューリングを実現 9 -
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 -
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 -
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 ストレージ、ヨシ︕ -
▌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 -
確認したバージョン ▌以下のバージョンで動作確認しました • 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 -
デモ ▌PVC と Pod を⽣成して、PV を動的に作成 ▌Rancher Server 上で、PV を確認
▌LVM の容量を確認 18 -
動作確認時の⼤まかな⼿順 1. Rancher Server の起動 2. Kubernetes クラスタの構築 3. Kubernetes
上での準備: Ø cert-manager デプロイ、namespace にラベル追加 4. lvmd インストール 5. TopoLVM デプロイ 6. topolvm-scheduler の設定 7. Scheduler Extension の設定 19 クラスタの準備 TopoLVM のインストール & 設定 -
はまりポイント ▌以下3つの⼿順で、Rancher⽤ ⼜は 環境固有 の設定が必要 4. lvmd のインストール Ø VG
(Volume Group) の設定 & ノードに直接デプロイが必要 6. topolvm-scheduler の設定 Ø topolvm-scheduler を kube-scheduler と同じノード (Master ノード) に配置する 7. Scheduler Extension の設定 Ø kube-scheduler の設定変更が必要 (将来的には簡略化できるかも) 21 -
1. Rancher Server の起動 ▌rancher 上で、Rancher Server を起動します 22 $
sudo docker run -d --restart=unless-stopped -p 80:80 -p 443:443 rancher/rancher 早い︕ 安い︕ 旨い︕ -
2. Kubernetes クラスタの構築 ▌Rancher Server の Web UI から カスタムクラスタ
を⽣成 • 「Add Cluster」 → 「From existing nodes (Custom)」 • Kubernetes Version: v1.16系 • Master ノードのロール: etcd、Control Plane • Worker ノードのロール: Worker Ø 後は、表⽰されたコマンドを、各ノードで実⾏するだけ 23 -
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 -
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 -
4. lvmd インストール (1) ▌lvmd のインストールは、次の3ステップ 1. VG の⽣成 2.
lvmd のインストール 3. Systemd でサービス化 Ø 難しくはないけど、環境固有の設定やノード上での操作がある 26 -
4. lvmd インストール (2) 1. VG (Volume Group) の⽣成 •
Worker ノードで、以下のコマンドを実⾏する ※ vgcreate のコマンドの引数 • 第1引数 … VG名(上記では`myvg`) 任意の⽂字列でOK • 第2引数 … 使⽤するブロックデバイス、環境に応じて変更 (今回は`/dev/nvme0n1`) 27 $ sudo vgcreate myvg /dev/nvme0n1 -
4. lvmd インストール (3) 2. lvmd のインストール • lvmd のバイナリを、GitHub
のリリースページから取得し Worker ノードの /opt/sbin に配置 Ø https://github.com/cybozu-go/topolvm/releases/tag/v0.2.2 28 -
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のマニフェストも修正する) -
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 -
6. topolvm-schedulerの設定 (1) ▌マニフェストの apply だけでは topolvm-scheduler が起動しない • topolvm-scheduler
と kube-scheduler を同じノードで動作させたい • GitHub にある TopoLVM のマニフェストは kubeadm ⽤ Ø Node affinity と Toleration の設定を Rancher ⽤に変更する 31 -
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 -
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 を配置する。 -
7. Scheduler Extension の設定 (1) ▌Scheduler Extension の設定は、次の2ステップ 1. kube-scheduler
が読込める場所に設定ファイルを置き 2. kube-scheduler の起動オプションを変更する Ø Rancher でデプロイした Kubernetes では、どうやって設定するのだろうか︖ 34 -
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" } ], -
7. Scheduler Extension の設定 (3) ▌TopoLVM では、2つのファイルを配置する 1. KubeSchedulerConfiguration (yaml)
• kube-scheduler の設定 2. スケジューラポリシー (json) • Scheduler Extendsion の設定 36 -
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 スケジューラポリシー(次のスライド参照)のパス クライアント証明書(このファイルが適切なのか⾃信はない) -
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 -
7. Scheduler Extension の設定 (6) ▌kube-scheduler の起動オプションを変更する 1. Rancher のクラスタ設定画⾯から
Cluster Options: を選択 Ø Web UI から RKE の cluster.yml を編集できる 39 -
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 -
動作確認 ▌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 -
さいごに ▌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 -
さいごに、その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 -
Maneki & Neco Meetup のご案内 ▌以下の⽇程で Meetup を開催予定です • ⽇時︓2020/02/18(⽕)
19:00〜21:00 • 場所︓東京、⼤阪 + インターネット配信 Ø Maneki & Neco Meetup (connpass) https://cybozu.connpass.com/event/162304/ インターネット配信を予定しているので 興味がありましたらぜひ︕ 45