Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
自宅k8s構築日記 冬休み編
Search
世良泰明
January 22, 2024
Technology
0
220
自宅k8s構築日記 冬休み編
社内勉強会のLTネタ用.
冬休みに構築したk8sクラスターの話.
2024/1/20の小江戸らぐ 258回(スライド非公開)ではスライド未完で話せなかった内容を追記.
世良泰明
January 22, 2024
Tweet
Share
More Decks by 世良泰明
See All by 世良泰明
ラズパイ奮闘記 その1
y_sera15
0
51
metrics-serverをセキュアなTLSでデプロイしてみた
y_sera15
0
480
EKS勉強会
y_sera15
1
120
自宅k8sクラスター構築日記
y_sera15
0
190
EKSを動かしてみた話
y_sera15
0
99
ちょっと大きめのOSSにコントリビュートしかけた話
y_sera15
0
240
小江戸らぐ kubernetesクラスターを再構築した話
y_sera15
0
210
小江戸らぐ 自宅にkubernetesクラスターを構築した話
y_sera15
0
39
Other Decks in Technology
See All in Technology
React開発にStorybookとCopilotを導入して、爆速でUIを編集・確認する方法
yu_kod
1
300
AWS認定を取る中で感じたこと
siromi
1
210
サイバーエージェントグループのSRE10年の歩みとAI時代の生存戦略
shotatsuge
4
440
Delta airlines®️ USA Contact Numbers: Complete 2025 Support Guide
airtravelguide
0
340
インフラ寄りSREの生存戦略
sansantech
PRO
7
2.6k
データ基盤からデータベースまで?広がるユースケースのDatabricksについて教えるよ!
akuwano
3
140
AWS CDKの仕組み / how-aws-cdk-works
gotok365
8
300
60以上のプロダクトを持つ組織における開発者体験向上への取り組み - チームAPIとBackstageで構築する組織の可視化基盤 - / sre next 2025 Efforts to Improve Developer Experience in an Organization with Over 60 Products
vtryo
2
490
Delegating the chores of authenticating users to Keycloak
ahus1
0
160
事例で学ぶ!B2B SaaSにおけるSREの実践例/SRE for B2B SaaS: A Real-World Case Study
bitkey
1
160
SREの次のキャリアの道しるべ 〜SREがマネジメントレイヤーに挑戦して、 気づいたこととTips〜
coconala_engineer
1
160
fukabori.fm 出張版: 売上高617億円と高稼働率を陰で支えた社内ツール開発のあれこれ話 / 20250704 Yoshimasa Iwase & Tomoo Morikawa
shift_evolve
PRO
2
8.1k
Featured
See All Featured
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
130
19k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
The Straight Up "How To Draw Better" Workshop
denniskardys
235
140k
How GitHub (no longer) Works
holman
314
140k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
281
13k
For a Future-Friendly Web
brad_frost
179
9.8k
Build The Right Thing And Hit Your Dates
maggiecrowley
36
2.8k
[RailsConf 2023] Rails as a piece of cake
palkan
55
5.7k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
667
120k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
The Language of Interfaces
destraynor
158
25k
Building a Modern Day E-commerce SEO Strategy
aleyda
42
7.4k
Transcript
自宅k8s構築日記 冬休み編 2024/1/23 社内勉強会 世良泰明
自己紹介 名前: 世良 泰明 (せら やすあき) 職業: ひよっこインフラエンジニア (3年目) 名古屋の某SIer所属
AWS上でインフラ構築・運用 趣味: 囲碁, 散歩, etc… twitter: @y_sera15 自宅K8sクラスター
今日の話 冬休みに自宅のk8sクラスターを再構築したという話 帰省しなかったので, 休み中の起きてる時間の半分くらいはこれに費やしてました. 注: - この資料は現時点(2024/1/23)の自宅構成を一通りまとめたもの - 10分じゃとても終わらないので抜粋して説明 目次
• これまでの構成 • 今回のコンセプト • 物理構成 • NW構成 • VM構成 • k8sクラスター • ネットワーク • ストレージ • デプロイしたアプリケーション • まとめ • 今後の展望
これまでの構成(~2024/12末頃) これまでのk8sクラスター - Control Plane3台, worker3台のHA構成 - kubesprayにて構築(Ansibleベースのk8sクラスター構築ツール) - 諸々の基盤用プラグインもkubesprayから追加
- NASとの連携はやっていた 問題点: - ただ建ってるだけ(L7ロードバランサ(ingresss), DNS等未整備. アプリ稼働ゼロ) - 使いたいCNIプラグインのバージョンが古い(kubesprayが追従していなかった) - kubesprayとHelmコードの管理の煩雑化 改めて再構築することに 構築ツールはkubeadmを使用
今回のコンセプト 1. 可能な限りk8sで完結する - DNS, HA Proxyは全部載せ - コンテナレジストリ, gitサーバも
- 一部AWSと連携 2. 可能な限り自動化する - L7LB登録 → 証明書発行 → DNS登録 全部まるっとお任せ - ↑まだまだこれだけ 3. 可能な限りproduction likeに - 開発用構成で妥協しない - セキュア - (あくまでベストエフォート)
要件 - ストレージ基盤としてNASを活用する - パブリックドメインを取得し, クラスター上のアプリへはそれを用いてアクセスする. - webアプリのTLS化はLet's encryptにて取得した証明書を用いる. -
証明書取得はDNS認証にて行う.(インターネット公開をしないため.) - 外部クラウドサービス連携が必要な箇所はAWSを使用する. - クラスター向けドメインの名前解決は, NAS提供のDNSサーバーからForwardする. - OSSアプリケーションはHelmでの導入を最初に検討する. 無ければmanifestにて行う.
物理構成 Router(Yamaha RTX1220) - VPNルーター - LAN1: 8ポート - LAN2/LAN3:
各1ポート Router(Edge Router X) - 多機能ルーター - LAN1: 4ポート - MP-BGP対応 NAS( Synology DS923+) - 4TB HDD x4 - Memory 標準4GB + 拡張16GB - LANポート 2つ - RAID6構成 Compute ×3台(Intel NUC 11th) - core i5(4core 8thread) - Memory: 64GB - Storage: 1TB - VM基盤としてESXiを利用
NW構成 LAN1: 内部NW LAN1: 内部NW - Desktop/Laptop/mobile用
NW構成 LAN2: VM管理用NW LAN2: VM管理用NW - ESXiが稼働するNW - VLANにて制御
NW構成 LAN3: VM用NW LAN3: VM用NW - VMが稼働するNW - ここでk8sクラスター稼働
NW構成 ルーターにて LAN間NWを制御 ルーターにて LAN間NWを制御
NW構成 NAS NAS: LAN1 とLAN3向け にそれぞれ管理用 VMを構築 ホストゾーン internal.<取得ドメイン> ホストゾーン
k8sapiserver.<取得ドメイン> NASの標準アプリとしてDNSを稼働
VM構成 ノード数は変更せず OS: ubuntu22.04 server(minimum) Control Plane: - CPU: 2core
Mem: 8GB Storage: 50GB 構成変更なし NUC1 ESXi Control Plane1 Worker1 NUC2 ESXi Control Plane 2 Worker2 NUC3 ESXi Control Plane 3 Worker3 Worker: - CPU: 4core -> 6core Mem: 16GB -> 32GB Storage:50GB -> 100GB +300GB 諸々増強, 再構築 ※ESXiでは1thread = 1core扱い
k8sクラスター 入れたもの(2024/1/23時点) 1. Network - CNI: Cilium (+ Hubble) -
L4: kube-vip - L7: Nginx-Ingress - External DNS - cert-manager 2. Storage - Synology-CSI driver - TopoLVM 3. Application - GitLab - Tekton operator/Pipeline - ArgoCD - Harbor - Hashicorp Vault - Prometheus/Grafana 方針: - OSSは基本的にhelmで管理 - 無い場合はmanifest
k8sクラスター Network Cilium(+ Hubble) - CNIとしてインストール - kube-proxyを置換 - eBPFによるルーティングで,
スケーラビリティ向上 (iptablesベースのルーティングだとスケール限界が早い. が, この規模ならほぼロマン?) - HubbleでeBPFによる通信の可視化を行う Hubbleによるトレース 10.0.0.0/8 コンテナの世界のNW 192.168.xxx.0/24
k8sクラスター Network Kube-VIP - Haproxy+ keepalivedの代わりで, クラスター 内で完結できる - 仮想IPを払い出しする
- Kube-VIPのCloud Controllerを導入することで, type LoadBalancerのServiceがベアメタルでも 払い出せる 管理用端末 (デスクトップPC) アプリ用 L4 LB 192.168.xxx.ZZZ (仮想IPで固定) aaa.<取得ドメイン> コントロールプレーンのエンドポイント 192.168.xxx.XXX (仮想IPで固定) 名前解決 (aaa.<取得ドメイン>) http://aaa.<取得ドメイン> kubectlコマンド DNS用 L4 LB 192.168.xxx.YYY (仮想IPで固定)
k8sクラスター Network Nginx-Ingress Controller - L7層の負荷分散をする, Ingressリソースの コントローラー - L4層のロードバランサーが少数で済むので嬉しい
管理用端末 (デスクトップPC) アプリ用 L4 LB 192.168.xxx.ZZZ (仮想IPで固定) aaa.<取得ドメイン> bbb.<取得ドメイン> http://bbb.<取得ドメイン> ccc.<取得ドメイン> アプリA アプリB アプリC Nginx-Ingress Controller
k8sクラスター Network External DNS - デプロイしたアプリを自動でDNSへ登録 - 非常に便利 管理用端末 (デスクトップPC)
アプリ用 L4 LB 192.168.xxx.ZZZ (仮想IPで固定) aaa.<取得ドメイン> Forward (bbb.<取得ドメイン>) DNS用 L4 LB 192.168.xxx.YYY (仮想IPで固定) DNSのバックエンド DNS(on NAS) External-DNS bbb.<取得ドメイン> 名前解決 (bbb.<取得ドメイン>) 1. 検出 1. 検出 2. 自動登録 http://bbb.<取得ドメイン>
k8sクラスター Network Let's encrypt連携 - パブリックに使える証明書自動発行 - 証明書更新も自動 - インターネットへのリソース公開無し
AWS Cloud 管理用端末 (デスクトップPC) パブリックホストゾーン <取得ドメイン> L4 LB(アプリ用) 192.168.xxx.ZZZ (仮想IPで固定) L7 LB aaa.<取得ドメイン> 3. 検証用レコード登録 aaa.<取得ドメイン> 5. DNS検証 aaa.<取得ドメイン> 4. 証明書発行依頼 6. 証明書発行 7. 証明書保存 cert-manager Route53 8. 参照 証明書発行用リソース - Issuer - Certificate 1. 証明書発行用 リソース作成 2. 検知 HTTPS HTTPS HTTPS HTTPS
k8sクラスター Storage Synology-CSI driver - NASのメーカーがk8s用にドライバーをOSSで公開 - iscsiとSMBで通信可能. 動的にストレージを確保. -
LUNの上限10, 一部機能に対応してないなど, 多少懸念点あり. (LUNはNASの問題. 一部機能: fsGroupでのパーミッション変換.) TopoLVM - サイボウズが開発している, OSSストレージドライバー - 各ノードにてLVMを使用し動的にストレージを確保. - ストレージがノードに紐づくため, ノード障害に対して工夫が必要. - 各ノードに300GB確保 Worker Node Control Plane NAS iscsi SMB スケジューリング/ 監視
k8sクラスター Application 1. CICD周り - GitLab Gitホスティングサービス - Tekton Operator/Pipeline
K8s上で稼働するCIツール - ArgoCD GitOps用のデプロイツール - Harbor コンテナレジストリ 2. 機密情報管理 - Hashicorp Vault シークレット管理用 3. 監視・可視化 - Prometheus/Grafana メトリクス監視用 まだインストールしただけ。 実用は今後
まとめ 冬休みの間に自宅のk8sクラスターを再構築した - ネットワーク: - 冗長構成に必要な要素をk8sへ押し込んだ - L7ロードバランサーに登録するとDNSのレコードが自動登録されるようにした - 有効な署名付きTLS証明書を自動発行可能になった
- ストレージ: NASとローカルボリュームの両方で基盤を構築した - アプリケーション: - kubernertesでのCI/CDのスタートラインに立てた 構築したマニフェストファイル等はメモと一緒にGitで管理している 気力があれば公開するかも?
今後の展望 1. 自作アプリケーションの開発/デプロイ - GitOpsとしてCICDパイプライン作って開発 2. 基盤の拡充 - オブジェクトストレージ基盤 -
ログ収集/分析基盤 - newSQLのDB基盤 3. よりproduction likeに - セキュリティ(通信制御/TLS化, 権限管理, アラート) - バックアップ - アプリの構成見直し(defaultから適切な設定に変更) Kubernetes CI/CDパイプラインの実装 北山慎吾 インプレス
以下、補足スライド
苦労点 1. CNIが稼働せず 再構築したノードのcontainerdのパラメータ設定 -> Kubesprayで構築していたときはインストール前の設定もよしなにやってくれていた 2. NASのLUN上限 iscsiでNASからストレージを動的に調達 ->
LUN上限が10で意外と少ない => TopoLVMを導入し使い分け 3. NASのCSIドライバーの制約 コンテナ内の実行ユーザと, マウントしたディレクトリのパーミッションの統合ができな いっぽい(fsGroupパラメータ対応してなさそう) => パーミッション問題が絡むストレージは一旦TopoLVMベースで稼働.
セキュリティ対応 (やるかどうかは別として,)インターネット公開を念頭に対応箇所を洗い出し - ノード - FW設定 - sshログイン禁止 - クラスター
- クラスターエンドポイント保護 - 権限アクセス制御 - NetworkPolicy設定 - ロギング - auditログ - コンテナ間通信TLS化 - リソースクォータ設定 - アプリ公開範囲選定(基盤管理系アプリはSSO化など) - 監視設定(falco)