Slide 1

Slide 1 text

K8s@home#1 OTSUKA, Motohiro / Yuanying Kubernetes at home #1

Slide 2

Slide 2 text

Who am I ? ● OTSUKA, Motohiro / @yuanying ○ Z Lab Corporation ○ 趣味 ■ 🚴 ロードバイク (2009 - ) ■ 🏊 トライアスロン (2010 - ) ■ 🏠 自宅サーバ (2002 -) ● VIA C3 Ezra 866MHz - ● Transmeta Efficeon - ● Pentium M 1.5GHz (Banias) - ● Mac mini - ● NUC Core i3 3217U - ● Kubernetes on Hetero Node -

Slide 3

Slide 3 text

🏠 K8s@home とは 🌲 k8s@home

Slide 4

Slide 4 text

1. 自宅クラスタ特有のノウハウを 共有 2. 仕事でできない遊びを発表 3. 業務における真面目な発表は 「Kubernetes Meetup Tokyo」

Slide 5

Slide 5 text

ちなみに

Slide 6

Slide 6 text

🎉 10/10 自宅k8sクラスタ満5歳 🎉

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

🏃クラスタ構成の基本方針 💻 ハードウェア構成 🍦 ソフトウェア構成 🏗 クラスタ構築、アップデート方法 📢 アピールポイント 🆕 自宅クラスタのこれから

Slide 10

Slide 10 text

🏃クラスタ構成の基本方針

Slide 11

Slide 11 text

1. できるだけ省電力で”使える” 2. できるだけ冗長化 3. できるだけKubernetesに載せる

Slide 12

Slide 12 text

💻 ハードウェア構成

Slide 13

Slide 13 text

Role Model CPU Memory cp-111 Control Plane Raspberry Pi 4 Cortex A72 1.5GHz 4GB cp-112 Control Plane Raspberry Pi 4 Cortex A72 1.5GHz 4GB cp-113 Control Plane Raspberry Pi 4 Cortex A72 1.5GHz 4GB pablo Worker NUC 7i3BNH Core i3 7300U 32GB duchamp Worker NUC 8i5BEH Core i5 8269U 32GB oeilvert Worker DeskMini A300 Ryzen 5 3400G 64GB chirico Worker Minisforum UM480 Ryzen 7 4800U 64GB braque Storage Liva Z N4200 Pentium N4200 16GB

Slide 14

Slide 14 text

No content

Slide 15

Slide 15 text

EdgeRouter X Web 16 Port Switch cp 113 cp 112 cp 111 duchamp pablo oeilvert braque 8TBHDD 8TBHDD 8TBHDD 2TB SSD 2TB SSD 2TB SSD HW構成 UPS

Slide 16

Slide 16 text

UPS EdgeRouter X Web 16 Port Switch cp 113 cp 112 cp 111 duchamp pablo oeilvert braque 8TBHDD 8TBHDD 8TBHDD 2TB SSD 2TB SSD 2TB SSD 1. 光回線終端装置(ONU)直結 ○ IPv6: DHCPv6 で 56bit プレフィック スを直接もらえる 2. 設定ファイルでDeclaretiveに設定をコント ロールできる ○ 設定をテストした後にロールバック が簡単! ■ 😌 Managed by Git ■ ❌ No more Web UI !! ■ ❌ No more Imprative !! 3. BGPも使えるがまだ使っていない と言っても、YAMAHA や CISCO と比べたアドバンテージ は価格くらい? ルーターの冗長化は …? VIOLATION (2) VIOLATION (3)

Slide 17

Slide 17 text

$ git diff diff --git a/fraction/config.boot b/fraction/config.boot index f7374d7..7fde7a5 100644 --- a/fraction/config.boot +++ b/fraction/config.boot @@ -615,8 +615,8 @@ service { listen-on switch0 listen-on lo name-server 8.8.8.8 - name-server 1.1.1.1 - name-server 2606:4700:4700::1001 + name-server 8.8.4.4 + name-server 2001:4860:4860::8888 name-server 2001:4860:4860::8844 options enable-ra options dhcp-range=::,constructor:switch0,slaac,64,24h $ congigure [edit] # load /fraction.config.boot # commit; save

Slide 18

Slide 18 text

EdgeRouter X Web 16 Port Switch cp 113 cp 112 cp 111 duchamp pablo oeilvert braque 8TBHDD 8TBHDD 8TBHDD 2TB SSD 2TB SSD 2TB SSD 1. メモリは4GB無いと辛い ○ リソースが少ないとクラスター再起動時に etcdの負荷 が捌けずそのまま死ぬ 💀 2. 起動ディスクは外付け USBのSSD 128GB ○ SDカードでetcd動かすのは若干不安 3. etcd ノードとして 3台構成 (冗長化! SSDを追加すると電源が不安だが、こ の拡張ボードには別に電源供給用の DC 55x25 ジャックがついてくる。 (AC アダプタは別売り

Slide 19

Slide 19 text

UPS EdgeRouter X Web 16 Port Switch cp 113 cp 112 cp 111 duchamp pablo oeilvert braque 8TBHDD 8TBHDD 8TBHDD 2TB SSD 2TB SSD 2TB SSD 1. メモリは 32GB + 32GB + 64GB とそれなり に潤沢にあるが、CPUコア数がメモリに比 べると不足気味 ○ `resource.requests.cpu = 1` とかや りすぎると死ぬ 💀 ○ Core i3がいらない子…。 2. 🐄 Workerノードと言いつつ、2TB SSD x3 で Longhorn クラスタを組んで Block デバ イスをクラスタに供給 ○ Cephをやるには人生が短かった … ○ ストレージに興味がない人にはお手 軽でお薦め。 1. Longhorn自体が死んでもディスクからデータ 復旧が比較的簡単 ○ 基本的にストレージのコントローラが死 ぬとデータ復旧辛くない? 2. 基本的にミラーリングなのでわかりやすい

Slide 20

Slide 20 text

UPS EdgeRouter X Web 16 Port Switch cp 113 cp 112 cp 111 duchamp pablo oeilvert braque 8TBHDD 8TBHDD 8TBHDD 2TB SSD 2TB SSD 2TB SSD 1. ZFSでRaidZ (冗長化! ○ 16TBのストレージとして利用中。 2. メモリ16GBあるのでよくキャッシュが効いてる気がする。 ○ 普通のNASと比べて性能が良いと信じたい。 3. NFSをDaemonSetとして配備 ○ 主にLonghornに置いたファイルのバックアップ用途。 ○ minioとかにしても良いかもしれない。 StorageもK8sの一員!

Slide 21

Slide 21 text

UPS EdgeRouter X Web 16 Port Switch cp 113 cp 112 cp 111 duchamp pablo oeilvert braque 8TBHDD 8TBHDD 8TBHDD 2TB SSD 2TB SSD 2TB SSD 1. 停電に怯えなくて良い、お守り的存在。 ○ 千葉は都心と比べて停電率高め …。 ○ 停電で落ちた後のクラスタ復旧は大変。 ○ 適当に買ったのでメーカーとか覚えてない。 もちろんk8sクラスタの一員で はない VIOLATION (3)

Slide 22

Slide 22 text

🍦 ソフトウェア構成

Slide 23

Slide 23 text

   Kubernetes

Slide 24

Slide 24 text

control-plane control-plane control-plane Worker Worker Worker kubelet kubelet kubelet kubelet kubelet kubelet etcd etcd etcd kube-apiserver kube-apiserver kube-apiserver kube-proxy kube-proxy kube-proxy kube-cm kube-cm kube-scheduler kube-scheduler kube-proxy kube-proxy kube-proxy 凡例 Systemd Unit Static Pod DaemonSet Deployment Flannel Flannel Flannel Flannel Flannel Flannel metallb metallb metallb coredns metallb metallb metallb

Slide 25

Slide 25 text

control-plane control-plane control-plane Worker Worker Worker kubelet kubelet kubelet kubelet kubelet kubelet etcd etcd etcd kube-apiserver kube-apiserver kube-apiserver kube-proxy kube-proxy kube-proxy kube-cm kube-cm kube-scheduler kube-scheduler kube-proxy kube-proxy kube-proxy 凡例 Systemd Unit Static Pod DaemonSet Deployment Flannel Flannel Flannel Flannel Flannel Flannel metallb metallb metallb coredns metallb metallb metallb kubeadm

Slide 26

Slide 26 text

自作スクリプト kubeadm kubelet Systemd Unit Systemd Unit kubeletをDaemonSetは可能? etcd Static Pod Static Pod etcd operatorに制御は移譲可能。 apiserver DaemonSet Static Pod DaemonSet可は比較的容易。 controller-manager Deployment Static Pod Static Podにする意味がわからない。 scheduler Deployment Static Pod 同上。 proxy DaemonSet DaemonSet coredns Deployment Deployment 1. Policy (3): できるだけKubernetesに載せる! ○ 「Self-hosted Kubernetes」

Slide 27

Slide 27 text

 🕷 Network

Slide 28

Slide 28 text

Pod Network CNI: Flannel host-gw Dual Stack Service iptables Loadbalancer MetalLB: ARP mode Ingress nginx-ingress ● そろそろFlannelから移行したい ○ できればオンラインマイグレーション

Slide 29

Slide 29 text

 💾 Storage

Slide 30

Slide 30 text

Block Storage ● Longhorn ● メインのデータ置き場 ● ブロックデバイスとして切り出し ● RWXが必要な場合は別途NFS File System ● Plain Old NFS ● ZFS raidz2 ● バックアップ用途 Object Storage ● MinIO ● Docker registry / Log ● 二年ほど前に ZFS から Volume を切り出して iSCSI PV を作る “zvol-iscsi-pv-provisioner” を作ったが、取り回し が悪いので Longhorn or NFS に移行。 ○ yuanying/tgtd-operator ○ yuanying/zfs-operator ○ yuanying/zvol-iscsi-pv-provisioner

Slide 31

Slide 31 text

 👀 Observability

Slide 32

Slide 32 text

Logs `kubectl logs`... Metrics kube-prometheus https://speakerdeck.com/yuanying/kube-prometheuswoqi-qing-nikustomize Traces Currently Not Available… ● Loki導入予定 ○ その前にminio…

Slide 33

Slide 33 text

 🎁 その他

Slide 34

Slide 34 text

● nginx ● Minecraft ● CodiMD ● Homegallery ● Headless-Chrome ● KubeVirt ● Infra用ミドルウェアに比べてアプリケーションは 少なめ…。 ○ どうしてこうなった/ (^o^)\ ● 最近はAIを用いたアプリケーションが多くなって きたのでGPUノードが欲しい。 ○ Jetson Orin Nano…

Slide 35

Slide 35 text

🏗 クラスタ構築、アップデート方法

Slide 36

Slide 36 text

 🏗 クラスタ構築 ● Self-hosted Kubernetes ○ できるだけk8sに載せる ● 元アイディアは coreos/bootkube ○ https://github.com/kubernetes-retired/bootkube ○ アーカイブされている …。

Slide 37

Slide 37 text

デプロイ手順 0. Manifest を作成 1. ノードに kubelet 起動 2. kubelet 上で etcd 起動 3. bootstrap 用 kubernetes 制御系起動 4. bootstrap を利用して kubernetes 起動 5. bootstrap 削除

Slide 38

Slide 38 text

Working PC 自作スクリプト Control Plane Control Plane Control Plane Worker Worker Worker 凡例 Systemd Unit Static Pod DaemonSet Deployment

Slide 39

Slide 39 text

Working PC 自作スクリプト Manifest Manifest Manifest Control Plane Control Plane Control Plane Worker Worker Worker Manifest Manifest Systemd Unit 凡例 Systemd Unit Static Pod DaemonSet Deployment Certs Certs Certs Kubernetes 構築に必 要な asset を生成

Slide 40

Slide 40 text

Working PC 自作スクリプト Manifest Manifest Manifest Control Plane Control Plane Control Plane Worker Worker Worker kubelet kubelet kubelet kubelet kubelet kubelet Systemd Unit 凡例 Systemd Unit Static Pod DaemonSet Deployment Certs Certs Certs Systemd Unit Systemd Unit Systemd Unit Systemd Unit Systemd Unit kubelet を各ノードで systemd unit として起動

Slide 41

Slide 41 text

Certs Certs Certs Working PC 自作スクリプト Manifest Manifest Manifest Master Master Master Worker Worker Worker kubelet kubelet kubelet kubelet kubelet kubelet etcd etcd etcd 凡例 Systemd Unit Static Pod DaemonSet Deployment Certs Certs Certs Control Plane Control Plane Control Plane kubelet kubelet kubelet Certs Certs Certs etcd Manifest etcd Manifest etcd Manifest Master 各ノードで etcd を Static Pod として起動

Slide 42

Slide 42 text

Working PC 自作スクリプト Manifest Manifest Manifest Control Plane Control Plane Control Plane Worker Worker Worker kubelet kubelet kubelet kubelet kubelet kubelet etcd etcd etcd bootstrap kube-apiserver bootstrap kube-cm bootstrap kube-scheduler 凡例 Systemd Unit Static Pod DaemonSet Deployment Certs bootstr ap Manifest bootstrap で利用する、完全に動 作する Kubernetes Control Plane を 1 ノードで起動

Slide 43

Slide 43 text

Working PC 自作スクリプト Manifest Manifest Manifest Control Plane Control Plane Control Plane Worker Worker Worker kubelet kubelet kubelet kubelet kubelet kubelet etcd etcd etcd bootstrap kube-apiserver bootstrap kube-cm bootstrap kube-scheduler 凡例 Systemd Unit Static Pod DaemonSet Deployment bootstrap kubernetes に ノードがJoin

Slide 44

Slide 44 text

Working PC 自作スクリプト Control Plane Control Plane Control Plane Worker Worker Worker kubelet kubelet kubelet kubelet kubelet kubelet etcd etcd etcd bootstrap kube-apiserver bootstrap kube-cm bootstrap kube-scheduler kube-apiserver kube-apiserver kube-apiserver kube-proxy kube-proxy kube-proxy kube-cm kube-cm kube-scheduler kube-scheduler kube-proxy kube-proxy kube-proxy 凡例 Systemd Unit Static Pod DaemonSet Deployment k8s Manifest bootstrap の Kubernetes に対して Kubernetes 構築を指示する

Slide 45

Slide 45 text

Working PC 自作スクリプト Control Plane Control Plane Control Plane Worker Worker Worker kubelet kubelet kubelet kubelet kubelet kubelet etcd etcd etcd kube-apiserver kube-apiserver kube-apiserver kube-proxy kube-proxy kube-proxy kube-cm kube-cm kube-scheduler kube-scheduler kube-proxy kube-proxy kube-proxy 凡例 Systemd Unit Static Pod DaemonSet Deployment 必要なくなった bootstrap を削除

Slide 46

Slide 46 text

Control Plane Control Plane Control Plane Worker Worker Worker kubelet kubelet kubelet kubelet kubelet kubelet etcd etcd etcd kube-apiserver kube-apiserver kube-apiserver kube-proxy kube-proxy kube-proxy kube-cm kube-cm kube-scheduler kube-scheduler kube-proxy kube-proxy kube-proxy 凡例 Systemd Unit Static Pod DaemonSet Deployment Flannel Flannel Flannel Flannel Flannel Flannel coredns

Slide 47

Slide 47 text

 🏗 アップデート方法 ● Update Node (kubelet) ● Apply Manifest

Slide 48

Slide 48 text

● Update Node (kubelet) ○ ノードごとにkubeletのバイナリをアップデート ○ systemd restart ● Apply Manifest ○ etcd バックアップ ○ マニフェストのバージョン更新 ○ Apply

Slide 49

Slide 49 text

🤔 アップデート失敗しないの?

Slide 50

Slide 50 text

Control Plane Control Plane Control Plane Worker Worker Worker kubelet kubelet kubelet kubelet kubelet kubelet etcd etcd etcd kube-apiserver kube-apiserver kube-apiserver kube-proxy kube-proxy kube-proxy kube-cm kube-cm kube-scheduler kube-scheduler kube-proxy kube-proxy kube-proxy Flannel Flannel Flannel Flannel Flannel Flannel Control Plane Control Plane Control Plane Worker Worker Worker kubelet kubelet kubelet kubelet kubelet kubelet etcd etcd etcd kube-apiserver kube-apiserver kube-apiserver kube-proxy kube-proxy kube-proxy kube-cm kube-cm kube-scheduler kube-scheduler kube-proxy kube-proxy kube-proxy Flannel Flannel Flannel Flannel Flannel Flannel kubevirt でテスト環境構築! 本番環境のServiceとして アクセス可能!

Slide 51

Slide 51 text

📢 アピールポイント

Slide 52

Slide 52 text

 🚫 No more haproxy/keepalived

Slide 53

Slide 53 text

kube-apiserver kube-apiserver kube-apiserver scheduler controller manager kubernetes.default.svc haproxy keepalived VIP kubelet kubelet haproxy keepalived ● 一般的な control-plane 冗長化構成 ● Kubernetesにはせっかく”Service” という 仕組みがあるのでそれを使いたい VIOLATION (3)

Slide 54

Slide 54 text

kube-apiserver kube-apiserver kube-apiserver scheduler controller manager kubernetes.default.svc kubelet kubelet porkadot-kubernetes External IP ● MetalLB を使って Service 越しに アクセス!

Slide 55

Slide 55 text

● デプロイ時にひと工夫いるが、クライアント 側からもService越しにアクセスできた!

Slide 56

Slide 56 text

🆕 自宅クラスタのこれから

Slide 57

Slide 57 text

1. 開発環境をK8sに載せる 2. クラスタネットワーク改善 すでにコンテナ化されているので、 k8sに載せるだけだが、その前に開発 環境のコンテナイメージを保存するレジストリが欲しい …。 kubevirt が Flannel の pod network を利用しているので、 取り回しが悪い。IPv6… Multus… OVS… VLAN…

Slide 58

Slide 58 text

📖 まとめ

Slide 59

Slide 59 text

自宅K8sクラスタは良いぞ。 ● 仕事ではできない自分ならではのこだわりを詰め込める! ○ 人によって違うこだわりがみたい!

Slide 60

Slide 60 text

Thanks!