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
- 下载
下载地址: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-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
- 将项目部署应用于 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 端口。