Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

Neco プロジェクトの紹介

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

TopoLVM を Rancher で動かしてみた話

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

▌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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

設定完了︕ 41

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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