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

发布于:2024-12-09 ⋅ 阅读:(108) ⋅ 点赞:(0)

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