Upgrade to Pro — share decks privately, control downloads, hide ads and more …

k8s@home#1

O. Yuanying
October 12, 2022

 k8s@home#1

O. Yuanying

October 12, 2022
Tweet

More Decks by O. Yuanying

Other Decks in Programming

Transcript

  1. 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 -
  2. 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
  3. 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
  4. 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)
  5. $ 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
  6. 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 アダプタは別売り
  7. 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. 基本的にミラーリングなのでわかりやすい
  8. 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の一員!
  9. 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)
  10. 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
  11. 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
  12. 自作スクリプト 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」
  13. Pod Network CNI: Flannel host-gw Dual Stack Service iptables Loadbalancer

    MetalLB: ARP mode Ingress nginx-ingress • そろそろFlannelから移行したい ◦ できればオンラインマイグレーション
  14. 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
  15. • nginx • Minecraft • CodiMD • Homegallery • Headless-Chrome

    • KubeVirt • Infra用ミドルウェアに比べてアプリケーションは 少なめ…。 ◦ どうしてこうなった/ (^o^)\ • 最近はAIを用いたアプリケーションが多くなって きたのでGPUノードが欲しい。 ◦ Jetson Orin Nano…
  16.  🏗 クラスタ構築 • Self-hosted Kubernetes ◦ できるだけk8sに載せる • 元アイディアは coreos/bootkube

    ◦ https://github.com/kubernetes-retired/bootkube ◦ アーカイブされている …。
  17. デプロイ手順 0. Manifest を作成 1. ノードに kubelet 起動 2. kubelet

    上で etcd 起動 3. bootstrap 用 kubernetes 制御系起動 4. bootstrap を利用して kubernetes 起動 5. bootstrap 削除
  18. Working PC 自作スクリプト Control Plane Control Plane Control Plane Worker

    Worker Worker 凡例 Systemd Unit Static Pod DaemonSet Deployment
  19. 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 を生成
  20. 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 として起動
  21. 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 として起動
  22. 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 ノードで起動
  23. 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
  24. 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 構築を指示する
  25. 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 を削除
  26. 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
  27. • Update Node (kubelet) ◦ ノードごとにkubeletのバイナリをアップデート ◦ systemd restart •

    Apply Manifest ◦ etcd バックアップ ◦ マニフェストのバージョン更新 ◦ Apply
  28. 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として アクセス可能!
  29. 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)