🙌

kubernetes(k8s)を使ってローカル開発を行う

2021/06/30に公開

はじめに

皆さん開発はどんな環境でおこなっていますか。
最近ではコンテナベースの開発が主流となり、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
      
  • 以下のファイル、ディレクトリを作成

(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環境を例として手順を説明します
開発手順は以下のとおりです。

  1. Dockerfileを作成からイメージの作成
  2. 対応するk8sマニフェストを作成する(主にdeployment,service)
  3. kubectl apply
  4. 修正後はdocker image build
  5. 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