前言

在云原生开发中,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依然坚持写博客的大佬的帮助

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐