🙌
kubernetes(k8s)を使ってローカル開発を行う
はじめに
皆さん開発はどんな環境でおこなっていますか。
最近ではコンテナベースの開発が主流となり、Dockerやdocker-composeを利用して開発を行うことが多いのではないのでしょうか。
ただ、実際にサービスをリリースし本番環境で動かすときにはdocker-composeなどは利用せずGKEやEKSなどと言ったkubernetes(k8s)を使用した環境で運用されることが多いです。
そこで今回は、より本番環境と近い環境で開発できるk8sを利用したローカル開発環境の構築方法と開発手順について記載していきます。
この記事で何ができるのか
- ローカルでk8sを利用できるようになる
- k8sを利用したローカル開発が行えるようになる
想定読者
- dockerの基礎がわかっている人
- k8sのdeployment,pods, serviceについて知っている人
事前準備
-
docker desktopのインストール
- k8sを有効にして、kubectlコマンドが利用できる状態に
- Docker DesktopのPreferenceを開き、「Enable Kubernetes」にチェックを入れたら「Apply」ボタンをクリックします。
- しばらくすると、「Kubernetes is running」と表示されます。
- 以下のコマンドを実行し、kubectlの補完機能を設定
# zsh echo "source <(kubectl completion zsh)" >> ~/.zshrc # bash echo "source <(kubectl completion bash)" >> ~/.bashrc
- k8sを有効にして、kubectlコマンドが利用できる状態に
-
以下のファイル、ディレクトリを作成
(python-local-k8s)/
├ app/
│ └ main.py
├ k8s/
│ ├ deployment.yml
│ └ service.yml
└ Dockerfile
main.pyのファイルの中身はこちらをクリック
main.py
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
return {"item_id": item_id, "q": q}
開発手順
今回は、pythonのlocal k8s環境を例として手順を説明します
開発手順は以下のとおりです。
- Dockerfileを作成からイメージの作成
- 対応するk8sマニフェストを作成する(主にdeployment,service)
- kubectl apply
- 修正後はdocker image build
- kubectl rollout restartコマンドでリソースをローリングアップデート
1. Dockerfileを作成からイメージの作成
k8sではpodというリソース内で、dockerなどのコンテナランタイムを動かします。
今回は
pythonのDockerfileを作成し、Docker imageを作成します。
Dokerfileの作成
FROM tiangolo/uvicorn-gunicorn-fastapi:python3.7-slim
COPY ./app /app
docker image build
# docker build -t [Docker Image名] .
$ docker build -t python-local-k8s .
対応するk8sマニフェストを作成する(主にdeployment,service)
k8s manifestファイルの内容はこちらをクリック
k8s manifest(deployment, service)
apiVersion: apps/v1
kind: Deployment
metadata:
name: python-fastapi
spec:
selector:
matchLabels:
app: python-fastapi
template:
metadata:
labels:
app: python-fastapi
spec:
containers:
- name: python-fastapi
image: python-local-k8s
imagePullPolicy: Never
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: python-fastapi
spec:
type: LoadBalancer
selector:
app: python-fastapi
ports:
- port: 8700
targetPort: 80
kubectl apply(k8sリソースを作成する)
$ kubectl apply -f k8s-resource.yml
上記コマンドを実行したら,
http://localhost:8700/docs にアクセスしてみましょう。
以下のような画面が表示されていたら、成功です。
修正後はdocker image build
ファイルを修正したら、docker imageをbuildし直しましょう。
例えば、main.pyファイルを以下のように修正したとします。
ファイル修正
main.py
from fastapi import FastAPI
+ from pydantic import BaseModel
app = FastAPI()
+class Item(BaseModel):
+ name: str
+ price: float
+ is_offer: bool = None
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
return {"item_id": item_id, "q": q}
+@app.put("/items/{item_id}")
+def update_item(item_id: int, item: Item):
+ return {"item_name": item.name, "item_id": item_id}
docker image buildを実行をする
kubectl rollout restartコマンドでリソースをローリングアップデート
以下コマンドを実行することで、修正内容が反映されます。
$ kubectl rollout restart deploy [k8s deployment名]
もう一度 http://localhost:8700/docs にアクセスしてみましょう。
修正内容が更新されていることがわかります。
まとめ
k8s を用いてローカルで開発では以下の手順を行う
- Dockerfile作成~Docker Image Build
- kubectl apply でk8sリソースを作成
- ファイル修正したら再びdocker image build
- docker image buildしたらkubectl rollout restart する
Discussion