从零搭建本地Kubernetes开发环境:Docker Desktop +kind完整指南
前言
在云原生开发中,kubernetes已经成为事实上的容器编排标准。对于开发者来说,拥有一个稳定,可控的本地Kubernetes环境至关重要。本文将带你从零开始,在Docker Desktop上搭建完整的Kubernetes开发环境,并部署一个无状态应用(Nginx),涵盖从环境配置到故障排查的全流程。
适用场景:本地开发测试,CI/CD验证,Kubernetes学习实验
前置条件:已安装Docker Desktop
一.环境准备:在Docker Desktop 是目前在本地运行Kubernetes最简单的方式之一。它内置了Kubernetes支持,只需几步配置即可启动一个单节点集群。
1.1启用Kubernetes
打开Docker Desktop,按照以下步骤操作:
1.点击右上角的设置(齿轮图标)
2.在左侧菜单中,选择Kubernetes选项卡
3.勾选“Enable Kubernetes”复选框
4.点击“Apply & Restart" 按钮
Docker Desktop会自动下载并启动Kubernetes集群所需的核心组件。等待片刻,当设置页面中Kubernetes状态变为绿色running时,表示集群已成启动。

中国用户需要特别注意的是:由于网络原因,Docker Desktop可能无法从k8s.gcr.io拉取Kubernetes核心镜像。推荐使用开源项目GitHub - denverdino/k8s-for-docker-desktop: 为Docker Desktop for Mac/Windows开启Kubernetes和Istio。 · GitHub从国内镜像源(如阿里云)拉取所需镜像或者如下图操作所示
方案一:使用k8s-for--docker-desktop
该脚本会自动从阿里云镜像仓库拉取所需镜像并加载,免去手动操作:

方案二:手动拉取并重新Tag(适用于已配置镜像加速器的场景)
如果你已有可访问k8s.gcr.io的代理(或适用阿里云镜像仓库),可以手动拉取并重新打标签。例如拉取kube-apiserver:v1.36.1:
1.2测试kubernetes
1.打开终端(命令行界面)
2.运行以下命令来检查Kubernetes的版本信息
如果成功输出版本信息,则表示Kubernetes已经在Docker Desktop 上运行了。

1.3验证集群状态
启用完成后,打开终端执行以下命令验证:
# 查看集群信息
kubectl cluster-info
# 查看节点状态
kubectl get nodes

如果看到节点状态为Ready,说明Kubernetes集群已经正常运行。
二.我的Kubernetes集群
从Docker Desktop的Kubernetes界面可以看到集群的详细信息:
|
配置项 |
值 |
|
集群类型 |
Kind(Kubernetes in Docker) |
|
节点数 |
1 |
|
Kubernetes |
V1.36.1 |
Docker Desktop默认使用kind(Kubernetes in Docker)作为集群创建方式。kind的核心优势在于:它将Kubernetes集群运行在Docker容器中,非常适合本地开发和测试场景。
你也可以在Docker Desktop的Kubernetes设置中切换集群创建方式:
kind:支持多节点集群,版本可自定义
Kubeadm:创建单节点,版本由Docker Desktop固定
三.镜像拉取与加载(Kind集群的关键步骤)
在Kind集群中部署应用时,镜像管理是最容器踩坑的环节。Kind集群运行在Docker容器内部,默认无法直接访问你本地的Docker镜像
3.1拉取所需镜像
以部署Nginx为列,首先从Docker Hub拉取镜像:
docker pull nginx:1.16.1
3.2将镜像加载到Kind集群
使用kind load命令将本地镜像加载到Kind集群的节点中:
kind load docker-image nginx:1.16.1
这条命令将会将镜像从你的本地Docker守护进程复制到Kind集群的所有节点中。
为什么需要这一步呢?如果不加载镜像,Pod启动时会尝试从远程仓库拉取。在国内网络环境下,这往往会导致ErrImagePull或ImagePullBackOff错误。

3.3关键配置:imagePullPolicy
在Deployment的YAML中,必须将imagePullPolicy设置为IfNotPresent:

这样Kubernetes会优先使用节点上已存在的镜像,而不是每次都尝试从远程拉取。
四.部署无状态应用(Deployment)
Kubernetes中,无状态应用(Stateless Application)通常使用Deployment资源来管理。Deployment提供了声明式更新,滚动升级和回滚等核心能力。
4.1编写Deployment配置
创建一个deployment.yaml文件:

4.2应用配置
使用了kubectl apply命令创建Deployment:
kubectl apply -f deployment.yaml

4.3验证部署状态
# 查看 Deployment 状态
kubectl get deployments
# 查看 Pod 状态
kubectl get pods


正常状态下,你应该看到2个Pod都处于Running状态
同时我们也可以再Docker Desktop的可视化界面中查看更直观的状态。如下图,在Kubernetes——>Deployments中可以看到nginx-deployment状态为Available,2个Pod均处于Running状态,说明应用已成功部署并对外提供服务。

五.排错实战:从ErrImagePull到Running
在实际部署中,我遇到了镜像拉取失败的问题,以下是一个完整的排错流程:
5.1问题现象

ImagePullBackOff 表示Kubernetes多次尝试拉取镜像均失败
5.2排查步骤
第一步:检查本地是否有镜像
docker images | grep nginx
第二步:将镜像加载到Kind集群
kind load docker-image nginx:1.16.1
第三步:删除旧Pod,触发重新调度
kubectl delete pod -l app=nginx
第四步:验证新Pod状态
kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment-857d9f6c74-7zh8j 1/1 Running 0 19s
nginx-deployment-857d9f6c74-qv9vw 1/1 Running 0 19s



六.Kubectl 命令
1.get:用于显示一个或多个资源项目的信息。示例:

2.describe:用于显示资源的详细信息。示例:
![]()
3.create:用于从文件或标准输入创建资源,示例:
![]()
4.update:用于文件或标准输入创建资源。示例:
![]()
5.delete:用于删除资源。可通过文件名,标准输入,资源名或者lable selector 删除资源。示例:
![]()
6.log:用于查看Pod中一个容器的日志。示例
![]()
7.exec:用于在容器内部执行命令。示例:
![]()
8.port-forward:用于将本地端口转发到Pod。示例:
![]()
9.proxy:用于为Kubernetes API server启动代理服务器,以便访问集群内部资源,示例:
![]()
10.expose:用于将replication controller,service或pod暴露为新的Kubernetes service。示例:
![]()
11.run:用于在集群中使用指定镜像启动容器
![]()
12.label:用于更新资源的label,以便对资源进行分类和选择。示例:
![]()
13.Config:用于修改Kubernetes配置文件。示例:
![]()
14.cluster-info:用于显示集群信息,包括API server地址等。示例:
![]()
15.api-version:以组/版本的格式输出服务端支持的API版本
![]()
16.version:输出服务端和客户端的版本信息。示例:
![]()
17.help:显示各个命令的帮助信息。示例:![]()
七.进阶:滚动更新策略
对于生产级应用,Deployment的滚动更新(Rolling Update)策略至关重要,它可以实现零停机部署。

maxSurge:控制更新期间最多可以创建多少个超出期望副本数的Pod
maxUnavailable:控制更新期间最多可以有多少个Pod不可用。
Deployment支持两种更新策略:
RollingUpdate(默认):逐步用新Pod替换旧Pod,零停机
Recreate:先删除所有旧Pod,再创建新Pod,会有停机事件
八.完整项目部署示例
如果你正在开发一个完整应用(如Spring Boot+MySQL),可以参考以下Deployment配置模板:

部署命令
# 使用 Kustomize 部署整个应用
kubectl apply -k k8s/
# 或单独部署 Deployment
kubectl apply -f deployment.yaml
注:kubectl label 用来更新资源元数据或者修改标签本身的label,我之前写的时候应该有一个没注意写成了lable,但是我找不着了,所以就没改,如果有读者发现问题请谅解,在做k8s部署的时候遇到了一些问题所以也看一些其他博主的文章,解决了我的问题,考虑到可能因为版权问题引起一些不必要的麻烦,所以选择了部分内容由AI辅助生成,也谢谢在CSDN依然坚持写博客的大佬的帮助
更多推荐




所有评论(0)