Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
FastAPIでKubernetesを扱うときに役立つTips
Hiroki Okui
December 07, 2022
Technology
1
310
FastAPIでKubernetesを扱うときに役立つTips
Hiroki Okui
December 07, 2022
Tweet
Share
More Decks by Hiroki Okui
See All by Hiroki Okui
CUEとKubernetesカスタムオペレータを用いた新しいネットワークコントローラをつくってみた
hrk091
1
290
New Network Provisioning System Leveraging Kubernetes and Cloud Native Open Source
hrk091
2
47
マニフェストレスで使える IaC・CI/CD のSaaSプロダクト化への挑戦
hrk091
2
390
クラウドネイティブな新しいネットワークコントローラをつくる
hrk091
6
1.5k
内製DevOps基盤を大きく作り直してみた
hrk091
7
2.4k
React HooksとGraphQLで社内レガシーサービスを巻き取ってみたらものすごくはかどった話
hrk091
12
4.1k
ODTN and TIP collaboration with Whitebox Transponder 'Cassini'
hrk091
0
140
Expectation and Activities for Open and Disaggregated Transport Network Project
hrk091
0
28
Model-Driven SDN Experiences and Learnings with NSO
hrk091
0
60
Other Decks in Technology
See All in Technology
創業1年目のスタートアップでAWSコストを抑えるために取り組んでいること / How to Keep AWS Costs Down at a Startup
yuj1osm
3
2.2k
OCI DevOps 概要 / OCI DevOps overview
oracle4engineer
PRO
0
510
JAWS-UG 横浜 #54 資料
takakuni
0
220
NGINXENG JP#2 - 2-NGINXの動作の詳細
hiropo20
1
140
API連携に伴う規制と対応 / Regulations and responses to API linkage
moneyforward
0
160
OCI技術資料 : ロード・バランサー 詳細 / Load Balancer 200
ocise
2
7.2k
もし本番ネットワークをまるごと仮想環境に”コピー”できたらうれしいですか? / janog51
corestate55
0
390
OpenShiftのリリースノートを整理してみた
loftkun
2
440
初めてのデータ移行プロジェクトから得た学び
tjmtmmnk
0
400
データ分析基盤の要件分析の話(202201_JEDAI)
yabooun
0
320
「一通りできるようになった」その先の話
hitomi___kt
0
140
Logbii(ログビー) 会社紹介
logbii
0
170
Featured
See All Featured
How to Ace a Technical Interview
jacobian
270
21k
Designing Experiences People Love
moore
130
22k
Robots, Beer and Maslow
schacon
154
7.3k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
31
20k
Docker and Python
trallard
30
1.9k
How STYLIGHT went responsive
nonsquared
89
4.2k
A designer walks into a library…
pauljervisheath
199
16k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
236
1.1M
Web development in the modern age
philhawksworth
197
9.6k
Making Projects Easy
brettharned
102
4.8k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
349
27k
The Invisible Customer
myddelton
113
12k
Transcript
#ochacafe FastAPIでKubernetesを 扱うときに役立つTips 2022/12/7 NTTコミュニケーションズ 奥井 OCHaCafe
Season6 #4
#ochacafe 自己紹介 NTTコミュニケーションズ Software Engineer 奥井 寛樹 略歴 • 伝送システムのSDNコントローラ開発
• DevOpsプラットフォーム開発 • IoTデータ収集基盤のモダナイゼーション @HirokiOkui 2
#ochacafe はじめに • FastAPIは、型安全性やOASの自動生成機能を備えた ASGIフレームワークで、さっとAPIを作るときに便利です • Kubernetes API Serverをwrapしてドメインロジックを 追加することで、簡易なXaaSがつくれます
• FastAPIからKubernetes API Serverを叩くときのTipsを4つご紹介します 3 Frontend API Kubernetes API Server TektonベースのCI/CDaaSを FastAPIを用いて作りました 構成イメージ
#ochacafe 1. k8s CRD => API => UI まで一気通貫で型を自動生成 •
FastAPIは、Pydantic型を用いることで「型指向開発」「 OASの自動生成」 「型のランタイム検査」などが可能になる • datamodel-codegenを用いると、OASやJSON SchemaからPydantic型を 自動生成できる => KubernetesのCRDから、Pydantic型を生成できる • Pydantic型を用いてAPIを定義するとFastAPIのOASを生成できるため、 openapi-generator-cli などを用いて、UIまで型を生成・流通できる Frontend API Kubernetes API Server k8s Custom Operator openapi-generator api client Pydantic CRD JSONSchema Go Struct datamodel-codegen generate OAS 4 CIで全自動化 できます
#ochacafe 2. kubernetes-clientを型対応する • Kubernetes API Machinery SIGから提供される公式のPython Client*1は、 typingをサポートしているが、型周りの体験が非常に悪い
• API callのresponseに型がない ◦ 汎用のUnion型になる ➞ 都度 型ヒントが必要 • dot notationで深い要素まで アクセス可能だが、 型がAnyになってしまう 5 *1: https://github.com/kubernetes-client/python from kubernetes import client from kubernetes.client import V1Namespace v1 = client.CoreV1Api() res = v1.read_namespace('test') # 汎用のUnion型 res: V1Namespace # 型ヒントを書いても ... res.spec # 子要素はAnyになる OpenAPIGeneratorで生成されており、 かつ古いversionのため(v4.3.0) (最新化を検討中:#1943) 実質、構造体の全てのレイヤで 型ヒントが必要に
#ochacafe 2. kubernetes-clientを型対応する 6 • そもそもFastAPIを使っているので、Pydantic型で扱いたい ◦ Pydantic型にすると、ランタイムチェックが効くし、 OASにも反映される •
kubernetes-clientをwrapして、Pydanticに対応する ◦ この機能を提供している OSSは(多分)ないので、自作が必要 ◦ Sample: https://github.com/hrk091/kubernetes-pydantic • Tips1の型自動生成を 実現するには、 上記の対応が必要 手間ですが、 FastAPIでk8sを制御 するならやるべき 要望いただければ メンテします 型ヒントなしで型が 決定しており、ネスト先の 型も推論できている
#ochacafe 3. kubernetes-clientをasync対応する • 公式のKubernetes Python Clientは、asyncに対応しているが、デフォルトは同期実行 • FastAPIのASGIを活かしてPerformance改善するために、asyncモードで動かすと良い ◦
k8s API Serverはリクエスト次第でレスポンスが良くないので、 blockingは回避すべし 7 都度async処理を書くと ドメイン層が汚れるので client内に隠蔽するとよい
#ochacafe 4: FastAPIのPerformanceに注意 • FastAPIは型のランタイム検査もしてくれるため便利だが、 大きなk8s Resourceを扱うと、CPU・メモリの消費がすごい ◦ さらに、uvicornのメモリリークもあり、メモリが開放されない •
型のランタイム検査をトグルする良い方法は現状ない (#5498) ◦ 検査対象外にしたい場所で、 Pydantic型の使用をやめるしかない • 性能が問題になる場合は、レスポンスのフィールドを 減らす工夫が必要 ◦ last-applied-configuration、managedFields等は削る ◦ 本当に必要なフィールドに限定する 8 uvicorn v0.18.3で メモリリークが 直ったそうです #1624 *1: https://github.com/tiangolo/fastapi/issues/1624 OOM kill
#ochacafe まとめ Tips1: k8s CRD => API => UIまで一気通貫で型を自動生成 Tips2:
kubernetes-clientを型対応する Tips3: kubernetes-clientをasync対応する Tips4: FastAPIのPerformanceに注意 9