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 --shortClient Version: v1.27.2
Kustomize Version: v5.0.1
Server Version: v1.27.2
测试Kubernetes安装
运行以下命令检查Kubernetes是否正常运行:
kubectl get nodesNAME 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_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: flask-app-service20241208 # 服务的名称labels:app: flask-app20241208 # 标签与 Deployment 一致
spec:selector:app: flask-app20241208 # 匹配 Deployment 的标签ports:- protocol: TCPport: 5000 # 服务暴露的端口targetPort: 5000 # 转发到容器的端口type: LoadBalancer # 服务类型,LoadBalancer 用于云环境负载均衡
文件说明:
- Deployment 部分
- 定义了
replicas
为 2,确保至少有两个 Pod 在运行,以提供高可用性。 - 配置了
livenessProbe
和readinessProbe
探针,保证应用的健康状态和流量接收。 - 使用了环境变量,保持和 Dockerfile 的配置一致。
- 资源限制通过
resources
配置,避免容器占用过多资源。
- 定义了
- Service 部分
- 定义了一个
LoadBalancer
类型的服务,使外部可以通过 HTTP 访问应用。 - 将外部的
80
端口映射到容器的5000
端口。
- 定义了一个
- 文件结构一致性
- 镜像名
flask-app:latest
,需要确保镜像在 Kubernetes 部署前已经构建并上传到容器注册表。
- 镜像名
此文件适用于标准的 Flask 应用部署到 Kubernetes 集群中,并支持水平扩展和高可用配
4.在Kubernetes上部署应用程序
- 将部署应用于Kubernetes:
kubectl apply -f k8s-deployment.yamldeployment.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