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 が使用するロードバランサーを指す、完全に登録されたドメイン名。* という名前とロードバランサーの IP アドレスを持つ A レコードを作成する必要があります。.

ステップ1 – Pythonプログラムを作成する

まず、UbuntuシステムにPythonがインストールされていることを確認する必要があります。ターミナルを開いて次のコマンドを入力することで確認できます。

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アプリケーションをDockerizeする

Python アプリケーションを Docker 化するには、アプリケーションの実行に必要な Python 環境と依存関係を含む Docker イメージを作成する必要があります。.

まず、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 フォルダにコピーします。.
  • RUN 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 を使用して http://your-server-ip:5000 という URL でアプリケーションにアクセスします。「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 – PythonアプリケーションをデプロイするためのKubernetesマニフェストを作成する

ここで、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サービスを介して内部的に公開し、HTTPトラフィックをアプリケーションに誘導するためのIngressリソースを設定します。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 が動的に割り当てた IP アドレスを、Okteto の一部としてインストールして構成した NGINX Ingress に割り当てます。

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

選択したドメインのDNSに、外部IPアドレスを追加する必要があります。これは、*という名前のAレコードを作成することで行います。.

次に、Web ブラウザを開き、https://okteto.okteto.example.com/login#token=88f8cc11 で Okteto インスタンスにアクセスします。.


ステップ6 – Okteto CLIのインストールと設定

Okteto CLI は、Kubernetes 上で直接アプリケーションを開発できるオープンソースのコマンドライン ツールです。.

LinuxとmacOSでは、curlを使って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
上記のファイルでは:
  • deploy: このセクションではデプロイメント設定を定義します。okteto up または okteto deploy を実行すると、Okteto は kubectl application -f k8s.yaml コマンドを実行し、k8s.yaml ファイルで定義された Kubernetes リソースをデプロイします。これにより、開発環境の設定とは別にデプロイメント設定を指定できます。.
  • command: bash: 開発環境の起動時に実行するコマンドを指定します。.
  • Environment: 開発環境に設定する環境変数を指定します。この場合は、FLASK_ENV を development に設定します。.
  • SYNC: ローカルマシンと開発環境間で同期するフォルダを指定します。開発環境内の現在のディレクトリ (.) と /app を同期します。.
  • リバース: 開発環境からローカルマシンにポートを公開するためのポート転送ルールを指定します。この場合、開発環境のポート9000をローカルマシンのポート9000に転送します。.
  • volumes: 開発環境にインストールする追加のボリュームを指定します。この場合、開発環境にpipパッケージをキャッシュするために使用できる/root/.cache/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ダッシュボードを更新します。デプロイされたアプリケーションが表示されます。


https://my-app-okteto-admin.okteto.example.com という URL を使用して 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を利用することで、開発者はKubernetesインフラストラクチャの複雑さを気にすることなく、高品質なPythonアプリケーションの構築に集中できます。.

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

あなたも気に入るかもしれない