# ecs-agent ## 順番 伊藤->大谷->根岸->前田->深谷->箕輪 ドライバー大谷 書記根岸 agent.go doStartのvpcSubnetAttributesのあたりから - TaskENIEnabledだったらリソースをinitializeする - TaskEngineState TaskEngine を渡している - interfaceはなんか似てる - vpc周りのネットワーク設定を行っている - 制限を見ている - registerContainerInstance - iam取る - capabilities見てる めっちゃappendしまくる実装になってる - ec2のtag取る - ユーザが入れたタグではなく? - ちょっとわからないのでこのまま進める - platform取ってくる - ec2 arn取ってくる - チェック終わったらRegisterContainerInstanceでECSに登録するみたいなことをやってる - api/ecsclient/client.goのRegisterContainerInstance - →registerContainerInstance - ここでリクエストを投げるためのattributesを収集する - registerRequestを作ったらstandardClient.RegisterContainerInstanceに投げる - registerAttributeのvalidateを行う(登録されたかどうかのチェック) - これで一旦終端 - agent.goのdoStartのagent.regiseterContainerInstanceまで戻ってくる - serviceconnectManagerを取得してECSClientをセット - ServiceConnectはセッション周りのサービス - サービスメッシュを構成することができる - agent.cfg見ながらenabledならmetadataをコピーする - ヘルスチェックを実行してくれる - ハンドラがいっぱい出てくる deregisterationがリクエストをキャッチできるようにしてる - 最後にstartACSSessionを返して終わり - セッション張ります以上ではない doStart終わり - run.goの一番したまで行ったので終わりかも? - doStartはagentを起動してECSへと自分の情報を登録しに行ってるの? - 起動した結果EC2側のagentがバリデーション・登録情報を見て、ECSの中央に登録しにくる - agentってmanagerとclient両方にインストールされてる? - managerはAWS側みたいなイメージ - agentはclient = container instanceにしかいない - 逆にmanagerからagentへのリクエストは確かに見られてないかも - タスク停止とか - 最初の方にagent-container/agent-config.jsonを見たと思うが、ここに置くのかなと思っていた? それがよくわからない - handlersとかはagent配下にあるのでセットアップしていると思うが - doStartから読んでるagent.statAsyncRoutinesで - HttpのSetupが走っている - これを読むと良さそう 次回: agent.go/ dostart 441行目 agent.startAsyncRoutinesの先を読む ## 2023/05/24 ドライバー: 伊藤 書記: 大谷 amazon-ece-agent/agent/agent.go (本体) - amazon-ece-agent/agent/agent.go - amazon-ece-agent/agent/run.go - ヘルスチェックホスト設定 - - newAgent() - GetMetadataでコンテナインスタンスの情報を取ってくる - CreateConfig - MetadataManager - コンテナの状態を管理していく - *ecsAgent.start - StartDebugHundler - USR1シグナルを受け取れる - dockerstate.DockerTaskEngineStete - コンテナのタスクマッピング - コンテナの起動停止の状態管理・チェック - agent.initializeResouceFields - cgroup - /ecs に独自の名前空間で自前でリソース制御してる - ASM/SSM/S3/その他、連携している他のAWSサービスのリソース管理 - agent.newTaskEnging() - struct - Credential - State - Image - ServiceConnect - ExecCMD - Checkpoint - 再開できるように状態を定期保存する - SetclusterInConfig - 排他制御 - 1agent:1clusterなので紐づくAgentに齟齬がないようにする - agent.terminationhundler() - 終了時にState保存、タスクの起動抑止をしつつ終了する - agent.initMetricsEngine - MetricsClient - 色々なメトリクスに対応している - MetricsClient_ - MetricsClientのCollectionを取り扱える - agent. () - コンテナインスタンス/VPCの情報をAgentにSet - ENI(AWS上の仮想NIC)とCNI(コンテナのNIC)の紐づけをする - 他、ネットワーク周りのプラグインの有効化等 > 次回: dostartの338 ENIの有効無効の分岐から ## 2023-05-17 ドライバー: 箕輪 書記: 伊藤 ecs-initはある程度読んでいるが、ecs-agent本体はまだ読んでいないので、多少読みたい。 今後3人とかでも読み進めるか??? (ecs-agentに限らず) > 次回ecs-init:101 PreStopから ### PreStop() deprecatedなので飛ばしていいか? → STOPもPreStopなのでengine.PreStop読もう!! - engine.go: `*Engine.PreStop()` - dockerの情報を取得してagentを停止する - getDockerClient -> docker.go: Client() - docker.StopAgent() - docker.go: client.StopAgent() - findAgentContainer - agentを利用してコンテナリストを取得 - コンテナリスト→名前でマッチするものを返す - 見付かったコンテナについて、タイムアウト10sを設けてStopContainerする ### PostStop() > PostStop cleans up the credentials endpoint setup by disabling loopback routing and removing the rerouting rule from the netfilter table > PostStop は、ループバック ルーティングを無効にし、ネットフィルター テーブルから再ルーティング ルールを削除することで、資格情報エンドポイントのセットアップをクリーンアップします。 ### ReloadCache() > ReloadCache reloads the cached image of the ECS Agent into Docker > ReloadCache は、ECS エージェントのキャッシュされたイメージを Docker に再ロードします - ダウンローダ: どこかにキャッシュを保存していてそれを取得する。ecs agent(dockerのイメージ)を取得する。 - キャッシュが無ければダウンロード&キャッシュしなおす。 - ecs-agentをキャッシュからロードする。 次回: amazon-ece-agent/agent/agent.go (本体) ## 2023-04-12 ドライバー: ねぎぽさん 書紀: 箕輪 ### StartSupervised() - docker clientの呼び出し - Clientはpublic - sync組み込み - dockerOnce = sync.Once - 一回だけ実行される - syncOnce詳細は興味のあるひとは個別に - pingされている - backoff - 参考 backoff パッケージ https://pkg.go.dev/github.com/aws/amazon-ecs-agent/ecs-init/backoff - newDockerClient - socketを定義 - dockerClientFactory.NewVersionedClient - 2箇所に定義(テスト目的) - goDockerClient.new - 外部ライブラリ - ここ読むと中身がわかるはず.... - pingして失敗したらbackoffしてretry - filesystemも保持 - dependencies依存だけを管理するように見える - ここまででdockerに対して操作可能に - RemoveExistingAgentContainer - docker.go内に定義 - forでループ - StartAgent - CreateContainer - 設定を保持したコンテナ立ち上げ - StartContainer - WaitContainer - 返り値が以上だとエラーに - HTTPリクエスト wait api - dockerのAPIが存在している - 42、宇宙の真理、何らか変換される - upgradeAgent - dockerの中にECS agentをロードする - cache.newDownloader - どっかからダウンロードしてきてfilesystemに保存してそう - load - agentLoaderは関数 - RecordCachedAgentエラーハンドリング用 - container.FailureAgentExitCode - failedContainerLogWindowSize - 表示するエラーの行数 - Terminal? - cacheをどう管理しているの? - 次回ecs-init:101 PreStopから ## 2023-03-01 リポジトリ: https://github.com/aws/amazon-ecs-agent ## 起動するところ - amazon linuxだとsystemctrl経由でこれできどうされてる。 - https://github.com/aws/amazon-ecs-agent/blob/master/packaging/amazon-linux-ami-integrated/ecs.service - ExecStart `/usr/libexec/amazon-ecs-init start` - amazonlinuxに関連してそうなファイルはこの辺に有る - https://github.com/aws/amazon-ecs-agent/tree/master/packaging/amazon-linux-ami-integrated ## 起動するのはこの辺ぽい - https://github.com/aws/amazon-ecs-agent/blob/master/ecs-init/ecs-init.go ## mainからよむ - https://github.com/aws/amazon-ecs-agent/blob/master/ecs-init/ecs-init.go#L39 - 引数をパース - ロガー初期化 - actionsメソッドで、サブコマンドに対応するengine.*を撮ってきて実行する - アクションがなかったら案内出して終了 ## それぞれサブコマンドが実行される - https://github.com/aws/amazon-ecs-agent/blob/master/ecs-init/engine/engine.go ## pre-startサブコマンド - constでデフォルトパラメータが設定されてたり - New - cache.NewDownloader - なんか色々初期化 - PreStart - PrestartGPU - gpu初期化 - nvidiaべったりな実装 - nvidiaGpuManager.setup - /dev/nvidiaGPU*で探す - LoopbackRouting.Enable - ipv6のadvertisement機能off - GetDockerClient - AgentCacheStatusでagentの状態確認してる - ecs-agent用起動用のメタデータの状態確認している - /var/lib/ecs/data/ecs_agent_data.json ## 次回 - 別のサブコマンドを読む
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up