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

地端自建 Kubernetes (K8s) 小宇宙 (On-premises Kubernet...

地端自建 Kubernetes (K8s) 小宇宙 (On-premises Kubernetes) @ CNTUG 2024/11 Meetup #63

加上 AI 人工智慧與 ML 機器學習的需求, Kubernetes (K8s) 的基礎建設更為重要。
什麼?你想要地端全自建?這是什麼巫術?
在這場演講中,我們會介紹一些常見的 Kubernetes 安裝需要的關鍵元件,分享地端建置甚至到 GPU 主機建置遇到的問題,給大家做一個指引,少走一些彎路

(主題亦有在 KaLUG Kaohsiung Linux User Group 再次分享)

Johnny Sung

November 21, 2024
Tweet

More Decks by Johnny Sung

Other Decks in Technology

Transcript

  1. Full stack developer Johnny Sung (宋岡諺) https://fb.com/j796160836 https://blog.jks.co ff ee/

    https://www.slideshare.net/j796160836 https://github.com/j796160836
  2. CAP 定理 • 一 致性(Consistency) •可 用 性(Availability) •分區容錯性(Partition tolerance)

    https://zh.wikipedia.org/zh-tw/CAP%E5%AE%9A%E7%90%86 https://medium.com/nerd-for-tech/understand-cap-theorem-751f0672890e
  3. Created by hanis tusiyani from Noun Project https://thenounproject.com/icon/server-7086299/
 https://thenounproject.com/icon/data-center-7086329/
 https://www.pngwing.com/en/free-png-ztqam

    docker run -v ./www:/usr/share/nginx/html:ro -p 80:80 -d nginx version: "3" services: nginx: image: nginx volumes: - ./www:/usr/share/nginx/html:ro ports: - 80:80 docker run 指令 docker-compose.yml 一 次起 多組服務 一 次起 單 一 服務
  4. Created by hanis tusiyani from Noun Project https://thenounproject.com/icon/server-7086299/
 https://thenounproject.com/icon/data-center-7086329/
 https://www.pngwing.com/en/free-png-ztqam

    Created by hanis tusiyani from Noun Project docker run -v ./www:/usr/share/nginx/html:ro -p 80:80 -d nginx version: "3" services: nginx: image: nginx volumes: - ./www:/usr/share/nginx/html:ro ports: - 80:80 docker run 指令 docker-compose.yml • deployment.yml • services.yml • rbac.yml • config-map.yml • …. 一 次起 多組服務 Kubernetes 多組服務 部署在 多台主機 上 一 次起 單 一 服務
  5. Pod • Kubernetes 的最 小 單位 • 裡 面 「通常」只會有

    一 個 container (sidecar 情境除外) https://medium.com/@ajeetrai707/kubernetes-pods-an-introduction-650b6f93874d
  6. • 將 一 個 Pod 或 一 組 Pod 開放對外出去的定義,


    運作模式主要有三種: • ClusterIP • NodePort • Load Balancer Service (服務) apiVersion: v1 kind: Service metadata: name: my-service namespace: my-namespace spec: selector: app: my-deployment ports: - protocol: TCP port: 3000 targetPort: 3000 nodePort: 31200 type: NodePort (NodePort 範圍 30000-32767) 地端 K8s 預設沒有 LoadBalancer 可 用
  7. Deployment (部署) • 定義 一 個 Pod 的部署 方 式

    • Replicas 要幾份 • 設定參數 • Con fi gMap, Secret • Resources Limit (CPU, memory) • VolumeMounts
 (使 用 的 PersistentVolumeClaim PVC) apiVersion: apps/v1 kind: Deployment metadata: labels: app: my-deployment name: my-deployment namespace: my-namespace spec: replicas: 1 selector: matchLabels: app: my-deployment template: metadata: labels: app: my-deployment spec: containers: - image: my_image:1.0 name: my_image resources: requests: memory: 64Mi cpu: 250m limits: memory: 128Mi cpu: 500m ports: - containerPort: 3000 name: my_image volumeMounts: - name: my-pvc mountPath: /mydata - name: my-pvc mountPath: /data/output volumes: - name: my-pvc persistentVolumeClaim: claimName: my-pvc
  8. Pod Container Deployment ReplicaSet https://thenounproject.com/icon/ram-7094983/ https://thenounproject.com/icon/hard-disk-7094988/ https://thenounproject.com/icon/network-5355161/ https://thenounproject.com/icon/history-5019532/ https://thenounproject.com/icon/central-processing-unit-7095000/ https://thenounproject.com/icon/form-6622708/


    https://thenounproject.com/icon/approval-6293848/ by Muhammad Naufal Subhiansyah from Noun Project by Muhammad Naufal Subhiansyah from Noun Project Service Created by Mada Creative PVC PersistentVolumeClaim PersistentVolume PV 1:1 網站服務的基本元件
  9. Pod Container Deployment ReplicaSet https://thenounproject.com/icon/ram-7094983/ https://thenounproject.com/icon/hard-disk-7094988/ https://thenounproject.com/icon/network-5355161/ https://thenounproject.com/icon/history-5019532/ https://thenounproject.com/icon/central-processing-unit-7095000/ https://thenounproject.com/icon/form-6622708/


    https://thenounproject.com/icon/approval-6293848/ by Muhammad Naufal Subhiansyah from Noun Project by Muhammad Naufal Subhiansyah from Noun Project Service Created by Mada Creative PVC PersistentVolumeClaim PersistentVolume PV Created by Andika Cahya Fitriani from the Noun Project Provisioner StorageClass 1:1 網站服務的基本元件 還有更多...
  10. 磁碟相關 • PersistentVolumeClaim (PVC):空間要求 • PersistentVolume (PV) • StorageClass Hard

    Disk Drive by Ahmad Roaayala from Noun Project (CC BY 3.0)
 https://thenounproject.com/browse/icons/term/hard-disk-drive/
  11. PersistentVolumeClaim (PVC) • 白 話 文 :存放(磁碟)空間的要求 • 開發 人

    員建置(類似空間需求申請單) Hard Disk Drive by Ahmad Roaayala from Noun Project (CC BY 3.0)
 https://thenounproject.com/browse/icons/term/hard-disk-drive/ MB => Mi (Mebibytes) GB => Gi (Gibibytes) apiVersion: v1 kind: PersistentVolumeClaim metadata: name: my-pvc spec: storageClassName: nfs-client accessModes: - ReadWriteMany resources: requests: storage: 10Gi
  12. 對應 Kubernetes 的元件 • 服務部署 → Deployment / Pod •

    磁碟 → PersistentVolumeClaim (PVC) / Con fi gMap / Secret • 網路 → Service / Ingress 永久磁碟儲存需求 會 自 動 1:1 對應 PersistentVolume (PV) 地端 K8s 預設沒有 LoadBalancer 可 用
  13. Kustomize Kustomize 是 一 個 Kubernetes 的配置管理 工 具,可以透過定制資源的配置來 簡化

    Kubernetes 的部署。它專注於以聲明式 方 式修改和管理 Kubernetes manifest 檔案,不需要動態 生 成配置。使 用 者可以建 立 基礎配置的 "基底", 然後在不同環境(如開發、測試和 生 產)中進 行 客製化覆蓋。Kustomize 允許 合併或替換 YAML 檔案的部分,使得配置更加模組化和可重 用 。它現在是 Kubernetes 的 一 部分,可以直接透過 kubectl 命令 行工 具使 用 。 https://zlaval.medium.com/kustomize-template-free-kubernetes-application-management-3d70ca9d2e05
  14. Helm Helm 是 一 個 用 於 Kubernetes 的套件管理 工

    具,允許開發者和運維團隊打包、 配置和部署服務。Helm 使 用 稱為 "Charts" 的配置 文 件來描述 一 組相關的 Kubernetes 資源,這些資源可以預先配置並重複使 用 。透過 Helm, 用 戶 可以輕 鬆地安裝、升級和管理 Kubernetes 應 用 ,並 支 援版本控制和回滾 (Rollback) 功 能,使得部署和維護變得更加 方 便和有效。 https://helm.sh/
  15. Created by Mas Mirza from Noun Project values.yml • deployment.yml

    • services.yml • rbac.yml • config-map.yml • …. Helm 檔案架構 https://thenounproject.com/icon/ fi le-6897025/ https://thenounproject.com/icon/puzzle-6850847/ Charts
  16. 我給你 一 個預設選項吧! •作業系統 OS:ubuntu •K8s distro:kubeadm •Container Runtime: docker

    •CNI (Container Network Interface): fl annel •CRI (Container Runtime Interface): cri-dockerd https://soco-st.com/21673 https://en.m.wikipedia.org/wiki/File:UbuntuCoF.svg https://www.docker.com/company/newsroom/media-resources/
  17. K8s 作業系統選擇 •建議選多 人用 的 •Debian 系列:Ubuntu, Debian, … •Redhat

    系列:RHEL (Red Hat Enterprise Linux), RockyLinux, Fedora core, …
  18. K8s distro 選擇 •個 人 經驗,使 用 標準 kubeadm 指令

    (也有 人 稱為 Vanilla Kubernetes) •商 用 付費版可以考慮
  19. Flannel Calico Cilium •使 用 BGP(Border Gateway Protocol)進 行 路由,提供

    高 效的三層網絡 • •利 用 Linux 的 eBPF 技 術,直接在內核層處理網絡 流量 • 支 援 L3/L4/L7 層的網絡 策略 •簡單易 用 的網絡解決 方 案 •使 用 VXLAN 或 host-gw 模式來實現網絡互通 •不 支 援 Network Policies 無法做細粒度的流量控制 CNI 比 較 https://www.civo.com/blog/calico-vs- fl annel-vs-cilium
  20. 特性 Flannel Calico Cilium 主要 用 途 簡單網絡連接 高 性能網絡與安全策略

    現代化網絡與安全策略 封裝 方 式 VXLAN/host-gw BGP/IPIP/VXLAN eBPF 性能 中 高 高 支 持網絡策略 否 是(進階策略) 是(L3-L7 層 支 援) 資源消耗 低 中 中 學習曲線 低 中 高 高 適 用 場景 小 型集群、簡單場景 大 型集群、混合環境 微服務、 高 安全性需求 CNI 比 較
  21. 大 致步驟 •<每台都做> 關掉 Swap •<每台都做> 安裝 Docker •<每台都做> 安裝

    kubelet、kubeadm、kubectl •<每台都做> 安裝 cri-dockerd •<每台都做> 設定 /etc/hosts •設定 Control plane node •設定 Worker node •<Control plane 做> 安裝 Helm 套件管理程式 •<Control plane 做> 安裝 Flannel CNI •<Control plane 做> 測試檢查叢集
  22. K8s Control Plane 元件 •kube-apiserver 主要核 心 ,提供 Kubernetes HTTP

    API •etcd Key-Value 資料庫,有 一 致性與 高 可 用 的特 色 •kube-scheduler 排程分配器,把 Pod 分到合適的 node •kube-controller-manager 有 一 個 Run Loop 監控叢集的狀態,盡可能調整狀態達成 目 標 •cloud-controller-manager 與雲端廠商元件溝通使 用 ,底層與雲端整合
  23. K8s 重點元件 •kubelet •etcd •CoreDNS •Network CNI •Container Runtime (CRI)

    https://github.com/coredns https://github.com/etcd-io/etcd
  24. GPU K8s 大 致步驟 •裝 NVIDIA driver(.run的版本) •裝 NVIDIA Cuda

    •裝 NVIDIA Container Toolkit •下指令 patch con fi g 綁定 Containerd •裝 Kubernetes •裝 GPU Operator
  25. Time slicing •分時多 工 的原理 •vRAM 不限制 MPS •Multi-Thread 方

    式分配 •vRAM 每份固定 大 (Multi-Process Service)
  26. MIG •硬體層 面 切割 GPU •指定型號才有 (例如:A100, H100) •Blackwell 或

    Hopper™ 系列 vGPU •NVIDIA 支 援 GPU 虛擬化 •要軟體授權 (Multi-Instance GPU) (virtual GPU) https://www.nvidia.com/en-us/technologies/multi-instance-gpu/
  27. GPU Mode 比 較 •Time slicing: Memory 不限制,Process 間會排擠 •MPS:

    軟體性均分 •MIG: 硬體層級分割 https://cloud.google.com/kubernetes-engine/docs/concepts/timesharing-gpus
  28. 關於 hostname •合法字元: 小 寫 a-z 數字 0-9 與連字號 -

    •63 個字元 •不要 用大 寫,不要 用 底線 _ 1 to 63 characters long and the entire hostname, including the dots, can be at most 253 characters long. Valid characters for hostnames are ASCII(7) letters from a to z, the digits from 0 to 9, and the hyphen (−). A hostname may not start with a hyphen. https://www.linuxcampus.net/documentation/man-html/htmlman7/hostname.7.html
  29. 指令/操作 持續時間 影響範圍 效果 sysctl -w vm.swappiness=0 臨時 只降低 swap

    使 用 優先權 swap 還在,但基本不會被 用 到 sudo swapoff -a 臨時 停 止 當前所有 swap 分區 swap 停 用 ,內存壓 力 增加 修改 /etc/fstab 永久 👑 開機後不再啟 用 swap swap 永久禁 用 關閉 SWAP
  30. SWAP 參數 •Redhat / RockeyLinux 預設會有參數在 GRUB2 上 grubby --info

    DEFAULT 查看 grub2 參數 index=0 kernel="/boot/vmlinuz-5.14.0-503.14.1.el9_5.x86_64" args="ro crashkernel=1G-4G:192M,4G-64G:256M,64G-:512M resume=/dev/mapper/rl_rk8--ctrl-swap rd.lvm.lv=rl_rk8-ctrl/root rd.lvm.lv=rl_rk8-ctrl/swap" root="/dev/mapper/rl_rk8--ctrl-root" initrd="/boot/initramfs-5.14.0-503.14.1.el9_5.x86_64.img" title="Rocky Linux (5.14.0-503.14.1.el9_5.x86_64) 9.5 (Blue Onyx)" id="11732e333bc94575b1636210b0a72f03-5.14.0-503.14.1.el9_5.x86_64" 影響開機流程
  31. grubby --update-kernel=ALL --remove-args="resume=/dev/mapper/rl_rk8--ctrl-swap rd.lvm.lv=rl_rk8-ctrl/swap" SWAP 參數 •Redhat / RockeyLinux 預設會有參數在

    GRUB2 上 index=0 kernel="/boot/vmlinuz-5.14.0-503.14.1.el9_5.x86_64" args="ro crashkernel=1G-4G:192M,4G-64G:256M,64G-:512M resume=/dev/mapper/rl_rk8--ctrl-swap rd.lvm.lv=rl_rk8-ctrl/root rd.lvm.lv=rl_rk8-ctrl/swap" root="/dev/mapper/rl_rk8--ctrl-root" initrd="/boot/initramfs-5.14.0-503.14.1.el9_5.x86_64.img" title="Rocky Linux (5.14.0-503.14.1.el9_5.x86_64) 9.5 (Blue Onyx)" id="11732e333bc94575b1636210b0a72f03-5.14.0-503.14.1.el9_5.x86_64" 移除 grub2 參數 影響開機流程
  32. GPU Compute Mode •0: Default (Compute shared mode) 預設, 一

    次可以執 行 多個程式 •1: Exclusive Thread (deprecated) 作 用 與 Exclusive Process 相同 •2: Prohibited 禁 止 在該卡執 行 任何計算程式 •3: Exclusive Process 獨佔模式,該卡只能 一 次執 行一 個程式 Multi-Process Service (MPS) 將使 用 這個 Time slicing 將使 用 這個
  33. GPU Compute Mode Compute Mode The compute mode flag indicates

    whether individual or multiple compute applications may run on the GPU. "Default" means multiple contexts are allowed per device. "Exclusive Process" means only one context is allowed per device, usable from multiple threads at a time. "Prohibited" means no contexts are allowed per device (no compute apps). "EXCLUSIVE_PROCESS" was added in CUDA 4.0. Prior CUDA releases supported only one exclusive mode, which is equivalent to "EXCLUSIVE_THREAD" in CUDA 4.0 and beyond. For all CUDA-capable products.
  34. GPU Compute Mode •使 用 nvidia-smi 指令設定 nvidia-smi -i 0

    -c DEFAULT nvidia-smi -i 0 -c EXCLUSIVE_PROCESS 第幾張卡, index 從零開始 Compute Mode
  35. 把玩開源 LLM •Gemma 採 用 與建 立 Gemini 模型時相同的研究成果和技術, 開源

    LLM 模型 •Ollama https://ollama.com/ •Open webui https://openwebui.com/
  36. 選 手 介紹 Gemma-7B TAIDE-LX-8B MR Breeze-7B TAIDE 計畫是由財團法 人

    國 家實驗研究院 (國研院) 致 力 於開發符合台灣語 言 和 文 化特性的 生 成式 人工 智慧 對話引擎模型 基於 Llama3 開發並建置 聯發創新基地 (MediaTek Research) 基於 Mistral-7B 開發出 開源的 MediaTek Research Breeze-7B 模型 採 用 與建 立 Gemini 模型時 相同的研究成果和技術, 開源 LLM 模型 https://huggingface.co/chienweichang/Llama3-TAIDE-LX-8B-Chat-Alpha1-GGUF https://huggingface.co/MediaTek-Research/Breeze-7B-Instruct-v1_0 https://huggingface.co/google/gemma-7b