当前位置: 首页 > article >正文

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 端口。


http://www.kler.cn/a/515436.html

相关文章:

  • FFmpeg常用命令
  • docker 部署confluence
  • 登录认证(4):令牌技术:JWT令牌
  • 国产工作平替软件推荐
  • 55.【5】BUUCTF WEB NCTF2019 sqli
  • Android AutoMotive --CarService
  • 免费SSL证书申请,springboot 部署证书
  • 【自动化测试】—— Appium使用保姆教程
  • SoftGNSS软件接收机源码阅读(一)程序简介、运行调试、执行流程
  • 数据结构——树和二叉树
  • Linux 下注册分析(1)
  • 用AI生成PPT,办公效率提升新方式
  • 基于 Vue3 + Canvas + Web Worker 实现高性能图像黑白转换工具的设计与实现
  • Linux通过docker部署京东矩阵容器服务
  • canvas基础
  • 【EXCEL_VBA_实战】多工作薄合并深入理解
  • Vue.js 配置路由:基本的路由匹配
  • grid 布局react组件可以循数据自定义渲染某个数据 ,或插入某些数据在某个索引下
  • docker部署flask项目后,请求时总是报拒绝连接错误
  • 某大厂一面:Java 构造器是否可以被重写
  • Node.js——express中间件(全局中间件、路由中间件、静态资源中间件)
  • 【中国电信-安全大脑产品介绍】
  • 华为支付-(可选)特定场景配置操作
  • 4【编程语言的鄙视链原因解析】
  • JS-Web API -day04
  • “推理”(Inference)在深度学习和机器学习的语境