#はじめに
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を記述する時のきまり
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
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を使っていますが難しくてよくわからないので応用方法はそれぞれ調べてみてください!
良き研究ライフを~