Rancher Meetup Osaka #11 での発表スライドです。 https://rancherjp.connpass.com/event/156187/
サイボウズで開発しているKubernetes向けのストレージプラグイン"TopoLVM"をRancherでデプロイしたKubernetesで動作させる方法を説明しています。
Rancher Meetup #11 in OsakaTopoLVM を Rancher で動かしてみた話2020-02-07サイボウズ株式会社⽯井 正將 (masa213f)
View Slide
⾃⼰紹介▌サイボウズ ⼤阪オフィス勤務• OSや仮想化に興味があったエンジニア▌経歴• 前職では、電機メーカーでOS・仮想化の開発• 2018/09 サイボウズ キャリア⼊社• 2019/03 運⽤本部 インフラ刷新プロジェクト Neco へ異動1
今⽇の内容▌Neco プロジェクトの紹介▌ストレージプラグイン TopoLVM の紹介▌TopoLVM を Rancher で動かしてみた話2
Neco プロジェクトの紹介
Neco プロジェクトとは▌ ⾃社データセンターに Kubernetes クラスタを構築するプロジェクト▌ ほとんどの成果は OSS として公開▌ 3年計画の3年⽬n これまで (2018、2019)• データセンターの構築、• 物理マシンの管理ツール、Kubernetesクラスタの管理ツール• ドメインや SSL/TLS 証明書の⾃動管理、ロードバランサーなどn これから (2020)• Rook/Ceph、Elasticsearch、MySQLクラスタの構築• モニタリング、ログ管理• マルチテナント4
ストレージプラグイン TopoLVM の紹介
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/ZerD7
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): ボリュームの確保10topolvm-controller(Deployment)topolvm-node(DaemonSet)worker2lvmdworker1 diskVG VGdisktopolvm-node(DaemonSet)lvmdLVクラスタ全体のボリュームを管理H/WLVMSystemd サービスKubernetesワークロードアプリ(Pod)PV該当ノードに関する処理をハンドリングLVM の操作LV … LV LV
TopoLVM の動作 (2): Pod スケジューリング▌デフォルトのスケジューリングØ CPU、メモリ しか考慮しない11masterH/WKubernetesコンポーネントKubernetesワークロードkube-apiserverkube-scheduleretcd kubeletアプリ(Pod)Pod の 割当て先ノードを決める(CPU、メモリ だけを考慮)Pod を起動worker1CPU: 4コア空きメモリ: 8GBストレージ: 空きなしworker2CPU: 8コア空きメモリ: 8GBストレージ: 100GBストレージないから動けないよ…条件的にはどちらもOK
TopoLVM の動作 (2): Pod スケジューリング▌topolvm-scheduler で、ストレージの空き容量を判定12masterkube-apiserverkube-scheduleretcd kubeletアプリ(Pod)空き容量を判定(Scheduler Extension)Pod を起動worker1CPU: 4コア空きメモリ: 8GBストレージ: 空きなしworker2CPU: 8コア空きメモリ: 8GBストレージ: 100GBOK!H/WKubernetesコンポーネントKubernetesワークロードtopolvm-schedulerストレージ、ヨシ︕
TopoLVM をRancher で動かしてみた話
今回のモチベーション▌TopoLVM を試してみたけど 動かないよ︕ といった話がちらほら14どうやらインストールが難しいらしい……ぼくらの環境ではちゃんと動くのに……おや、Rancher 利⽤者からの報告が多いぞ︖
だから試してみた▌Rancher で動すことができれば、TopoLVM の利⽤者が増えるね︕15
▌GCP の VM インスタンス × 計4台 (いずれも n1-standard-2、Ubuntu 18.04)• Rancher Server⽤ × 1 (ホスト名: rancher)• Master ノード⽤ × 1 (ホスト名: master)• Worker ノード⽤ × 2 (ホスト名: worker1、worker2)Ø TopoLVM で管理するボリューム(SSD)を追加しておくmaster worker1 worker2ranhcer確認したクラスタ構成KubernetesSSDSSDetcd Control PlanePod Pod PodLV 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 のインストール & 設定
詳細な⼿順▌以下のリポジトリに詳細な⼿順が書いてありますØ https://github.com/masa213f/example-topolvm20
はまりポイント▌以下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-L2724
3. Kubernetes 上での準備(2): namespaceにラベル追加▌システム⽤の namespace に、次のラベルを追加するØ このラベルを設定した namespace では、TopoLVM が動作しなくなる▌今回の場合、kube-system ns、cert-manager ns にラベルを設定する25topolvm.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.228
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 TopoLVMWants=lvm2-monitor.serviceAfter=lvm2-monitor.service[Service]Type=simpleRestart=on-failureRestartForceExitStatus=SIGPIPEExecStartPre=/bin/mkdir -p /run/topolvmExecStart=/opt/sbin/lvmd --volume-group=myvg --listen=/run/topolvm/lvmd.sock[Install]WantedBy=multi-user.targetVG名(環境に合わせて変更する)https://github.com/cybozu-go/topolvm/blob/v0.2.2/deploy/systemd/lvmd.servicetopolvm-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 Label1. node-role.kubernetes.io/controlplane=true2. node-role.kubernetes.io/etcd=truen Taint1. node-role.kubernetes.io/controlplane=true:NoSchedule2. node-role.kubernetes.io/etcd=true:NoExecute32
6. topolvm-schedulerの設定 (3)▌topolvm-scheduler の Node affinity と Toleration を書き換るØ 変更がうまくいくと、topolvm-scheduler の Pod が起動し始める33$ kubectl edit daemonset topolvm-scheduler -n topolvm-systemaffinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- - key: node-role.kubernetes.io/master+ - key: node-role.kubernetes.io/controlplaneoperator: Existstolerations:- key: CriticalAddonsOnlyoperator: 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 の結果から確認できる)35master $ 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 のリポジトリにあるものは使えない)37apiVersion: kubescheduler.config.k8s.io/v1alpha1kind: KubeSchedulerConfigurationschedulerName: default-scheduleralgorithmSource:policy:file:path: /etc/kubernetes/scheduler/scheduler-policy.cfgclientConnection:kubeconfig: /etc/kubernetes/ssl/kubecfg-kube-scheduler.yamlhttps://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.cfg38
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 を読み込ませる40services:...- scheduler: {}+ scheduler:+ extra_args:+ config: /etc/kubernetes/scheduler/scheduler-config.yamlssh_agent_auth: false
設定完了︕41
動作確認▌PVC の storageClassName に、topolvm-provisioner を指定するとTopoLVM でボリュームを確保できます42kind: PersistentVolumeClaimapiVersion: v1metadata:name: topolvm-pvcspec:accessModes:- ReadWriteOnceresources:requests:storage: 1GistorageClassName: topolvm-provisionerhttps://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-intro43
さいごに、その2▌次の KEP (Kubernetes Enhancement Proposal) でストレージの空き容量を考慮したPodスケジューリングの標準的な⽅法が議論された(なので、将来的には topolvm-scheduler の設定を簡略化できるかも)1. Storage Capacity Constraints for Pod Scheduling #1353Ø https://github.com/kubernetes/enhancements/pull/13532. 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