如何使用 Okteto 将 Python 应用程序部署到 Kubernetes

0 股票
0
0
0
0

介绍

Okteto 是一个开发平台,旨在简化 Kubernetes 应用的开发流程。它允许开发者直接在 Kubernetes 集群上构建和测试应用,而无需搭建复杂的本地开发环境。Okteto 支持对运行在 Kubernetes 集群上的应用进行实时更新,使开发者能够实时查看代码变更,而无需重新构建或部署应用。.

在本教程中,您将创建一个 Python 应用程序,并使用 Okteto 将其部署到 Kubernetes。.

先决条件
  • Kubernetes 1.28 集群
  • kubectl 已安装并配置为与您的集群通信。.
  • Docker Hub 帐户
  • Docker 正在您的本地计算机上运行。.
  • 使用 Okteto 需要许可证。要获取许可证密钥,请注册 Okteto 的 30 天免费试用版。.
  • Helm 包管理器已安装在您的本地计算机上。.
  • 一个已完全注册的域名,指向 Nginx Ingress 使用的负载均衡器。您需要创建一个 A 记录,名称为 *,内容为负载均衡器的 IP 地址。.

步骤 1 – 创建一个 Python 程序

首先,您需要确保 Python 已安装在您的 Ubuntu 系统上。您可以通过打开终端并输入以下命令来检查:

python3 --version

如果已安装 Python,此命令将显示 Python 版本。如果没有安装,您可以使用以下命令安装它:

sudo apt install python3 python3-venv python3-pip -y

然后创建一个目录来存储应用程序代码和其他设置。.

mkdir my-app

接下来,进入你的应用程序目录,创建一个虚拟环境来隔离项目的依赖项。.

cd my-app
python3 -m venv python-env

然后使用以下命令激活虚拟环境。.

source python-env/bin/activate

接下来,为你的应用程序创建一个新的 Python 文件。例如,创建一个简单的 app.py 文件:

nano app.py

添加以下代码:

from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return "Hello, This is a simple Python App!"
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0')

然后安装 Flask Web 框架。.

pip install flask

现在使用以下命令运行你的Python程序。.

python3 app.py

您将看到以下输出。.

Output * Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:5000
* Running on http://172.20.10.2:5000
Press CTRL+C to quit
* Restarting with stat
* Debugger is active!
* Debugger PIN: 311-959-468

现在 Flask 应用已在本地运行,您可以使用 curl 进行验证:

curl -X GET -H "Content-Type: application/json" http://localhost:5000

你应该会从 Flask 应用程序收到以下响应。.

OutputHello, This is a simple Python App!

项目完成后,您可以通过运行以下命令停用虚拟环境:

deactivate

至此,您已经创建了一个 Python 程序并在本地进行了测试。.

步骤 2 – 将 Python 应用程序 Docker 化

将 Python 应用程序容器化涉及创建一个 Docker 镜像,其中包含运行该应用程序所需的 Python 环境和依赖项。.

首先,在 Python 应用程序的根目录中创建一个名为 Dockerfile 的文件。.

nano Dockerfile

添加以下内容:

# Use an official Python runtime as a parent image
FROM python:3.8-slim
# Set the working directory in the container
WORKDIR /app
# Copy the current directory contents into the container at /app
ADD . /app
# Install any needed dependencies specified in requirements.txt
RUN pip install flask
# Make port 5000 available to the world outside this container
EXPOSE 5000
# Define environment variable
ENV NAME DockerizedPythonApp
# Run app.py when the container launches
CMD ["python3", "./app.py"]
在这个 Dockerfile 中:
  • FROM python:3.8-slim:指定要使用的基础镜像。您正在使用已安装 Python 3.8 的官方 Python 镜像。.
  • WORKDIR /app:将容器内的工作目录设置为 /app。.
  • 添加 . /app:将当前目录的内容复制到容器的 /app 文件夹中。.
  • 运行 pip install flask:安装 Flask 框架。.
  • EXPOSE 5000:开放端口 5000 以允许传入连接。.
  • CMD [“python3“, ”app.py”]:指定容器启动时要运行的命令。在本例中,它将运行 app.py 应用程序。.

现在运行以下命令,根据 Dockerfile 中的说明构建镜像。.

docker build -t my-app .

构建好 Docker 镜像后,就可以使用该镜像在容器中运行应用程序了:

docker run -dit -p 5000:5000 my-app:latest

该命令从 my-app 镜像运行容器,并将容器端口映射到主机端口 5000。.

您可以使用 docker ps 命令验证正在运行的应用程序容器。.

docker ps

输出结果为:

Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
761c54c77411 my-app:latest "python3 ./app.py" 3 seconds ago Up 3 seconds 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp pedantic_wescoff

打开网页浏览器或使用 curl 命令,通过 URL http://your-server-ip:5000 访问应用程序。您应该会看到“Hello, This is a simple Python App!”的消息,这表明您的 Python 应用程序正在 Docker 容器中运行。.

您已成功将 Python 应用程序 Docker 化。.

步骤 3 – 将 Python Docker 镜像推送到 DockerHub 镜像仓库

首先,您需要一个 DockerHub 帐户。如果您还没有帐户,可以在 DockerHub 网站上创建一个。.

要登录 Docker Hub,请使用 `docker login` 命令。系统会提示您输入 Docker Hub 用户名和密码。.

docker login

该命令的输出结果如下:

OutputLogin with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: [email protected]
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded

在将镜像推送到 Docker Hub 之前,还需要使用您的 Docker Hub 用户名和所需仓库的名称对其进行标记。.

docker tag my-app yourusername/my-app:latest

现在您可以使用 docker push 命令将 Docker 镜像推送到 Docker Hub。.

docker push yourusername/my-app:latest

推送镜像后,您可以使用 Docker Hub CLI 搜索该镜像,以验证它是否在 Docker Hub 上可用。.

docker search yourusername/my-app

您的 Python 应用程序 Docker 镜像现已发布在 Docker Hub 上,其他人可以拉取该镜像或将其部署到不同的环境中。.

步骤 4 – 创建 Kubernetes 清单以部署 Python 应用程序

现在,您需要使用 Okteto 创建一个 Kubernetes 清单文件,以定义名为 my-app 的应用程序的部署、服务和输入资源。.

nano k8s.yaml

将以下设置添加到文件中。.

apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- image: yourusername/my-app
name: my-app
---
apiVersion: v1
kind: Service
metadata:
name: my-app
spec:
type: ClusterIP
ports:
- name: "my-app"
port: 5000
selector:
app: my-app
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-app
annotations:
dev.okteto.com/generate-host: my-app
spec:
rules:
- http:
paths:
- backend:
service:
name: my-app
port:
number: 5000
path: /
pathType: ImplementationSpecific

上述文件使用 Okteto 实现了一个名为 my-app 的应用程序,并通过 5000 端口上的 ClusterIP 服务将其内部暴露出来,并设置了一个 Ingress 资源以将 HTTP 流量定向到该应用程序。Okteto 特有的注解用于启用 Okteto 提供的一些功能,例如自动生成主机名。.

步骤 5 – 使用 Helm 安装 Okteto

首先,您需要将 Okteto Helm 存储库添加到您的 Helm 客户端。.

helm repo add okteto https://charts.okteto.com

添加 Okteto Helm 仓库后,您需要更新 Helm 仓库,以确保您拥有有关可用图表的最新信息:

helm repo update

然后为 Okteto 创建 config.yaml 文件。.

nano config.yaml

添加 Okteto 许可证密钥、子域名和其他设置,如下所示:

license: FT7YCAYBAEDUY2LDMVXHGZIB76BAAAIDAECEIYLUMEAQUAABAFJAD74EAAAQCUYB76CAAAAABL7YGBIBAL7YMAAAAD77N74CAH7YU6ZCOZSXE43JN5XCEORSFQRGK3LBNFWCEORCNBUXIZLTNBVGK5DIOZQUA3DJNZ2XQYTVPIXGG33NEIWCEY3PNVYGC3TZEI5CE3DJNZ2XQYTVPIRCYITTMVQXI4ZCHIZTALBCORUWK4RCHIRHGY3BNRSSELBCORZGSYLMEI5HI4TVMUWCEZLOMQRDUIRSGAZDILJQGQWTCMCUGA2TUMJUHI2DQWRCPUATCAWDZA5DGNLGYAT25X6NRCJVJNWBQMG2LD7DWY36ZYXOZ7X5B37HZOBHXYV7OSCZ5HKH4G4EOIHJ7XOACMICRENEMSP5CHENLAE2XHXY44AMKKMHR5LB6IEWXNF56KJE6RGDVSGM2JW63F7DNP5ZS6REKK55RYIBMAA=
subdomain: okteto.example.com
buildkit:
persistence:
enabled: true
registry:
storage:
filesystem:
persistence:
enabled: true

现在,使用 config.yaml 配置文件安装最新版本的 Okteto。.

helm install okteto okteto/okteto -f config.yaml --namespace okteto --create-namespace

安装 Okteto 后,您将看到以下输出。.

OutputNAME: okteto
LAST DEPLOYED: Tue Mar 12 20:27:21 2024
NAMESPACE: okteto
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Congratulations! Okteto is successfully installed!
Follow these steps to complete your domain configuration:
1. Create a wildcard A record "*.okteto.example.com", pointing it to the Okteto NGINX ingress controller External-IP:
$ kubectl get service -l=app.kubernetes.io/name=ingress-nginx,app.kubernetes.io/component=controller --namespace=okteto
2. Access your Okteto instance at `https://okteto.okteto.example.com/login#token=88f8cc11`

稍等片刻,然后将 DigitalOcean 动态分配给您刚刚安装并配置的 NGINX Ingress(作为 Okteto 的一部分)的 IP 地址分配给它:

kubectl get service -l=app.kubernetes.io/name=ingress-nginx,app.kubernetes.io/component=controller --namespace=okteto

您将看到以下输出。.

OutputNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
okteto-ingress-nginx-controller LoadBalancer 10.101.31.239 45.76.14.191 80:31150/TCP,443:31793/TCP 3m21s

您需要获取外部 IP 地址,并将其添加到您选择的域名的 DNS 记录中。这可以通过创建名为 * 的 A 记录来实现。.

现在,打开您的网络浏览器,访问您的 Okteto 实例,网址为 https://okteto.okteto.example.com/login#token=88f8cc11。.


步骤 6 – 安装和配置 Okteto CLI

Okteto CLI 是一款开源命令行工具,可让您直接在 Kubernetes 上开发应用程序。.

您可以使用 curl 在 Linux 和 macOS 上安装 Okteto CLI。打开终端并运行以下命令:

sudo curl https://get.okteto.com -sSfL | sh

安装完成后,您可以通过运行以下命令来验证 Okteto CLI 是否已正确安装:

okteto version

此命令显示系统上安装的 Okteto CLI 版本。.

Outputokteto version 2.25.2

接下来,您需要使用您的个人访问代码对 Okteto CLI 进行身份验证。.

/* okteto context use https://okteto.okteto.example.com --token 88f8cc11 --insecure-skip-tls-verifycode... */

其输出结果为:

Output ✓ Using okteto-admin @ okteto.okteto.example.com

然后运行以下命令,确保您的 Okteto CLI 已配置。.

okteto context list

这将产生以下输出:

OutputName Namespace Builder Registry
https://okteto.okteto.example.com * okteto-admin tcp://buildkit.okteto.example.com:443 registry.okteto.example.com
vke-4b7aaaa6-78fa-4a19-9fb3-cf7b8c1ec678 default docker -

步骤 7 – 创建您的 Okteto 清单

要开始开发 Python 应用程序,您需要创建一个 Okteto 清单文件,并定义开发环境的配置。.

让我们为一个简单的 Python 应用程序创建 okteto.yaml 文件。.

nano okteto.yaml

添加以下配置。.

deploy:
- kubectl apply -f k8s.yaml
dev:
my-app:
command: bash
environment:
- FLASK_ENV=development
sync:
- .:/app
reverse:
- 9000:9000
volumes:
- /root/.cache/pip
在上述文件中:
  • 部署:本节定义部署配置。运行 `okteto up` 或 `okteto deploy` 时,Okteto 会运行 `kubectl application -f k8s.yaml` 命令来部署 k8s.yaml 文件中定义的 Kubernetes 资源。这样,您可以将部署配置与开发环境配置分开指定。.
  • command: bash: 指定开发环境启动时要执行的命令。.
  • 环境:指定要在开发环境中设置的环境变量。在本例中,它将 FLASK_ENV 设置为 development。.
  • 同步:指定要在本地计算机和开发环境之间同步的文件夹。将当前目录(.)与开发环境中的 /app 目录同步。.
  • 反向:指定端口转发规则,将开发环境中的端口暴露给本地计算机。在本例中,它将开发环境中的 9000 端口转发到本地计算机的 9000 端口。.
  • volumes:指定要在开发环境中安装的其他卷。在本例中,它会在开发环境中安装 /root/.cache/pip 目录,该目录可用于缓存 pip 包。.

现在使用以下命令将您的 Python 应用程序部署到 Kubernetes 集群。.

okteto deploy

部署成功后,您将看到以下输出。.

Outputdeployment.apps/my-app created
service/my-app created
ingress.networking.k8s.io/my-app created
i There are no available endpoints for 'Okteto'.
Follow this link to know more about how to create public endpoints for your application:
https://www.okteto.com/docs/cloud/ssl/
✓ Development environment 'Okteto' successfully deployed
i Run 'okteto up' to activate your development container

然后,返回浏览器并刷新 Okteto 控制面板。您将看到已部署的应用程序:


您还可以使用 URL https://my-app-okteto-admin.okteto.example.com 访问您的 Python 应用程序。.


步骤 8 – 直接在 Kubernetes 中开发 Python 应用程序

在本节中,您将使用 okteto up 命令将 Python 应用程序直接部署到 Kubernetes。此命令会将您的本地代码与开发环境同步。您可以使用本地计算机上您喜欢的 IDE 或文本编辑器修改代码,更改将自动同步到 Kubernetes 中的开发环境。.

让我们使用 Okteto 启动开发环境:

okteto up

此命令根据 okteto.yaml 文件中指定的设置创建一个开发环境。.

Output i Using okteto-admin @ okteto.okteto.example.com as context
i 'Okteto' was already deployed. To redeploy run 'okteto deploy' or 'okteto up --deploy'
i Build section is not defined in your okteto manifest
✓ Persistent volume successfully attached
✓ Images successfully pulled
✓ Files synchronized
Context: okteto.okteto.example.com
Namespace: okteto-admin
Name: my-app
Reverse: 9000 <- 9000
root@my-app-okteto-7767588c8d-ndzj7:/app#

接下来,运行你的Python程序:

python3 app.py

您将看到以下输出。.

Output * Serving Flask app 'app'
* Debug mode: on
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:5000
* Running on http://10.244.97.92:5000
Press CTRL+C to quit
* Restarting with stat
* Debugger is active!
* Debugger PIN: 126-620-675

现在,编辑你的 app.py 应用程序文件:

nano app.py

修改以下行:

return "Hello, This is a simple Python App Deployed on Kubernetes"

保存并关闭文件。Okteto 将自动检测代码更改并立即将其应用到 Kubernetes。.

返回浏览器并重新加载 Python 程序所在的页面。您将在下方页面看到修改后的程序。.


结果

在本教程中,您创建了一个基本的 Python 应用程序,并使用 Okteto 将其部署到 Kubernetes 集群。Okteto 能够将本地代码更改与开发环境实时同步,从而实现快速开发迭代并即时反馈代码更改。总而言之,Okteto 让开发人员能够专注于构建高质量的 Python 应用程序,而无需担心 Kubernetes 基础架构的复杂性。.

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

您可能也喜欢