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 version

Client Version: v1.29.2
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
Server Version: v1.29.2

# 查看k8s节点状态
kubectl get nodes

NAME             STATUS   ROLES           AGE   VERSION
docker-desktop   Ready    control-plane   34m   v1.27.2

下载 k8s-for-docker-desktop

  1. 下载

下载地址:https://github.com/AliyunContainerService/k8s-for-docker-desktop

选择跟自己的 kubernetes 对应的版本,然后选择对应的分支下载

比如我的 kubernetes 版本是 v1.29.2

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

  1. 安装

在 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 根目录下执行以下命令

  1. 创建 Kubernetes Dashboard
kubectl create -f kubernetes-dashboard.yaml
# 启动代理服务器,允许本地通过 http://localhost:8001 访问 Kubernetes API 和 Kubernetes Dashboard
kubectl proxy
  1. 配置 Kubernetes Dashboard 访问令牌
# 授权 kube-system 默认服务账号
kubectl apply -f kube-system-default.yaml
  1. 查看 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
  1. 访问 Kubernetes Dashboard

http://127.0.0.1:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/#/login

输入 token 登录即可

二、在 Kubernetes 上部署项目

创建一个 demo 项目

我这块项目名称叫 test-app

  1. 创建 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)

  1. 创建 greet.html
<!DOCTYPE html>
<html lang="zh">
  <head>
    <title>Greeting Page</title>
  </head>
  <body>
    <h1>{{ message }}</h1>
  </body>
</html>
  1. 创建 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-data
  labels:
    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_APP
              value: "app.py"  # 设置 Flask 的主程序文件
            - name: FLASK_ENV
              value: "production"  # 设置 Flask 的运行环境
            - name: PYTHONDONTWRITEBYTECODE
              value: "1"  # 禁止生成 .pyc 文件
            - name: PYTHONUNBUFFERED
              value: "1"  # 设置 Python 日志为非缓冲模式
          resources:  # 资源限制
            requests:
              memory: "128Mi"  # 请求的最小内存
              cpu: "250m"  # 请求的最小 CPU
            limits:
              memory: "256Mi"  # 最大允许使用的内存
              cpu: "500m"  # 最大允许使用的 CPU
          livenessProbe:  # 存活探针,用于检测服务是否存活
            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: TCP
      nodePort: 30008  # 可以省略,Kuberrnetes 会自动分配一个端口 范围 30000-32767
      port: 3000  # 服务暴露的端口
      targetPort: 5000  # 转发到容器的端口
  type: NodePort    # 服务类型,NodePort 通过在每个 Node 上打开一个特定端口,将外部请求转发到集群内部的Service,进而达到后端的Pod

应用部署项目到 Kubernetes

  1. 将项目部署应用于 Kubernetes
# 在项目根目录下执行


deployment.apps/test-app-demployment created
service/test-app-deployment created
  1. 验证部署和服务
# 检查 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 端口。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/959844.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

redis实现lamp架构缓存

redis服务器环境下mysql实现lamp架构缓存 ip角色环境192.168.242.49缓存服务器Redis2.2.7192.168.242.50mysql服务器mysql192.168.242.51web端php ***默认已安装好redis&#xff0c;mysql 三台服务器时间同步&#xff08;非常重要&#xff09; # 下载ntpdate yum -y install…

【Excel】【VBA】Reaction超限点筛选与散点图可视化

【Excel】【VBA】Reaction超限点筛选与散点图可视化 功能概述 这段代码实现了以下功能&#xff1a; 从SAFE输出的结果worksheet通过datalink获取更新数据从指定工作表中读取数据检测超过阈值的数据点生成结果表格并添加格式化创建可视化散点图显示执行时间 流程图 #mermaid-…

Java导出通过Word模板导出docx文件并通过QQ邮箱发送

一、创建Word模板 {{company}}{{Date}}服务器运行情况报告一、服务器&#xff1a;总告警次数&#xff1a;{{ServerTotal}} 服务器IP:{{IPA}}&#xff0c;总共告警次数:{{ServerATotal}} 服务器IP:{{IPB}}&#xff0c;总共告警次数:{{ServerBTotal}} 服务器IP:{{IPC}}&#x…

智能化加速标准和协议的更新并推动验证IP(VIP)在芯片设计中的更广泛应用

作者&#xff1a;Karthik Gopal, SmartDV Technologies亚洲区总经理 智权半导体科技&#xff08;厦门&#xff09;有限公司总经理 随着AI技术向边缘和端侧设备广泛渗透&#xff0c;芯片设计师不仅需要考虑在其设计中引入加速器&#xff0c;也在考虑采用速度更快和带宽更高的总…

RabbitMQ5-死信队列

目录 死信的概念 死信的来源 死信实战 死信之TTl 死信之最大长度 死信之消息被拒 死信的概念 死信&#xff0c;顾名思义就是无法被消费的消息&#xff0c;一般来说&#xff0c;producer 将消息投递到 broker 或直接到queue 里了&#xff0c;consumer 从 queue 取出消息进…

git常用命令学习

目录 文章目录 目录第一章 git简介1.Git 与SVN2.Git 工作区、暂存区和版本库 第二章 git常用命令学习1.ssh设置2.设置用户信息3.常用命令设置1.初始化本地仓库init2.克隆clone3.查看状态 git status4.添加add命令5.添加评论6.分支操作1.创建分支2.查看分支3.切换分支4.删除分支…

私有包上传maven私有仓库nexus-2.9.2

一、上传 二、获取相应文件 三、最后修改自己的pom文件

汽车定速巡航

配备定速巡航功能的车型&#xff0c;一般在方向盘附近设有4~6个按键&#xff08;可能共用键位&#xff09;。 要设置定速巡航&#xff0c;不仅需要方向盘上的按键&#xff0c;还要油门配合。 设置的一般流程&#xff1a; 开关&#xff1a;类似步枪上的“保险”&#xff0c;按…

安宝特方案 | AR在供应链管理中的应用:提升效率与透明度

随着全球化的不断深入和市场需求的快速变化&#xff0c;企业对供应链管理的要求也日益提高。如何在复杂的供应链环境中提升效率、降低成本&#xff0c;并确保信息的透明度&#xff0c;成为了各大行业亟待解决的问题。而增强现实&#xff08;AR&#xff09;技术&#xff0c;特别…

JavaScript(8)-函数

一.什么是函数&#xff1a;执行特定任务的代码块 讲js中需要的公共部分抽取并封装&#xff0c;谁用谁调用&#xff0c;代码复用。 先声明&#xff0c;后调用 使用function函数名需要调用的内容 使用&#xff1a;函数名&#xff08;&#xff09; 二.使用方式 声明&a…

HTML<label>标签

例子 三个带标签的单选按钮&#xff1a; <form action"/action_page.php"> <input type"radio" id"html" name"fav_language" value"HTML"> <label for"html">HTML</label><br&…

4.flask-SQLAlchemy,表Model定义、增删查改操作

介绍 SQLAlchemy是对数据库的一个抽象 开发者不用直接与SQL语句打交道 Python对象来操作数据库 SQLAlchemy是一个关系型数据库 安装 flask中SQLAlchemy的配置 from flask import Flask from demo.user_oper import userdef create_app():app Flask(__name__)# 使用sessi…

【C++初阶】第11课—vector

文章目录 1. 认识vector2. vector的遍历3. vector的构造4. vector常用的接口5. vector的容量6. vector的元素访问7. vector的修改8. vector<vector\<int\>>的使用9. vector的使用10. 模拟实现vector11. 迭代器失效11.1 insert插入数据内部迭代器失效11.2 insert插入…

GPT 结束语设计 以nanogpt为例

GPT 结束语设计 以nanogpt为例 目录 GPT 结束语设计 以nanogpt为例 1、简述 2、分词设计 3、结束语断点 1、简述 在手搓gpt的时候&#xff0c;可能会遇到一些性能问题&#xff0c;即关于是否需要全部输出或者怎么节约资源。 在输出语句被max_new_tokens 限制&#xff0c…

PTMD2.0-疾病相关的翻译后修饰数据库

翻译后修饰&#xff08;PTMs&#xff0c;post-translational modifications&#xff09;通过调节蛋白质功能参与了几乎所有的生物学过程&#xff0c;而 PTMs 的异常状态常常与人类疾病相关。在此&#xff0c;PTMD 2.0展示与疾病相关的 PTMs 综合数据库&#xff0c;其中包含 93 …

ArcGIS10.2 许可License点击始终启动无响应的解决办法及正常启动的前提

1、问题描述 在ArcGIS License Administrator中&#xff0c;手动点击“启动”无响应&#xff1b;且在计算机管理-服务中&#xff0c;无ArcGIS License 或者License的启动、停止、禁止等均为灰色&#xff0c;无法操作。 2、解决方法 ①通过cmd对service.txt进行手动服务的启动…

spring框架之IoC学习与梳理(1)

目录 一、spring-IoC的基本解释。 二、spring-IoC的简单demo&#xff08;案例&#xff09;。 &#xff08;1&#xff09;maven-repository官网中找依赖坐标。 &#xff08;2&#xff09;.pom文件中通过标签引入。 &#xff08;3&#xff09;使用lombok帮助快速开发。 &#xff…

系统架构设计师教材:信息系统及信息安全

信息系统 信息系统的5个基本功能&#xff1a;输入、存储、处理、输出和控制。信息系统的生命周期分为4个阶段&#xff0c;即产生阶段、开发阶段、运行阶段和消亡阶段。 信息系统建设原则 1. 高层管理人员介入原则&#xff1a;只有高层管理人员才能知道企业究竟需要什么样的信…

基于STM32单片机设计的宠物喂食监控系统

1. 项目开发背景 随着宠物数量的增加&#xff0c;尤其是人们对宠物的养护需求日益增多&#xff0c;传统的人工喂养和管理方式难以满足现代养宠生活的需求。人们越来越希望通过智能化手段提高宠物养护的质量和效率&#xff0c;特别是对于宠物喂食、饮水、温湿度控制等方面的智能…

帕金森患者:科学锻炼,提升生活质量

帕金森病&#xff0c;作为一种常见的神经系统退行性疾病&#xff0c;给患者的日常生活带来了诸多挑战。然而&#xff0c;通过科学的锻炼&#xff0c;患者不仅可以在一定程度上缓解症状&#xff0c;还能提升生活质量。本文将详细介绍帕金森患者应该进行的几种关键锻炼&#xff0…