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