2024/12/22 Webサービスをデプロイできるアプリケーションの開発
システムの要件
アプリ作成フォーム
GitのURL
アプリケーション名
アプリを作成するボタン
押下すると、アプリ詳細画面に遷移し、POST /apps/createリクエストが発行される
アプリ管理画面(GET /apps)
アプリ作成ボタン(アプリ作成フォームに遷移)
アプリ一覧
イベントログ
アプリ詳細画面(GET /apps/{id})
アプリ作成の実装
1. GitHubのリポジトリURLからclone
2. Docker Engine APIを利用し、イメージをビルドする
3. Kubernetes Go Clientを利用し、Deployment、Serviceをapplyする
この時点でIPアドレスでアクセス可能になる?
ドメイン名でのアクセスはできれば良いが、いったんは無しで考えたい..
アプリの閲覧方法
一般的なPaaSでは、各アプリケーションにグローバルIPが割り当てられ、恒常的に、グローバルにアクセス可能である
今回は、アプリケーションにグローバルIPを割り当てたくない。
各アプリケーションは、仮想ネットワーク上で何らかのIPアドレスを持てればそれでよいとする。
ユーザは、事前にWindowsやcurlにプロキシを設定しておくことで、仮想ネットワークにアクセスできる。
プロキシサーバを設定しておく
デプロイの方法を検討する
各アプリのデプロイ時には、DeploymentによりPodを1つ生成する。
また、同時にClusterIP型のServiceもapplyする。
Podを直接
これは、Cluster内部でPodに接続する
アクセスのために、Squidコンテナを含むPodをNodePort型のServiceで外部公開する。
app: squidラベルのついたPodはすべて3128ポートでプロキシを提供するものとする。
ゆえに、Serviceのport、targetPortはともに3128とする。
Dockerイメージをビルドする
与えられるGitリポジトリの構造は、次のとおりである。
go.mod
go.sum
main.go
1. DockerイメージのビルドログをWebSocketで出力する
ひとまず、ローカルに用意しておいたDockerfileを使ってビルドするページを作る
なぜDocker CLIは、ビルドログを標準出力できるのか?
ImageBuildResponse.Bodyを使っているのかもしれない
メモ
Docker CLIでは、Gitをコンテキストとしてイメージをビルドすることも可能。
Contextの取得
Contextの取得処理の実装
ビルド時にDockerfileはContextDirから取り除かれるようなので、Dockerfileだけこちらで用意することは難しくないかもしれない!
やるべきことは、CMD "go run main.go"だけ?
と思ったが、docker buildにURLを指定した場合、Dockerfileを参照することはできないかも..
code:build.txt
#1 0.078 Initialized empty Git repository in /var/lib/docker/overlay2/phxi00roojjzqj2lwkuxxn81y/diff ...
ERROR: failed to solve: failed to read dockerfile: open ./build/Dockerfile: no such file or directory
ここの動作が求めるものとは異なっているので、ImageBuildは頑張る方向で...
$ docker build
Gateway APIの作成
WebSocketを介して、フロントエンドにビルドログの発生を通知する。
roomの命名規則: app: {applicationId}
os.Execの標準出力をWebSocketに出力する方法は?
参考になりそうな記事
Golangのbufioやpipe、channelの使い方に習熟する必要がある