IT策士 10余年一线大厂经验专注 IT 思维、架构、职场进阶。我会在各个平台持续发布最新文章助你少走弯路。在第 19 篇中我们把 Kubernetes 的架构拆解了一遍——控制平面的四大组件、工作节点的三大组件、以及一个 Pod 从创建到运行的完整旅程。但架构图看得再多不如亲手敲一行kubectl get nodes。从本篇开始我们正式进入动手阶段。今天的目标很明确在你的电脑上启动一个 K8s 集群安装 kubectl 命令行工具部署你的第一个 Pod亲眼看看控制平面和 kubelet 是怎么协作的。这也是我们贯穿案例 Flask Redis 计数器应用 K8s 化的起点——从第 10 篇我们用纯 Docker 命令启动了它到第 44-45 篇我们将把它完整部署到 K8s 集群上。一、为什么是 Minikube搭建 K8s 集群的方案很多不同阶段适合不同的工具为什么本系列选择 Minikube三个原因它提供了最接近标准 K8s 的体验包含控制平面全套组件一条minikube start就能搞定不折腾社区活跃官方支持所有主流操作系统。等到第 47 篇讲生产级考量时我们会回过头来讨论kubeadm多节点部署和云托管方案。二、安装 kubectlkubectl 是你和 K8s 集群交互的唯一 CLI 工具。无论你用 Minikube、kubeadm 还是云托管都靠它下命令。请先完成本节安装否则后续所有示例都无法执行。2.1 各平台安装macOS推荐 HomebrewWindows推荐 wingetwingetinstallKubernetes.kubectl安装完成后关闭并重新打开 PowerShell 或 Windows Terminal。Linux通过包管理器以 Ubuntu/Debian 为例sudoapt-getupdatesudoapt-getinstall-yapt-transport-https ca-certificatescurlgnupg# 添加 K8s 官方 GPG 密钥2025 年底起建议使用新版获取方式sudomkdir-p/etc/apt/keyringscurl-fsSLhttps://pkgs.k8s.io/core:/stable:/v1.32/deb/Release.key|\sudogpg--dearmor-o/etc/apt/keyrings/kubernetes-apt-keyring.gpg# 添加 K8s APT 仓库echodeb [signed-by/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.32/deb/ /|\sudotee/etc/apt/sources.list.d/kubernetes.listsudoapt-getupdatesudoapt-getinstall-ykubectl版本说明本文以 v1.32 为例。如需安装其他版本请将命令中的v1.32替换为目标版本号。版本兼容性策略是 kubelet 版本与 API Server 不超过 ±1 个次要版本。对于本地实验环境kubectl 版本可以等于或略新于集群版本。所有平台通用安装方式# 下载最新稳定版curl-LOhttps://dl.k8s.io/release/$(curl-L-shttps://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl# 安装sudoinstall-oroot-groot-m0755 kubectl /usr/local/bin/kubectl2.2 验证安装输出Client Version: v1.32.0 Kustomize Version: v5.5.0如果你看到Server Version报错The connection to the server localhost:8080 was refused这是正常的——因为集群还没启动。我们在第 47 篇会深入 kubectl 的kubeconfig配置机制。三、安装 Minikube 并启动集群Minikube 的安装方式按操作系统分为三种路径请根据你的操作系统选择。3.1 各平台安装 MinikubemacOSWindows推荐 wingetLinux推荐直接下载二进制curl-LOhttps://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64sudoinstallminikube-linux-amd64 /usr/local/bin/minikubermminikube-linux-amd643.2 启动集群Minikube 支持多种驱动driver用于运行 K8s 节点。操作系统与推荐驱动的对应关系如下确认 Docker 驱动可用minikube start--driverdocker输出关键行 minikube v1.34.0 on Ubuntu22.04✨ Using thedockerdriver based on existing profile Starting control planenodeminikubeincluster minikube Pulling base image... Downloading Kubernetes v1.31.0 preload... Creatingdockercontainer(CPUs2,Memory2200MB)... Preparing Kubernetes v1.31.0 on Docker27.2.0... Verifying Kubernetes components... Enabled addons: storage-provisioner, default-storageclass Done!kubectl is now configured to useminikubeclusterMinikube 帮你做了什么它自动下载了包含 K8s 组件的 ISO 镜像创建了一个 Docker 容器来运行单节点集群并将 kubectl 的配置指向了这个新集群。3.3 验证集群状态输出NAME STATUS ROLES AGE VERSION minikube Ready control-plane 30s v1.31.0ROLES列显示control-plane因为 Minikube 的单节点集一身承担了控制平面和工作节点的双重角色。输出Kubernetes control plane is running at https://192.168.49.2:8443 CoreDNS is running at https://192.168.49.2:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy3.4 查看控制平面组件的真实面貌我们在第 19 篇学过控制平面组件运行在kube-system命名空间中。来亲眼看一看kubectl get pods-nkube-system输出NAME READY STATUS RESTARTS AGE coredns-7c8b6f9d5f-abcde1/1 Running02m etcd-minikube1/1 Running02m kube-apiserver-minikube1/1 Running02m kube-controller-manager-minikube1/1 Running02m kube-proxy-xyz121/1 Running02m kube-scheduler-minikube1/1 Running02m storage-provisioner1/1 Running02m对照第 19 篇的架构图你看到了etcd、kube-apiserver、kube-scheduler、kube-controller-manager还有工作节点上的kube-proxy。架构图里的抽象概念此刻正在你的电脑上真实运行着。四、部署第一个应用Nginx环境就绪来跑一个真正的应用。4.1 创建一个 Deploymentkubectl create deployment my-nginx--imagenginx:alpine输出deployment.apps/my-nginx created这条命令在 K8s 中做了什么它创建了一个 Deployment 对象控制器Deployment Controller 监听到后创建了 ReplicaSetReplicaSet Controller 创建了一个 PodScheduler 将 Pod 分配给了唯一的节点节点上的 kubelet 拉取镜像并启动了 Nginx 容器。整个过程就是第 19 篇讲的 7 步完整链路。对比一下在 Docker 中你要执行docker run -d --name my-nginx nginx:alpine只涉及本地 Docker Daemon而在 K8s 中控制平面组件和 kubelet 协作完成了相同的效果。4.2 查看 Pod 状态输出NAME READY STATUS RESTARTS AGE my-nginx-5c6d7f8b9f-abcde1/1 Running030sREADY 1/1Pod 中 1 个容器已就绪STATUS RunningPod 正在运行RESTARTS 0容器从未重启过如果STATUS显示Pending或ImagePullBackOff说明调度或镜像拉取出了问题。Minikube 环境下最常见的原因是镜像拉取超时——执行kubectl describe pod pod名可以看到详细事件日志。4.3 查看 Deployment 详情输出NAME READY UP-TO-DATE AVAILABLE AGE my-nginx1/1111mREADY 1/1期望 1 个副本当前 1 个副本就绪UP-TO-DATE已更新到最新版本的 Pod 数AVAILABLE可用的 Pod 数4.4 端口转发在 K8s 中Pod 的端口默认不会自动暴露到宿主机。快速测试时可以用port-forward建立临时隧道kubectl port-forward deployment/my-nginx8080:80输出Forwarding from127.0.0.1:8080 -80Forwarding from[::1]:8080 -80此时终端被占用打开另一个终端curlhttp://localhost:8080你会看到 Nginx 的欢迎页面 HTML。port-forward绕过了 Service 和 Ingress直接将你本机的 8080 端口流量转发到 Pod 的 80 端口。它适合调试但不适合生产流量因为 kubectl 进程本身就是单点故障。生产环境中你需要用 ServiceNodePort/LoadBalancer Ingress 来暴露服务这些将在第 28-31 篇展开。按CtrlC结束端口转发。五、体验 K8s 的核心特性5.1 自愈能力删除一个 Pod观察控制器如何自动重建# 先记住当前 Pod 名字kubectl get pods# NAME READY STATUS RESTARTS AGE# my-nginx-5c6d7f8b9f-abcde 1/1 Running 0 5m# 删除这个 Podkubectl delete pod my-nginx-5c6d7f8b9f-abcde# pod my-nginx-5c6d7f8b9f-abcde deleted# 立即查看Pod 已被新版本替换kubectl get pods# NAME READY STATUS RESTARTS AGE# my-nginx-5c6d7f8b9f-xyz12 1/1 Running 0 5s旧 Pod 被删了一个全新的 Pod名字后半段不同立刻被创建出来。Deployment Controller 检测到实际 Pod 数量0不等于期望数量1触发创建新 Pod。这就是控制循环的自愈能力——也是 Compose 中restart: unless-stopped在 K8s 层面的增强版。5.2 扩容将 Nginx 的副本数从 1 扩到 3kubectl scale deployment my-nginx--replicas3# deployment.apps/my-nginx scaledkubectl get pods-w# NAME READY STATUS RESTARTS AGE# my-nginx-5c6d7f8b9f-xyz12 1/1 Running 0 6m# my-nginx-5c6d7f8b9f-def34 0/1 ContainerCreating 0 2s# my-nginx-5c6d7f8b9f-ghi56 0/1 ContainerCreating 0 2s# my-nginx-5c6d7f8b9f-def34 1/1 Running 0 10s# my-nginx-5c6d7f8b9f-ghi56 1/1 Running 0 10s三条命令从 1 个副本变成了 3 个。对比 Compose 的--scaleK8s 的扩容也是声明式的——修改期望副本数后控制器自动调和实际状态。在第 36 篇我们还会学习 HPA水平自动伸缩让 K8s 根据 CPU 和内存使用率自动调整副本数。按CtrlC退出 watch 模式。六、Minikube 常用管理命令Minikube 毕竟是个实验环境下面这些命令是日常使用的高频操作。如果实验环境出现问题最快恢复方式是重建集群minikube delete minikube start--driverdocker从头到尾约 2-3 分钟适用于“环境被玩坏了”的极端情况。6.1 集群暂停与恢复当你不需要 K8s 运行时可以通过暂停释放 CPU 和内存资源# 暂停集群保留所有已部署的资源但释放计算资源minikube pause# 恢复集群minikube unpause这个操作不会丢失任何部署的资源Pod、Deployment、Service 等只是暂停了控制平面和工作节点进程适合午休或长时间不用时暂时释放资源。七、命令速查表八、本篇总结今天这篇是整个 K8s 实战的“起手式”——我们成功搭建了实验环境验证了第 19 篇的架构知识部署了第一个应用体验了自愈和扩容这两个 K8s 最核心的特性。具体来说你学会了在本地用 Minikube 一键启动单节点集群使用 kubectl 管理 Deployment 和 Pod 的生命周期验证了控制器模式下的自愈能力实现了从 1 到 3 的副本扩容。至此本系列四个阶段的工具链已清晰成型单机容器化Docker→ 单机编排Compose→ 集群编排K8s 核心对象→ 生产级运维后续 30 篇将逐一覆盖的监控、日志、CI/CD、安全、服务网格。此刻你的电脑上已经有一个真实的 K8s 集群在跑kubectl get pods -n kube-system能看到全套控制平面组件——你已经站在了云原生的门槛上。下一篇文章——第 21 篇Pod最小调度单元与 YAML 详解我们将深入 K8s 最核心的概念从 Pod 的 YAML 结构开始理解为什么 Pod 是“最小的、不可再分的调度单元”。想了解更多还可以去各个平台搜索「IT策士」一起升级 IT 思维
第 20 篇 搭建 Kubernetes 实验环境:Minikube 与 kubectl
IT策士 10余年一线大厂经验专注 IT 思维、架构、职场进阶。我会在各个平台持续发布最新文章助你少走弯路。在第 19 篇中我们把 Kubernetes 的架构拆解了一遍——控制平面的四大组件、工作节点的三大组件、以及一个 Pod 从创建到运行的完整旅程。但架构图看得再多不如亲手敲一行kubectl get nodes。从本篇开始我们正式进入动手阶段。今天的目标很明确在你的电脑上启动一个 K8s 集群安装 kubectl 命令行工具部署你的第一个 Pod亲眼看看控制平面和 kubelet 是怎么协作的。这也是我们贯穿案例 Flask Redis 计数器应用 K8s 化的起点——从第 10 篇我们用纯 Docker 命令启动了它到第 44-45 篇我们将把它完整部署到 K8s 集群上。一、为什么是 Minikube搭建 K8s 集群的方案很多不同阶段适合不同的工具为什么本系列选择 Minikube三个原因它提供了最接近标准 K8s 的体验包含控制平面全套组件一条minikube start就能搞定不折腾社区活跃官方支持所有主流操作系统。等到第 47 篇讲生产级考量时我们会回过头来讨论kubeadm多节点部署和云托管方案。二、安装 kubectlkubectl 是你和 K8s 集群交互的唯一 CLI 工具。无论你用 Minikube、kubeadm 还是云托管都靠它下命令。请先完成本节安装否则后续所有示例都无法执行。2.1 各平台安装macOS推荐 HomebrewWindows推荐 wingetwingetinstallKubernetes.kubectl安装完成后关闭并重新打开 PowerShell 或 Windows Terminal。Linux通过包管理器以 Ubuntu/Debian 为例sudoapt-getupdatesudoapt-getinstall-yapt-transport-https ca-certificatescurlgnupg# 添加 K8s 官方 GPG 密钥2025 年底起建议使用新版获取方式sudomkdir-p/etc/apt/keyringscurl-fsSLhttps://pkgs.k8s.io/core:/stable:/v1.32/deb/Release.key|\sudogpg--dearmor-o/etc/apt/keyrings/kubernetes-apt-keyring.gpg# 添加 K8s APT 仓库echodeb [signed-by/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.32/deb/ /|\sudotee/etc/apt/sources.list.d/kubernetes.listsudoapt-getupdatesudoapt-getinstall-ykubectl版本说明本文以 v1.32 为例。如需安装其他版本请将命令中的v1.32替换为目标版本号。版本兼容性策略是 kubelet 版本与 API Server 不超过 ±1 个次要版本。对于本地实验环境kubectl 版本可以等于或略新于集群版本。所有平台通用安装方式# 下载最新稳定版curl-LOhttps://dl.k8s.io/release/$(curl-L-shttps://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl# 安装sudoinstall-oroot-groot-m0755 kubectl /usr/local/bin/kubectl2.2 验证安装输出Client Version: v1.32.0 Kustomize Version: v5.5.0如果你看到Server Version报错The connection to the server localhost:8080 was refused这是正常的——因为集群还没启动。我们在第 47 篇会深入 kubectl 的kubeconfig配置机制。三、安装 Minikube 并启动集群Minikube 的安装方式按操作系统分为三种路径请根据你的操作系统选择。3.1 各平台安装 MinikubemacOSWindows推荐 wingetLinux推荐直接下载二进制curl-LOhttps://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64sudoinstallminikube-linux-amd64 /usr/local/bin/minikubermminikube-linux-amd643.2 启动集群Minikube 支持多种驱动driver用于运行 K8s 节点。操作系统与推荐驱动的对应关系如下确认 Docker 驱动可用minikube start--driverdocker输出关键行 minikube v1.34.0 on Ubuntu22.04✨ Using thedockerdriver based on existing profile Starting control planenodeminikubeincluster minikube Pulling base image... Downloading Kubernetes v1.31.0 preload... Creatingdockercontainer(CPUs2,Memory2200MB)... Preparing Kubernetes v1.31.0 on Docker27.2.0... Verifying Kubernetes components... Enabled addons: storage-provisioner, default-storageclass Done!kubectl is now configured to useminikubeclusterMinikube 帮你做了什么它自动下载了包含 K8s 组件的 ISO 镜像创建了一个 Docker 容器来运行单节点集群并将 kubectl 的配置指向了这个新集群。3.3 验证集群状态输出NAME STATUS ROLES AGE VERSION minikube Ready control-plane 30s v1.31.0ROLES列显示control-plane因为 Minikube 的单节点集一身承担了控制平面和工作节点的双重角色。输出Kubernetes control plane is running at https://192.168.49.2:8443 CoreDNS is running at https://192.168.49.2:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy3.4 查看控制平面组件的真实面貌我们在第 19 篇学过控制平面组件运行在kube-system命名空间中。来亲眼看一看kubectl get pods-nkube-system输出NAME READY STATUS RESTARTS AGE coredns-7c8b6f9d5f-abcde1/1 Running02m etcd-minikube1/1 Running02m kube-apiserver-minikube1/1 Running02m kube-controller-manager-minikube1/1 Running02m kube-proxy-xyz121/1 Running02m kube-scheduler-minikube1/1 Running02m storage-provisioner1/1 Running02m对照第 19 篇的架构图你看到了etcd、kube-apiserver、kube-scheduler、kube-controller-manager还有工作节点上的kube-proxy。架构图里的抽象概念此刻正在你的电脑上真实运行着。四、部署第一个应用Nginx环境就绪来跑一个真正的应用。4.1 创建一个 Deploymentkubectl create deployment my-nginx--imagenginx:alpine输出deployment.apps/my-nginx created这条命令在 K8s 中做了什么它创建了一个 Deployment 对象控制器Deployment Controller 监听到后创建了 ReplicaSetReplicaSet Controller 创建了一个 PodScheduler 将 Pod 分配给了唯一的节点节点上的 kubelet 拉取镜像并启动了 Nginx 容器。整个过程就是第 19 篇讲的 7 步完整链路。对比一下在 Docker 中你要执行docker run -d --name my-nginx nginx:alpine只涉及本地 Docker Daemon而在 K8s 中控制平面组件和 kubelet 协作完成了相同的效果。4.2 查看 Pod 状态输出NAME READY STATUS RESTARTS AGE my-nginx-5c6d7f8b9f-abcde1/1 Running030sREADY 1/1Pod 中 1 个容器已就绪STATUS RunningPod 正在运行RESTARTS 0容器从未重启过如果STATUS显示Pending或ImagePullBackOff说明调度或镜像拉取出了问题。Minikube 环境下最常见的原因是镜像拉取超时——执行kubectl describe pod pod名可以看到详细事件日志。4.3 查看 Deployment 详情输出NAME READY UP-TO-DATE AVAILABLE AGE my-nginx1/1111mREADY 1/1期望 1 个副本当前 1 个副本就绪UP-TO-DATE已更新到最新版本的 Pod 数AVAILABLE可用的 Pod 数4.4 端口转发在 K8s 中Pod 的端口默认不会自动暴露到宿主机。快速测试时可以用port-forward建立临时隧道kubectl port-forward deployment/my-nginx8080:80输出Forwarding from127.0.0.1:8080 -80Forwarding from[::1]:8080 -80此时终端被占用打开另一个终端curlhttp://localhost:8080你会看到 Nginx 的欢迎页面 HTML。port-forward绕过了 Service 和 Ingress直接将你本机的 8080 端口流量转发到 Pod 的 80 端口。它适合调试但不适合生产流量因为 kubectl 进程本身就是单点故障。生产环境中你需要用 ServiceNodePort/LoadBalancer Ingress 来暴露服务这些将在第 28-31 篇展开。按CtrlC结束端口转发。五、体验 K8s 的核心特性5.1 自愈能力删除一个 Pod观察控制器如何自动重建# 先记住当前 Pod 名字kubectl get pods# NAME READY STATUS RESTARTS AGE# my-nginx-5c6d7f8b9f-abcde 1/1 Running 0 5m# 删除这个 Podkubectl delete pod my-nginx-5c6d7f8b9f-abcde# pod my-nginx-5c6d7f8b9f-abcde deleted# 立即查看Pod 已被新版本替换kubectl get pods# NAME READY STATUS RESTARTS AGE# my-nginx-5c6d7f8b9f-xyz12 1/1 Running 0 5s旧 Pod 被删了一个全新的 Pod名字后半段不同立刻被创建出来。Deployment Controller 检测到实际 Pod 数量0不等于期望数量1触发创建新 Pod。这就是控制循环的自愈能力——也是 Compose 中restart: unless-stopped在 K8s 层面的增强版。5.2 扩容将 Nginx 的副本数从 1 扩到 3kubectl scale deployment my-nginx--replicas3# deployment.apps/my-nginx scaledkubectl get pods-w# NAME READY STATUS RESTARTS AGE# my-nginx-5c6d7f8b9f-xyz12 1/1 Running 0 6m# my-nginx-5c6d7f8b9f-def34 0/1 ContainerCreating 0 2s# my-nginx-5c6d7f8b9f-ghi56 0/1 ContainerCreating 0 2s# my-nginx-5c6d7f8b9f-def34 1/1 Running 0 10s# my-nginx-5c6d7f8b9f-ghi56 1/1 Running 0 10s三条命令从 1 个副本变成了 3 个。对比 Compose 的--scaleK8s 的扩容也是声明式的——修改期望副本数后控制器自动调和实际状态。在第 36 篇我们还会学习 HPA水平自动伸缩让 K8s 根据 CPU 和内存使用率自动调整副本数。按CtrlC退出 watch 模式。六、Minikube 常用管理命令Minikube 毕竟是个实验环境下面这些命令是日常使用的高频操作。如果实验环境出现问题最快恢复方式是重建集群minikube delete minikube start--driverdocker从头到尾约 2-3 分钟适用于“环境被玩坏了”的极端情况。6.1 集群暂停与恢复当你不需要 K8s 运行时可以通过暂停释放 CPU 和内存资源# 暂停集群保留所有已部署的资源但释放计算资源minikube pause# 恢复集群minikube unpause这个操作不会丢失任何部署的资源Pod、Deployment、Service 等只是暂停了控制平面和工作节点进程适合午休或长时间不用时暂时释放资源。七、命令速查表八、本篇总结今天这篇是整个 K8s 实战的“起手式”——我们成功搭建了实验环境验证了第 19 篇的架构知识部署了第一个应用体验了自愈和扩容这两个 K8s 最核心的特性。具体来说你学会了在本地用 Minikube 一键启动单节点集群使用 kubectl 管理 Deployment 和 Pod 的生命周期验证了控制器模式下的自愈能力实现了从 1 到 3 的副本扩容。至此本系列四个阶段的工具链已清晰成型单机容器化Docker→ 单机编排Compose→ 集群编排K8s 核心对象→ 生产级运维后续 30 篇将逐一覆盖的监控、日志、CI/CD、安全、服务网格。此刻你的电脑上已经有一个真实的 K8s 集群在跑kubectl get pods -n kube-system能看到全套控制平面组件——你已经站在了云原生的门槛上。下一篇文章——第 21 篇Pod最小调度单元与 YAML 详解我们将深入 K8s 最核心的概念从 Pod 的 YAML 结构开始理解为什么 Pod 是“最小的、不可再分的调度单元”。想了解更多还可以去各个平台搜索「IT策士」一起升级 IT 思维