Windows下Docker Desktop+k8s安装和部署程序

Windows下Docker Desktop+k8s安装和部署程序

一、安装Docker Desktop+Kubernetes

1.需要安装windows版的docker

安装 Docker Desktop,启用Hyper-V、虚拟机平台和容器

https://www.docker.com/get-started/

2.启用Kubernetes

打开Docker-Desktop,启用Kubernetes

点击左上角:设置,选择Kubernetes选项卡,启用Kubernetes,点击 Apply & restart

安装好后

在这里插入图片描述

手动安装

请从Kubernetes https://kubernetes.io/docs/tasks/tools/install-kubectl-windows/ 下载kubectl。找到最新的稳定版本并下载Windows版的kubectl.exe文件。

验证安装
kubectl version --short

Client Version: v1.27.2
Kustomize Version: v5.0.1
Server Version: v1.27.2

测试Kubernetes安装

运行以下命令检查Kubernetes是否正常运行:

kubectl get nodes

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

3.下载k8s-for-docker-desktop

下载地址:https://github.com/AliyunContainerService/k8s-for-docker-desktop
注意:需要根据Docker-Desktop的Kubernetes版本,选择对应的分支下载
例子:我的Kubernetes是v1.27.2
下载则是:https://github.com/AliyunContainerService/k8s-for-docker-desktop/tree/v1.27.2

安装

在Windows上,使用 PowerShell

 .\load_images.ps1
  • 如果因为安全策略无法执行 PowerShell 脚本,请在 “以管理员身份运行” 的 PowerShell 中执行 Set-ExecutionPolicy RemoteSigned 命令。
  • 如果需要,可以通过修改 images.properties 文件自行加载你自己需要的镜像

4.启用dashboard

cd F:\k8s-for-docker-desktop-1.27.2
kubectl create -f kubernetes-dashboard.yaml
kubectl proxy

配置控制台访问令牌

注意:然后另外打开一个Windows PowerShell,扫描到k8s解压的目录下
配置控制台访问令牌,授权kube-system默认服务账号

cd F:\k8s-for-docker-desktop-1.27.2
kubectl apply -f kube-system-default.yaml

查看控制台访问令牌
对于Windows环境,在k8s目录下用Windows PowerShell依次执行下面三行代码

$TOKEN=((kubectl -n kube-system describe secret default | Select-String "token:") -split " +")[1]
kubectl config set-credentials docker-desktop --token="${TOKEN}"
echo $TOKEN

访问Kubernetes仪表盘

通过如下 URL 访问 Kubernetes dashboard

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

二、在Kubernetes上部署应用程序

1.创建demo程序

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)

app\templates\greet.html

<!DOCTYPE html>
<html lang="zh">
<head>
    <title>Greeting Page</title>
</head>
<body>
    <h1>{{ message }}</h1>
</body>
</html>

2.创建Dockerfile文件,构建Docker镜像

在项目的根目录中创建一个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"]

运行

# Build the image
docker build -t flask-demo20241208 .

# Run the container
docker run --rm -p 5000:5000 --name flask-demo20241208 flask-demo20241208

在这里插入图片描述
在这里插入图片描述

3.Kubernetes部署配置

在项目根目录中创建Kubernetes部署文件k8s-deployment.yaml, 以定义Kubernetes部署和服务。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: flask-app-deployment20241208  # 部署的名称
  labels:
    app: flask-app20241208  # 给资源打标签,便于筛选和管理
spec:
  replicas: 2  # 定义副本数量以确保高可用
  selector:
    matchLabels:
      app: flask-app20241208  # 匹配 Pod 的标签,确保服务与 Pod 绑定
  template:
    metadata:
      labels:
        app: flask-app20241208  # Pod 的标签,需与 selector 对应
    spec:
      containers:
        - name: flask-app20241208  # 容器名称
          image: flask-app20241208: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: flask-app-service20241208  # 服务的名称
  labels:
    app: flask-app20241208  # 标签与 Deployment 一致
spec:
  selector:
    app: flask-app20241208  # 匹配 Deployment 的标签
  ports:
    - protocol: TCP
      port: 5000  # 服务暴露的端口
      targetPort: 5000  # 转发到容器的端口
  type: LoadBalancer  # 服务类型,LoadBalancer 用于云环境负载均衡

文件说明:

  1. Deployment 部分
    • 定义了 replicas 为 2,确保至少有两个 Pod 在运行,以提供高可用性。
    • 配置了 livenessProbereadinessProbe 探针,保证应用的健康状态和流量接收。
    • 使用了环境变量,保持和 Dockerfile 的配置一致。
    • 资源限制通过 resources 配置,避免容器占用过多资源。
  2. Service 部分
    • 定义了一个 LoadBalancer 类型的服务,使外部可以通过 HTTP 访问应用。
    • 将外部的 80 端口映射到容器的 5000 端口。
  3. 文件结构一致性
    • 镜像名 flask-app:latest,需要确保镜像在 Kubernetes 部署前已经构建并上传到容器注册表。

此文件适用于标准的 Flask 应用部署到 Kubernetes 集群中,并支持水平扩展和高可用配

4.在Kubernetes上部署应用程序

  1. 将部署应用于Kubernetes:
kubectl apply -f k8s-deployment.yaml

deployment.apps/flask-app-deployment20241208 created
service/flask-app-service20241208 created

Deployment 资源
管理 Pod 的创建、更新和生命周期。

Service 资源
暴露应用(Pod)以便内部或外部访问。

2.验证部署和服务:

检查 Pod 的状态:
kubectl get pods
kubectl get deployments
kubectl get services

访问服务:

运行:

kubectl get svc flask-app-service20241208

重启
kubectl rollout restart -n default deployment flask-app-deployment20241208

其他常用命令

删除部署
kubectl delete -n default deployment flask-app-deployment20241208
重启
kubectl rollout restart -n default deployment flask-demo-deployment20241208

在这里插入图片描述

通过执行这些步骤,您已经成功地在Windows机器上安装了Kubernetes,并将flask项目部署到了Kubernetes集群。此设置允许您利用容器化和编排的好处,为您的应用程序提供可扩展性、容错性和高效的资源管理。

常见问题

docker login失败

docker logout然后docker login 

Failed to pull image “flask-app20241208:latest”: rpc error: code = Unknown desc = Error response from daemon: pull access denied for flask-app20241208, repository does not exist or may require ‘docker login’: denied: requested access to the resource is denied

镜像未推送到容器注册表:
flask-app20241208:latest 镜像可能仅存在于本地,尚未推送到公共或私有容器注册表

登录 Docker Hub 或其他注册表:
docker login

给镜像打标签,包含注册表地址(例如 Docker Hub):
docker tag flask-demo20241208:latest docker.io/username/flask-demo20241208:1.0

推送镜像到注册表:
docker push docker.io/username/flask-demo20241208:1.0

更新 k8s-deployment.yaml 中的镜像名称:
image: docker.io/username/flask-demo20241208:1.0

参考资料

https://www.cnblogs.com/heyangyi/p/18061223

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

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

相关文章

网络原理03

回顾 应用层&#xff1a;应用程序&#xff0c;数据具体如何使用 传输层&#xff1a;关注起点和终点 网络层&#xff1a;关注路径规划 数据链路层&#xff1a;关注相邻节点的转发 物理层&#xff1a;硬件设备 应用层 应用程序 在应用层&#xff0c;很多时候&#xff0c;…

HTTP 状态码大全

常见状态码 200 OK # 客户端请求成功 400 Bad Request # 客户端请求有语法错误 不能被服务器所理解 401 Unauthorized # 请求未经授权 这个状态代码必须和WWW- Authenticate 报头域一起使用 403 Forbidden # 服务器收到请求但是拒绝提供服务 404 Not Found # 请求资源不存…

Ajax--实现检测用户名是否存在功能

目录 &#xff08;一&#xff09;什么是Ajax &#xff08;二&#xff09;同步交互与异步交互 &#xff08;三&#xff09;AJAX常见应用情景 &#xff08;四&#xff09;AJAX的优缺点 &#xff08;五&#xff09;使用jQuery实现AJAX 1.使用JQuery中的ajax方法实现步骤&#xf…

unique_ptr自定义删除器,_Compressed_pair利用偏特化减少存储的一些设计思路

主要是利用偏特化&#xff0c; 如果自定义删除器是空类&#xff08;没有成员变量&#xff0c;可以有成员函数&#xff09;&#xff1a; _Compressed_pair会继承删除器&#xff08;删除器作为基类&#xff09;&#xff0c;但_Compressed_pair里不保存删除器对象&#xff0c;只…

AGCRN论文解读

一、创新点 传统GCN只能基于静态预定义图建模全局共享模式&#xff0c;而AGCRN通过两种GCN的增强模块&#xff08;NAPL、DAGG&#xff09;实现了更精细的节点特性学习和图结构生成。 1 节点自适应参数学习模块&#xff08;NAPL&#xff09; 传统GCN通过共享参数&#xff08;权重…

使用观测云排查数据库死锁故障

故障发现 核心应用 pod 发生重启&#xff0c;同时接收到对应使用者反馈业务问题&#xff0c;开始排查。 观测云排查现场 1、根据重启应用信息&#xff0c;查询 APM 执行数据库 update 操作大量报错&#xff0c;执行时间在 5min 以上。 分析 APM 链路异常&#xff0c;发现是触…

UNIX数据恢复—UNIX系统常见故障问题和数据恢复方案

UNIX系统常见故障表现&#xff1a; 1、存储结构出错&#xff1b; 2、数据删除&#xff1b; 3、文件系统格式化&#xff1b; 4、其他原因数据丢失。 UNIX系统常见故障解决方案&#xff1a; 1、检测UNIX系统故障涉及的设备是否存在硬件故障&#xff0c;如果存在硬件故障&#xf…

npm或yarn包配置地址源

三种方法 1.配置.npmrc 文件 在更目录新增.npmrc文件 然后写入需要访问的包的地址 2.直接yarn.lock文件里面修改地址 简单粗暴 3.yarn install 的时候添加参数 设置包的仓库地址 yarn config set registry https://registry.yarnpkg.com 安装&#xff1a;yarn install 注意…

opencv——图片矫正

图像矫正 图像矫正的原理是透视变换&#xff0c;下面来介绍一下透视变换的概念。 听名字有点熟&#xff0c;我们在图像旋转里接触过仿射变换&#xff0c;知道仿射变换是把一个二维坐标系转换到另一个二维坐标系的过程&#xff0c;转换过程坐标点的相对位置和属性不发生变换&a…

【学习】企业通过CMMI认证,还需要申请CSMM资质吗

​ 企业通过CMMI认证之后&#xff0c;是否还有必要申请CSMM资质&#xff1f;这是一个值得软件企业深思的问题。虽然CMMI和CSMM都在组织的软件过程改进和认证方面发挥着重要作用&#xff0c;但它们各自拥有自己的特点在。企业需要根据自身发展需求来选择适合的认证方式。首先我…

OpenHarmony-3.HDF input子系统(5)

HDF input 子系统OpenHarmony-4.0-Release 1.Input 概述 输入设备是用户与计算机系统进行人机交互的主要装置之一&#xff0c;是用户与计算机或者其他设备通信的桥梁。常见的输入设备有键盘、鼠标、游戏杆、触摸屏等。本文档将介绍基于 HDF_Input 模型的触摸屏器件 IC 为 GT91…

BurpSuite之移动端流量抓包

学习视频来自B站UP主泷羽sec&#xff0c;如涉及侵权马上删除文章。 笔记只是方便学习&#xff0c;以下内容只涉及学习内容&#xff0c;切莫逾越法律红线。 安全见闻&#xff0c;包含了各种网络安全&#xff0c;网络技术&#xff0c;旨在明白自己的渺小&#xff0c;知识的广博&a…

Any2Policy: Learning Visuomotor Policy with Any-Modality(类似AnyGPT)

发表时间&#xff1a;NeurIPS 2024 论文链接&#xff1a;https://readpaper.com/pdf-annotate/note?pdfId2598959255168534016&noteId2598960522854466816 作者单位&#xff1a;Midea Group Motivation&#xff1a;Current robotic learning methodologies often focus…

QTreeView 与 QTreeWidget 例子

1. 先举个例子 1班有3个学生&#xff1a;张三、李四、王五 4个学生属性&#xff1a;语文 数学 英语 性别。 语文 数学 英语使用QDoubleSpinBox* 编辑&#xff0c;范围为0到100,1位小数 性别使用QComboBox* 编辑&#xff0c;选项为&#xff1a;男、女 实现效果&#xff1a; 2…

计算机视觉与医学的结合:推动医学领域研究的新机遇

目录 引言医学领域面临的发文难题计算机视觉与医学的结合&#xff1a;发展趋势计算机视觉结合医学的研究方向高区位参考文章结语 引言 计算机视觉&#xff08;Computer Vision, CV&#xff09;技术作为人工智能的重要分支&#xff0c;已经在多个领域取得了显著的应用成果&…

谷粒商城—分布式基础

1. 整体介绍 1)安装vagrant 2)安装Centos7 $ vagrant init centos/7 A `Vagrantfile` has been placed in this directory. You are now ready to `vagrant up` your first virtual environment! Please read the comments in the Vagrantfile as well as documentation on…

麒麟系统+达梦数据库+MybatisPlus+Redis+SpringBoot

环境准备 麒麟系统 在麒麟系统官网进行下载镜像 这里选择的是麒麟V10桌面版&#xff0c;使用虚拟机启动 修改root密码 # 启动到单用户模式 init 1 # 修改 root 密码 passwd root # 重启 reboot达梦数据库准备 进入达梦官网 我这里选择的是达梦数据库管理系统DM8开发版 下…

DFC:控制 ~~到达率~~ 最小化等待时间

DFC&#xff1a;控制 到达率 最小化等待时间 计算节点的等待成本&#xff1a;公式&#xff08;2&#xff09; ( λ i λ ( W q i C i μ c i ‾ ) ) (\frac{\lambda_i}{\lambda}(W_q^i C_i\overline{\mu_c^i})) (λλi​​(Wqi​Ci​μci​​)) 在这个到达率下的等待时间&am…

单词翻转

单词翻转 C语言实现C实现Java实现Python实现 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 输入一个句子&#xff08;一行&#xff09;&#xff0c;将句子中的每一个单词翻转后输出。 输入 只有一行&#xff0c;为一个字符串&#xff0c…

数据分析实战—房价特征关系

1.实战内容 &#xff08;1&#xff09; 读取房价特征关系表&#xff08;house_price.npz&#xff09;绘制离地铁站的距离与单位面积的房价的散点图&#xff0c;并对其进行分析&#xff1b; import pandas as pd import numpy as np import warnings warnings.filterwarnings(&…