Windows 环境下 Docker Desktop + Kubernetes 部署项目指南
Windows 环境下 Docker Desktop + Kubernetes 部署项目指南
- 一、环境准备
- 二、安装与配置 Kubernetes
- 安装 windows 版的 docker
- 启动 kubernetes
- 安装 windows 版的 kubectl 工具
- 下载 k8s-for-docker-desktop
- 启动 Kubernetes Dashboard
- 二、在 Kubernetes 上部署项目
- 创建一个 demo 项目
- 用 Docker 运行项目
- 将镜像 Push 到 远程
- 编写 Kubernetes 部署配置文件
- 应用部署项目到 Kubernetes
- 访问验证项目

一、环境准备
- Windows 操作系统(本文使用 Windows 11)
- Docker Desktop 安装(Windows 版本)
- kubectl 工具(Windows 版本):用于与 Kubernetes API 进行交互。
二、安装与配置 Kubernetes
安装 windows 版的 docker
安装 Docker Desktop: https://www.docker.com/get-started/

启动 kubernetes
打开 Docker-Desktop, 确保 Docker 正常运行,然后启动 Kubernetes,打开设置,然后找到 Kubernetes,点击 Enable Kubernetes ,然后点击 Apply & restart。

注:在启动 Kubernetes 过程中可能会比较慢,或者会下载失败,解决方法有两个,一个是设置中找到 Docker Engine,配置镜像加速器;另外一个方法是科学上网; 一下是我自己的配置文件,如果镜像加速器不起作用,可自行更换。
{"builder": {"gc": {"defaultKeepStorage": "20GB","enabled": true}},"experimental": false,"registry-mirrors": ["https://docker.1panel.live"]
}
安装 windows 版的 kubectl 工具
下载地址:https://kubernetes.io/releases/download/#binaries
找到最新的稳定版本下载 windows 版的 kubectl.exe 文件

安装完成之后在 cmd 中输入命令进行验证:
# 查看kubecdtl 的版本信息
kubectl versionClient Version: v1.29.2
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
Server Version: v1.29.2# 查看k8s节点状态
kubectl get nodesNAME STATUS ROLES AGE VERSION
docker-desktop Ready control-plane 34m v1.27.2
下载 k8s-for-docker-desktop
- 下载
下载地址:https://github.com/AliyunContainerService/k8s-for-docker-desktop
选择跟自己的 kubernetes 对应的版本,然后选择对应的分支下载
比如我的 kubernetes 版本是 v1.29.2

则就选 v1.29.2 分支进行下载

- 安装
在 Windows 上,使用管理员身份运行 PowerShell,进入到下载的 k8s-for-docker-desktop 项目根目录下
执行命令
.\load_images.ps1
注意:
- 如果因为安全策略无法执行,请执行
<font style="color:rgb(199, 37, 78);background-color:rgb(249, 242, 244);">Set-ExecutionPolicy RemoteSigned</font>命令- 如果需要,可以修改
<font style="color:rgb(199, 37, 78);background-color:rgb(249, 242, 244);">images.properties</font>文件自行加载自己需要的镜像
启动 Kubernetes Dashboard
在 k8s-for-docker-desktop 根目录下执行以下命令
- 创建 Kubernetes Dashboard
kubectl create -f kubernetes-dashboard.yaml
# 启动代理服务器,允许本地通过 http://localhost:8001 访问 Kubernetes API 和 Kubernetes Dashboard
kubectl proxy
- 配置 Kubernetes Dashboard 访问令牌
# 授权 kube-system 默认服务账号
kubectl apply -f kube-system-default.yaml
- 查看 Kubernetes Dashboard 访问令牌
$TOKEN=((kubectl -n kube-system describe secret default | Select-String "token:") -split " +")[1]
kubectl config set-credentials docker-desktop --token="${TOKEN}"
echo $TOKEN
- 访问 Kubernetes Dashboard
http://127.0.0.1:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/#/login

输入 token 登录即可

二、在 Kubernetes 上部署项目
创建一个 demo 项目
我这块项目名称叫 test-app

- 创建 app.py
from flask import Flask, render_template, request, jsonify# Create Flask app instance
app = Flask(__name__)# Basic route that returns plain text
@app.route('/')
def home():return 'Welcome to Flask Demo!'# Route that returns HTML
@app.route('/hello/<name>')
def hello(name):return f'<h1>Hello, {name}!</h1>'# Route that renders a template
@app.route('/greet')
def greet():return render_template('greet.html', message='Welcome to our website!')# Route that handles POST requests
@app.route('/api/data', methods=['POST'])
def receive_data():data = request.get_json()return jsonify({'status': 'success','received_data': data})# Route with query parameters
@app.route('/search')
def search():query = request.args.get('q', '')return f'Search query: {query}'if __name__ == '__main__':app.run(debug=True)
- 创建 greet.html
<!DOCTYPE html>
<html lang="zh"><head><title>Greeting Page</title></head><body><h1>{{ message }}</h1></body>
</html>
- 创建 Dockerfile
在项目根目录下创建一个 Dockerfile
# Use official Python image as base
FROM python:3.9-slim# Set working directory
WORKDIR /app# Set environment variables
ENV PYTHONDONTWRITEBYTECODE=1 \PYTHONUNBUFFERED=1 \FLASK_APP=app.py \FLASK_ENV=production# Install system dependencies
RUN apt-get update \&& apt-get install -y --no-install-recommends \gcc \python3-dev \&& rm -rf /var/lib/apt/lists/*# Install Python dependencies
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt# Copy application code
COPY . .# Expose port
EXPOSE 5000# Run the application
CMD ["gunicorn", "--bind", "0.0.0.0:5000", "app:app"]
用 Docker 运行项目
此处使用 Docker 运营项目只是为了确保镜像没有问题,项目可以正常访问。
# 构建镜像
docker build -t test-app .# 运行容器
docker run --rm -p 5000:5000 --name test-app test-app
访问测试

将镜像 Push 到 远程
将刚才打包好的镜像推送到远程仓库,我这块使用的是默认的远程仓库 Docker Hub
# 登录到 Docker Hub 或其他私有仓库,输入用户名密码即可,如果没有账号,则可前往 Docker Hub 官网注册即可
docker login# 给镜像打标签
docker tag test-app:latest gitzoom/test-app:latest
# 或者 docker tag test-app:latest docker.io/gitzoom/test-app:latest
# 如果不加域名,默认就是docker.io , gitzoom 为自己的namespace# 推送镜像到远程仓库
docker push gitzoom/test-app:latest

编写 Kubernetes 部署配置文件
在项目根目录下创建 Kubernetes 部署文件 k8s-deployment.yaml,以定义 Kubernetes 部署和服务。
apiVersion: apps/v1
kind: Deployment
metadata:name: test-app-deployment # 部署的名称namespace: baize-datalabels:app: test-app # 给资源打标签,便于筛选和管理
spec:replicas: 2 # 定义副本数量以确保高可用selector:matchLabels:app: test-app # 匹配 Pod 的标签,确保服务与 Pod 绑定template:metadata:labels:app: test-app # Pod 的标签,需与 selector 对应spec:containers:- name: test-app # 容器名称image: gitzoom/test-app:latest # 使用构建的镜像名称和标签,从远程仓库拉取镜像ports:- containerPort: 5000 # 容器内部监听的端口env:- name: FLASK_APPvalue: "app.py" # 设置 Flask 的主程序文件- name: FLASK_ENVvalue: "production" # 设置 Flask 的运行环境- name: PYTHONDONTWRITEBYTECODEvalue: "1" # 禁止生成 .pyc 文件- name: PYTHONUNBUFFEREDvalue: "1" # 设置 Python 日志为非缓冲模式resources: # 资源限制requests:memory: "128Mi" # 请求的最小内存cpu: "250m" # 请求的最小 CPUlimits:memory: "256Mi" # 最大允许使用的内存cpu: "500m" # 最大允许使用的 CPUlivenessProbe: # 存活探针,用于检测服务是否存活httpGet:path: "/" # 检测的路径port: 5000 # 检测的端口initialDelaySeconds: 5 # 初始延迟periodSeconds: 10 # 检测间隔readinessProbe: # 就绪探针,用于检测服务是否准备好接收流量httpGet:path: "/" # 检测的路径port: 5000 # 检测的端口initialDelaySeconds: 5 # 初始延迟periodSeconds: 10 # 检测间隔restartPolicy: Always # 容器策略:始终重启
---
apiVersion: v1
kind: Service
metadata:name: test-app-service # 服务的名称labels:app: test-app # 标签与 Deployment 一致
spec:selector:app: test-app # 匹配 Deployment 的标签ports:- protocol: TCPnodePort: 30008 # 可以省略,Kuberrnetes 会自动分配一个端口 范围 30000-32767port: 3000 # 服务暴露的端口targetPort: 5000 # 转发到容器的端口type: NodePort # 服务类型,NodePort 通过在每个 Node 上打开一个特定端口,将外部请求转发到集群内部的Service,进而达到后端的Pod
应用部署项目到 Kubernetes
- 将项目部署应用于 Kubernetes
# 在项目根目录下执行deployment.apps/test-app-demployment created
service/test-app-deployment created
- 验证部署和服务
# 检查 Pod 的状态
kubectl get pods
kubectl get deployments
kubectl get services
也可以通过访问 Kubernetes Dashboard 来查看 service 和 pod 的状态

访问验证项目
通过访问 [http://127.0.0.1:30009/greet](http://127.0.0.1:30009/greet)来验证项目是否部署成功,30009 是在 k8s-deployment.yaml 中配置的 NodePort 端口。

相关文章:
Windows 环境下 Docker Desktop + Kubernetes 部署项目指南
Windows 环境下 Docker Desktop Kubernetes 部署项目指南 一、环境准备二、安装与配置 Kubernetes安装 windows 版的 docker启动 kubernetes安装 windows 版的 kubectl 工具下载 k8s-for-docker-desktop启动 Kubernetes Dashboard 二、在 Kubernetes 上部署项目创建一个 demo …...
WebSocket 详解:全双工通信的实现与应用
目录 一、什么是 WebSocket?(简介) 二、为什么需要 WebSocket? 三、HTTP 与 WebSocket 的区别 WebSocket 的劣势 WebSocket 的常见应用场景 WebSocket 握手过程 WebSocket 事件处理和生命周期 一、什么是 WebSocket…...
神经网络|(二)sigmoid神经元函数
【1】引言 在前序学习进程中,我们已经了解了基本的二元分类器和神经元的构成,文章学习链接为: 神经网络|(一)加权平均法,感知机和神经元-CSDN博客 在此基础上,我们认识到神经元本身在做二元分类,是一种非…...
云原生:构建现代化应用的基石
一、什么是云原生? 云原生是一种构建和运行应用程序的方法,旨在充分利用云计算的分布式系统优势,例如弹性伸缩、微服务架构、容器化技术等。云原生应用程序从设计之初就考虑到了云环境的特点,能够更好地适应云平台的动态变化&…...
【浏览器 - Chrome调试模式,如何输出浏览器中的更多信息】
在开发过程中,如果不主动console.log,浏览器中的信息有些不会主动输出到 控制台console里面。这个如果是一些浏览器内部的接口调试,则会很麻烦。比如RTCPeerConnection过程 ,RTCPeerConnection属于浏览器内部的方法,其…...
不同操作系统(Windows、Linux)上安装和配置Tomcat的详细教程
以下是在不同操作系统(Windows、Linux)上安装和配置Tomcat的详细教程: Windows系统下Tomcat的安装与配置 下载Tomcat 访问Apache Tomcat官方网站(https://tomcat.apache.org)。在“Download”页面,根据需求选择合适的Tomcat版本。例如,选择“Core”下的zip压缩包下载。…...
MapReduce,Yarn,Spark理解与执行流程
MapReduce的API理解 Mapper 如果是单词计数:hello:1, hello:1, world:1 public void map(Object key, // 首字符偏移量Text value, // 文件的一行内容Context context) // Mapper端的上下文,…...
unity导入图片素材注意点和AI寻路模块导入
当我们导入了图片资源,我们需要设置为Sprite类型 UI资源的位置通常是Rect Transform 要进行转化: (imgHP.transform as RectTransform).sizeDelta new Vector2((float)hp / maxHP * hpW,74); RectTransform 是Unity中用于UI元素的特殊变换组件&#…...
单片机-STM32 IIC通信(OLED屏幕)(十一)
一、屏幕的分类 1、LED屏幕: 由无数个发光的LED灯珠按照一定的顺序排列而成,当需要显示内容的时候,点亮相关的LED灯即可,市场占有率很高,主要是用于户外,广告屏幕,成本低。 LED屏是一种用发光…...
Windows Docker Desktop安装及使用 Docker 运行 MySQL
Docker Desktop是Docker的官方桌面版,专为Mac和Windows用户设计,提供了一个简单易用的界面来管理和运行Docker容器。它集成了Docker引擎,为开发人员提供了一个快速、可靠、可扩展的方式来构建、运行和管理应用。DockerDesktop的优势在于&…...
开源RAG框架Kotaemon及其混合检索系统的优势与局限
开源RAG框架Kotaemon及其混合检索系统的优势与局限 大模型(LLMs)的快速发展令人瞩目,但如何让这些模型更有效地利用外部知识,一直是业界关注的焦点。检索增强生成(Retrieval-Augmented Generation,RAG&…...
Day21-【软考】短文,计算机网络开篇,OSI七层模型有哪些协议?
文章目录 OSI七层模型有哪些?有哪些协议簇?TCP/IP协议簇中的TCP协议三次握手是怎样的?基于UDP的DHCP协议是什么情况?基于UDP的DNS协议是什么情况? OSI七层模型有哪些? 题目会考广播域 有哪些协议簇&#x…...
Kmesh v1.0 正式发布!7 大特性提升网络流量管理效率和安全性
Kmesh v1.0 正式发布!7 大特性提升网络流量管理效率和安全性 2025 年新年伊始,Kmesh 团队正式发布了 Kmesh v1.0234。以下是 Kmesh v1.0 提升网络流量管理效率和安全性的 7 大特性35: 加密通信:引入 IPsec 协议对节点间流量加密&a…...
巧妙获取ListBox控件的选中条目(按点击顺序)
实例需求:用户窗体中有两个控件 列表框:ListBox1,支持多选按钮:CommandButton1 现在需要记录用户在列表框中选择顺序(不考虑选中后再次点击取消选中的操作),如下图所示。 Dim objDic As Objec…...
动手学图神经网络(3):利用图神经网络进行节点分类 从理论到实践
利用图神经网络进行节点分类:从理论到实践 前言 在之前的学习中,大家对图神经网络有了初步的了解。本次教程将深入探讨如何运用图神经网络(GNNs)来解决节点分类问题。在节点分类任务里,大家往往仅掌握少量节点的真实…...
Level DB --- TableBuilder
TableBuilder是Level DB里面重要的类和模块,它描述了数据如何序列化到文件中,以及数据里面的格式逻辑。它里面包含了之前介绍的多个模块和类。 data block、filter block和index block block格式,之前已经介绍过Level DB --- BlockBuilder-…...
Leecode刷题C语言之组合总和②
执行结果:通过 执行用时和内存消耗如下: int** ans; int* ansColumnSizes; int ansSize;int* sequence; int sequenceSize;int** freq; int freqSize;void dfs(int pos, int rest) {if (rest 0) {int* tmp malloc(sizeof(int) * sequenceSize);memcpy(tmp, seque…...
Hook 函数
什么是hook函数? 在计算机编程中,hook函数是指在特定的事件发生时被调用的函数,用于在事件发生前或后进行一些特定的操作。通常,hook函数作为回调函数被注册到事件处理器中,当事件发生时,事件处理器会自动…...
自然元素有哪些选择?
在设计浪漫风格的壁纸时,自然元素是营造温馨、梦幻氛围的关键。以下是一些常见的自然元素选择,以及它们在壁纸设计中的应用建议: 一、花朵 玫瑰: 特点:玫瑰是浪漫的象征,尤其是红色和粉色玫瑰,…...
【miniconda】:langraph的windows构建
langraph需要python3.11 langraph强烈建议使用py3.11 默认是3.12 官方 下载仓库 下载老版本的python (后续发现新版miniconda也能安装老版本的python) 在这里...
自动驾驶中的多传感器时间同步
目录 前言 1.多传感器时间特点 2.统一时钟源 2.1 时钟源 2.2 PPSGPRMC 2.3 PTP 2.4 全域架构时间同步方案 3.时间戳误差 3.1 硬件同步 3.2 软件同步 3.2.3 其他方式 ① ROS 中的 message_filters 包 ② 双端队列 std::deque 参考: 前言 对多传感器数据…...
15 分布式锁和分布式session
在java中一个进程里面使用synchronized在new出来对象头信息中加锁,如果是静态方法中在加载的类信息中加锁(我们在锁的原理中讲过)。如果使用lock加锁可以自己指定。这些都是在同一个进程空间中的操作。如果在分布式环境中由于程序不在一个进程空间,就没办…...
【蓝桥杯】43692.青蛙跳杯子
题目描述 X 星球的流行宠物是青蛙,一般有两种颜色:白色和黑色。 X 星球的居民喜欢把它们放在一排茶杯里,这样可以观察它们跳来跳去。 如下图,有一排杯子,左边的一个是空着的,右边的杯子,每个…...
[Dialog屏幕开发] 屏幕绘制(下拉菜单)
阅读该篇文章之前,可先阅读下述资料 [Dialog屏幕开发] Table Control 列数据操作https://blog.csdn.net/Hudas/article/details/145343731?spm1001.2014.3001.5501上篇文章我们的屏幕已实现了如下功能 我们已经设置了按钮对Table Control 列的数据进行了操作 接下…...
AIGC视频生成模型:慕尼黑大学、NVIDIA等的Video LDMs模型
大家好,这里是好评笔记,公主号:Goodnote,专栏文章私信限时Free。本文详细介绍慕尼黑大学携手 NVIDIA 等共同推出视频生成模型 Video LDMs。NVIDIA 在 AI 领域的卓越成就家喻户晓,而慕尼黑大学同样不容小觑,…...
JVM常见知识点
在《深入理解Java虚拟机》一书中,介绍了JVM的相关特性。 1、JVM的内存区域划分 在真实的操作系统中,对于地址空间进行了分区域的设计,由于JVM是仿照真实的机器进行设计的,那么也进行了分区域的设计。核心区域有四个,…...
工业数据分析:解锁工厂数字化的潜力
工业数据分析:解锁工厂数字化的潜力 引言 工业数据分析是工业4.0时代的核心技术之一。从生产设备的传感器数据,到供应链的物流信息,工业环境中每天都会产生海量数据。这些数据蕴藏着巨大的潜力,能够帮助企业优化生产流程、降低运营成本、提高产品质量。 然而,如何高效地…...
类和对象(4)——多态:方法重写与动态绑定、向上转型和向下转型、多态的实现条件
目录 1. 向上转型和向下转型 1.1 向上转型 1.2 向下转型 1.3 instanceof关键字 2. 重写(overidde) 2.1 方法重写的规则 2.1.1 基础规则 2.1.2 深层规则 2.2 三种不能重写的方法 final修饰 private修饰 static修饰 3. 动态绑定 3.1 动态绑…...
系统思考—问题分析
很多中小企业都在面对转型的难题:市场变化快,资源有限,团队协作不畅……这些问题似乎总是困扰着我们。就像最近和一位企业主交流时,他提到:“我们团队每天都很忙,但效率始终没见提升,感觉像是在…...
第24篇:Python开发进阶:掌握Python编程中的调试技巧
第24篇:调试技巧 内容简介 在软件开发过程中,调试是确保代码正确性和稳定性的关键步骤。有效的调试技巧不仅能帮助开发者快速定位和修复错误,还能提升代码的整体质量和可维护性。本篇文章将探讨如何使用Python内置的调试工具pdb进行调试&am…...
