pythonコードからkubernetesのpodを作成する方法


はじめに

kubernetesでpodを作るためにはまずpodのyamlファイルを作り、作ったyamlファイルをコマンドでapplyすることにより作成することが出来るが、コマンドを使わずにpythonコードからpodを作成するしたいと思って調べたところ記事が見当たらず、プログラムを書くのに苦労したため共有しておきます。

環境

  • Ubuntu 18.04.2 LTS
  • python 3.6.9
  • kubernetesが動く環境

podの基本的な作成方法

まず基本的なpodが作成できるか試してみる。podを作成するyamlファイルは何でもいいのですが、とりあえず簡単なpod.yamlのファイルを作成する。

$ vim pod.yaml

:set pasteでコピペすると楽

pod.yaml
# Podを記述する時のきまり
apiVersion: v1
kind: Pod
# Podの名前やラベルをはじめとする細かい情報
metadata:
  name: myapp-pod  # Podに名前をつける
  labels:
    app: myapp  # ラベル app -> myapp をつける
# Podに配置するコンテナ本体の情報
spec:
  containers:
    - name: demo-container  # コンテナに名前をつける
      image: nginx  # コンテナ名(Docker Hubの名前と一致)
      ports:
        - containerPort: 80  # 80番ポートを使う

pod.yamlをapplyしてpodを作成してみる。

$ kubectl apply -f pod.yaml
pod/myapp-pod created

podが出来たか確認してみる。

$ kubectl get pod
NAME        READY   STATUS    RESTARTS   AGE
myapp-pod   1/1     Running   0          34s

作ったpodは用済みなので消しておく。

$ kubectl delete -f pod.yaml
pod "myapp-pod" deleted
$ kubectl get pod
No resources found in c0118272 namespace.

pythonから作成

必要なものをインストールする。

$ pip3 install flask
$ pip3 install kubernetes

pod.yamlと同じディレクトリにpodcreate.pyという名前でpodを作成するpythonプログラムを作成する。namespaceのところは自分のnamespaceの名前に変更する。基本はdefaultになる。

$ vim podcreate.py
podcreate.py
from flask import Flask
from flask import request
from kubernetes import client, config, watch
import yaml

app = Flask(__name__)
@app.route('/')
def pod_create():
    config.load_kube_config()
    with open("pod.yaml", "r") as f:
        pod = yaml.safe_load(f)
        k8s_apps_v1 = client.CoreV1Api()
        resp = k8s_apps_v1.create_namespaced_pod(body=pod, namespace="c0118272")
        print("pod created. status='%s'" % resp.metadata.name)
    return "pod created. status='%s'" % resp.metadata.name

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=80)

ファイルの位置関係を確認する。

$ ls
podcreate.py  pod.yaml

flaskで書いたのでブラウザに表示して実行してみる。

$ export FLASK_APP=podcreate.py
$ flask run --host=0.0.0.0
 * Serving Flask app "podcreate.py"
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
 * 

ブラウザで実行してみる。urlはローカルならhttp://0.0.0.0:5000でローカルじゃなければポートは5000でIPアドレスが実行環境ごとに異なる。

上の画像のようになれば成功!

コマンドで確認してみる。

$ kubectl get pod
NAME        READY   STATUS    RESTARTS   AGE
myapp-pod   1/1     Running   0          3m11s

podが出来てたらやりたいことは完了!!

おわりに

kubernetesのapiを使っていますが難しくてよくわからないので応用方法はそれぞれ調べてみてください!
良き研究ライフを~