境搭建——minikube 與 kubeadm 快速部署集群運維實戰(zhàn)與AI漫畫教程 | 恒星博客)
在上一篇中我們建立了對 Kubernetes 整體架構(gòu)的認(rèn)知控制平面負責(zé)調(diào)度與狀態(tài)協(xié)調(diào)節(jié)點上的 kubelet 與容器運行時負責(zé)真正跑容器。但「看懂架構(gòu)」和「上手操作」之間還隔著一層最容易被新手卡住的東西——環(huán)境。很多人不是學(xué)不會 K8s而是連一套能跑的集群都搭不起來最后在安裝報錯中放棄了。這一篇我們就來解決這個問題用兩種主流方式把 Kubernetes 環(huán)境搭起來。一種是輕量級的minikube適合本地學(xué)習(xí)與開發(fā)另一種是生產(chǎn)向的kubeadm適合搭建真實的、可擴展的集群。掌握這兩條路徑后續(xù) 28 天所有的實驗都有落腳點。一、兩種工具的核心定位1. minikube一鍵起一個單節(jié)點集群minikube 會在本機啟動一個虛擬機或容器里面內(nèi)置了一個單節(jié)點的 Kubernetes 集群。它把控制平面和節(jié)點「揉」在一起一條命令就能把整套環(huán)境跑起來非常適合第一次接觸 K8s 的人理解概念、做實驗。它的優(yōu)勢是極低的入門成本缺點是它本質(zhì)上是單機模擬無法驗證多節(jié)點調(diào)度、高可用等生產(chǎn)特性。2. kubeadm生產(chǎn)級集群的官方引導(dǎo)工具kubeadm 是 Kubernetes 官方提供的集群初始化工具負責(zé)完成kubeadm init初始化控制平面與kubeadm join加入工作節(jié)點兩個核心動作。它不幫你管理節(jié)點生命周期只負責(zé)把各組件正確裝配起來因此更適合用來搭建多節(jié)點、可長期運行的真實集群。兩者的關(guān)系可以理解為minikube 是「練車場」kubeadm 是「正式上路」。二、環(huán)境準(zhǔn)備容器運行時與系統(tǒng)配置無論用哪種方式底層都需要一個容器運行時。Kubernetes 從 1.24 起移除了對 Docker 作為默認(rèn)運行時的依賴改用containerd作為標(biāo)準(zhǔn)運行時。在 Ubuntu 系統(tǒng)上先關(guān)閉 swap 并加載必要的內(nèi)核模塊# 關(guān)閉 swapKubernetes 要求sudoswapoff-asudosed-i/swap/d/etc/fstab# 加載內(nèi)核模塊sudomodprobe overlaysudomodprobe br_netfilter# 配置內(nèi)核參數(shù)catEOF|sudotee/etc/sysctl.d/k8s.confnet.bridge.bridge-nf-call-iptables 1 net.ipv4.ip_forward 1 net.bridge.bridge-nf-call-ip6tables 1 EOFsudosysctl--system接著安裝 containerd 并生成默認(rèn)配置sudoapt-getupdatesudoapt-getinstall-ycontainerd.iosudomkdir-p/etc/containerd containerd config default|sudotee/etc/containerd/config.toml/dev/nullsudosystemctl restart containerdsudosystemctlenablecontainerd三、方式一minikube 快速部署1. 安裝 minikubecurl-LOhttps://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64sudoinstallminikube-linux-amd64 /usr/local/bin/minikube2. 啟動集群minikube 支持多種驅(qū)動docker、kvm2、virtualbox 等。以最常用的 docker 驅(qū)動為例minikube start--driverdocker--cpus2--memory4096啟動完成后驗證集群狀態(tài)minikube status kubectl get nodes正常情況下會看到一個名為minikube的節(jié)點處于Ready狀態(tài)這就說明單節(jié)點集群已經(jīng)就緒。3. 常用管理命令minikube dashboard# 打開 Web 控制臺minikube stop# 停止集群保留數(shù)據(jù)minikube delete# 徹底刪除集群minikubeservicemyapp# 暴露服務(wù)四、方式二kubeadm 部署多節(jié)點集群1. 安裝 kubeadm、kubelet、kubectl三件套需要同時安裝并鎖定版本避免升級導(dǎo)致集群組件不匹配sudoapt-getupdatesudoapt-getinstall-yapt-transport-https ca-certificatescurlcurl-fsSLhttps://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key|sudogpg--dearmor-o/etc/apt/keyrings/kubernetes-apt-keyring.gpgechodeb [signed-by/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /|sudotee/etc/apt/sources.list.d/kubernetes.listsudoapt-getupdatesudoapt-getinstall-ykubelet kubeadm kubectlsudoapt-mark hold kubelet kubeadm kubectl2. 初始化控制平面節(jié)點在 master 節(jié)點執(zhí)行kubeadm init指定 pod 網(wǎng)絡(luò)網(wǎng)段sudokubeadm init --pod-network-cidr10.244.0.0/16 --kubernetes-versionv1.29.0初始化成功后終端會輸出一串kubeadm join命令務(wù)必保存下來后續(xù)工作節(jié)點加入時要使用。為當(dāng)前用戶配置 kubectl 訪問權(quán)限mkdir-p$HOME/.kubesudocp-i/etc/kubernetes/admin.conf$HOME/.kube/configsudochown$(id-u):$(id-g)$HOME/.kube/config3. 部署 Pod 網(wǎng)絡(luò)插件集群需要一個 CNI 網(wǎng)絡(luò)插件才能讓 Pod 之間互通以 Flannel 為例kubectl apply-fhttps://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml4. 加入工作節(jié)點在每臺 worker 節(jié)點上執(zhí)行初始化時保存的 join 命令形如下面這條token 與 IP 以實際輸出為準(zhǔn)sudokubeadmjoin192.168.1.100:6443--tokenabcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx回到 master 節(jié)點查看節(jié)點狀態(tài)kubectl get nodes-owide當(dāng)所有節(jié)點都顯示Ready時多節(jié)點集群即搭建完成。五、常見問題與排查1. 節(jié)點一直是 NotReady多數(shù)情況是網(wǎng)絡(luò)插件未生效用kubectl get pods -n kube-system查看 CNI 組件是否 Running。若 flannel 一直 CrashLoopBackOff檢查/etc/containerd/config.toml中SystemdCgroup是否設(shè)為true與 kubelet 的 cgroup 驅(qū)動保持一致。2. kubeadm init 卡在等待控制平面通常是鏡像拉取失敗。可以提前用下面的命令預(yù)拉取鏡像或配置國內(nèi)鏡像源sudokubeadm config images pull3. swap 未關(guān)閉導(dǎo)致 kubelet 啟動失敗Kubernetes 默認(rèn)禁止在開啟 swap 的節(jié)點上運行務(wù)必執(zhí)行swapoff -a并持久化到/etc/fstab。六、總結(jié)這一篇我們走通了兩條部署路徑minikube一條命令起集群適合本地快速體驗kubeadm完整裝配控制平面與工作節(jié)點適合生產(chǎn)與多節(jié)點實驗。環(huán)境就緒之后下一篇我們將正式進入 Kubernetes 最核心的對象體系——Pod、Label、Selector 與命名空間理解容器在集群中的真正「最小調(diào)度單元」。下期預(yù)告第 3 天《核心對象——Pod、Label、Selector 與命名空間》我們將拆解 Pod 的本質(zhì)以及 Label 與 Selector 是如何讓集群中的資源「對上暗號」的敬請期待。Making the absolute best of ourselves is not an easy task. It is a pleasurable pursuit…but it requires patience, persistence, and perseverance.做最好的自己并不容易這是很美好的愿望需要耐心、堅持和毅力