Rancherコードリーディング入門(1/3)
Rancherのアプリケーションコード
続いて本題であるRancherのアプリケーションコードについて紹介します。
. ├── main.go ├── app ├── server ├── k8s ├── pkg
main.go
Rancher Serverのエントリーポイントとなるコードです。コマンドライン引数の処理や、Logレベルの設定、Rancherが利用するKubernetes Clientの初期化など基本的な処理を実施し、その後のMainとなるRancher Serverのロジックの呼び出しをapp/app.goを通して実施します。
app
app/ ├── app.go ├── authconfig_data.go ├── catalog_data.go ├── cluster_data.go ├── ensure_admin_user.go ├── listenconfig_data.go ├── machinedriver_data.go ├── podsecuritypolicytemplate_data.go ├── resetpassword.go ├── role_data.go ├── rolebuilder.go └── setting.go
ファイル | 説明 |
---|---|
app.go | main.goから呼ばれるRancher Serverの初期化ロジックを含む |
authconfig_data.go | 認証プロバイダを表すauthconfigリソースの初期データの作成 |
catalog_data.go | RancherデフォルトのCatalogリソースの初期データの作成 |
cluster_data.go | Rancherを動かすLocal Kubernetesを表すClusterリソースの作成 |
ensure_admin_user.go | Admin Userリソースの作成 |
listenconfig_data.go | Rancher API ServerのListenConfigリソースの作成 |
machinedriver_data.go | NodeDriverリソースの作成 |
podsecuritypolicytemplate_data.go | デフォルトの2種類のPodSecuirytPolicyTemplateリソースの作成 |
resetpassword.go | CLIにReset Passwordの実装 |
role_data.go | 初期Roleの作成 |
rolebuilder.go | 初期Roleの作成 |
setting.go | SettingリソースにInstallUUIDの作成 |
このappパッケージは、main.goから呼ばれるRancher Serverのコアロジックの初期化を含みます。app/app.goのRun関数がmain.goから呼ばれ、Run関数内で下記のような初期化処理を実施します
- Kontainer EngineのDriverごとのGrpc Serverの起動(Rancher内部で利用するためLoopback IPでListen)
- GKE
- AKS
- EKS
- Import
- RKE
- Rancher API Serverの起動
- Rancherが利用するCRDの作成
- Rancher API Controllerの起動
- ConfigMapベースのLeader Election
- Leaderの場合
- Telemery API Serverの起動
- Management Controllerの起動
- 初期データ(Catalog、ListenConfig、Roleリソース……)の作成
app/app.go以外のファイルは、基本的にapp.goから呼び出される関数が入っているだけで、すべてのロジックの始まりは、app.goからになります。
server
server/ ├── capabilities ├── health.go ├── responsewriter ├── server.go ├── ui └── whitelist
ファイル | 説明 |
---|---|
capabilities | /meta/gkeXXXX /meta/aksXXXX に関するコード |
health.go | Health Checkのための /ping の実装コード |
responsewriter | HTTP Responseに関するラッパー |
server.go | Rancher APIの初期化と起動のコード |
ui | Rancher UIに関するコード |
whitelist | Rancher APIの/meta/proxyのHTTP ProxyのProxy Whitelistに関するコード |
このserverパッケージは主にapp/app.goから呼ばれ、Rancher API処理の初期化とAPI Serverの起動の責任を持ちます。中でもこのパッケージの中心となるファイルは、server/server.goです。server/server.goは、app/app.goから呼ばれるStart関数を実装しており、該当関数内で、RancherのすべてのHTTP Handlerを収集し、どのAPIのPathに対して、どのHandlerを紐付けるべきなのか、どのHandlerのAuthenticationが必須なのかというマッピングを設定しています。
Rancher APIのメインとなるManagement APIについては、このserver.goからpkg/api/server/server.goを呼び出すことで、CRDの作成、API Controllerの初期化など実施しています。
server.go以外のファイルは、基本的にserver.goから呼び出される関数を定義しています。
k8s
k8s/ ├── config.go ├── embedded.go ├── embedded_none.go ├── k3s.go └── k3s_context.go
このpackageは、main.goで参照されているRancherが利用するKubernetes Clientの初期化を実施するコードです。しかし、利用できるKubernetesが発見できなかった場合は、Embedded Kubernetesを起動し、そのEmbedded KubernetesのClientをmain.goに返します。
pkg
pkg/ ├── agent ├── api ├── audit ├── auth ├── catalog ├── cert ├── clustermanager ├── clusterprovisioninglogger ├── clusterrouter ├── configfield ├── controllers ├── dialer ├── dynamiclistener ├── embedded ├── encryptedstore ├── filter ├── httpproxy ├── hyperkube ├── image ├── k8scheck ├── k8slookup ├── k8sproxy ├── kubeconfig ├── kubectl ├── librke ├── logserver ├── namespace ├── node ├── nodeconfig ├── pipeline ├── project ├── randomtoken ├── rbac ├── ref ├── remotedialer ├── resourcequota ├── rkecerts ├── rkedialerfactory ├── rkenodeconfigclient ├── rkenodeconfigserver ├── rkeworker ├── settings ├── systemaccount ├── systemtemplate ├── telemetry ├── templatecontent ├── ticker ├── tls └── tunnelserver
ファイル | 説明 |
---|---|
agent | Rancher AgentのEntry PointになるMainコードが含まれる |
api | Rancher APIに関するコードが含まれる |
audit | Rancher Auditに関するコードが含まれる |
auth | Rancherの認証に関わるコードが含まれる |
catalog | RancherのCatalog機能に関わるコードが含まれるが、基本的にはControllerから呼び出されるライブラリ |
cert | API Controllerの1つのdynamiclistenerコントローラがRancher API Serverの証明書に関連する操作をする時にメインで利用されるライブラリ |
clustermanager | Rancher Controllerに渡されるCluster管理のオブジェクトを実装しており、該当のオブジェクトから特定のChild ClusterのAPI Clientの初期化、User Controllerの起動できる機能を提供する |
clusterprovisioninglogger | Cluster Provisioning中のKontainer Engineが出力するLogをCluster ObjectのConditionに出力するためのLoggerに関するコード |
clusterrouter | Kubernetes Authentication Proxy API(/k8s/clusters/)のClusterのLookupと実際のProxyのロジックに関するコード |
configfield | Node、Clusterなどの複数のProviderに関するConfigをXXXXConfigのフォーマットで持っているResourceからXXXの部分を抜き出すためのライブラリ |
controllers | Rancher User ControllerとManagement Controllerの実装が含まれる |
dialer | Node Agent、Cluster AgentのWebSocket Session経由のProxy機能を使うためのDialerを提供するロジックが含まれる |
dynamiclistener | Rancher API Serverの起動ロジックと証明書関連の実装が含まれる |
embedded | Embedded Kubernetesの起動ロジックが含まれる |
encryptedstore | Kontainer Engineが利用するClusterのMetadataファイル(c-<cluster id>)、docker-machinegが利用するNodeのMetadataファイル(mc-))を、KubernetesのSecretリソースとして保存するためのClientが含まれる |
filter | 各APIの共通の前処理などをFilterとしてこのPackageに実装、APIの認証ロジックもこのFilterとして実装されている |
httpproxy | /meta/proxy APIのためのProxyロジックが含まれる |
hyperkube | Emebedded Kubernetesを起動するためにhyperkubeを利用しており、そのエントリポイント。このコードは、vendor/k8s.io/kubernetes/cmd/hyperkubeからコピーされてきている |
image | コントローラなどがSystem Imageを参照するとき、Rancher Serverに設定されているRegistryを利用するようにImageのURLを変換するためのロジックが含まれる |
k8scheck | app/app.goでKubernetesが利用可能になるまで処理をブロックするためのロジックが含まれる |
k8slookup | APIリクエストのHTTP HeaderまたはPathからCluster IDを特定し、Clusterオブジェクトを返すためのロジックが含まれる |
k8sproxy | clusterrouterのRouterオブジェクトを初期化し、/k8s/clusters/のKubernetes Authentication ProxyのHTTP Handlerを返すロジックをが含まれる |
kubeconfig | 管理しているKubernetesのkubeconfigを生成して返すAPIのロジックが含まれる |
kubectl | Rancher Serverがkubectlを利用してChild Kubernetesと通信する際のkubectlのラッパーを含む |
librke | Emebedded Kubernetesを起動する際、Node Config API(/v3/connect/config)が呼ばれた際のRKEを呼び出すロジックが含まれる。起動すべきProcess、作成すべきFileを計算するために利用される |
logserver | Rancher Server(main.go)、Rancher Agent(pkg/agent/main.go)の両方で起動され、Unix Socket(/tmp/log.sock)ファイル経由で公開されるAPI ServerでLog Levelを動的に切り替える機能を提供するコードが含まれる |
namespace | NamespaceからProjectIdを取得したり、NamespaceにConditionを設定したりするためのライブラリ |
node | RancherのCRDのNodeのリソースを扱うためのライブラリ |
nodeconfig | docker-machineを利用する際にmetadataをsecretから展開したり、アーカイブしてsecretリソースに保存したりするライブリ。主にnodeコントローラ(pkg/controllers/management/node)から利用される |
pipeline | pipelineコントローラ(pkg/controllers/user/pipeline)から利用されるpipelineに関するライブラリ |
project | デフォルトで作成されるProjectを示す定数のみが定義されている |
randomtoken | RancherのTokenの値をRandomに生成するための関数が定義されている |
rbac | Rancher APIでリソースを返す際に、KubernetesのRolebinding、ClusterRolebindingでカバーできないrbac機能を提供するライブラリ(例:List APIから権限のないリソースを削除するなど) |
ref | リソースから、リソースを特定するためのIDを<Namespace>:<Name>のルールで生成する関数が定義されている |
remotedialer | WebSocket Sessionを管理するロジックが含まれる |
resourcequota | resourcequotaコントローラ(pkg/controllers/user/resourcequota)にメインで利用されるresourcequota関連のライブラリ |
rkecerts | RKEを利用してクラスタを構築した際のCertification関連ファイルに関するライブラリ |
rkedialerfactory | Kontainer-EngineのRKE Driverを利用してクラスタを構築する際に、各Node上のDockerdへのProxyを提供するためのDialer(Rancher Node AgentのWebSocket Sessionを利用) |
rkenodeconfigclient | Rancher Node AgentがNode Config API(/v3/connect/config)を呼び出し、結果を元にrkeworkerを利用して、Containerを起動したり、Fileを作成したりするためのロジックが含まれる |
rkenodeconfigserver | Node Config API(/v3/connect/config)で返すべき、リクエスト元のNodeのあるべき像(動かすべきコンテナ、作成すべきファイル)をlibrkeを利用して、算出するロジックが含まれる |
rkeworker | rkenodeconfigclientがNode Config APIの結果をこのパッケージに渡し、このパッケージが実際にContainerを起動したり、Fileを作成したりする |
settings | Rancher Serverのすべての設定がここで管理されており、すべてのRancher Server内のコードは、このsettingsを通して設定を確認する |
systemaccount | クラスタごとに作成されるSystem Userの作成ロジックが含まれる |
systemtemplate | RancherでKubernetesクラスタを管理するためにChild Kubernetesで動かすべきリソースを定義したKubernetesマニフェストのテンプレートが定義されている |
telemetry | 定期的にRancher Labの管理サーバにUsageを送るためのTelemetry Clientの起動のロジックが含まれる |
templatecontent | TemplateContentのNameから実際のファイルデータを取得するためのライブラリ |
ticker | ContextによるCancel機能付きのTickerを提供するライブラリ |
tls | Rancher Server起動時に初期化するTLSに関する設定のListenConfigリソースを作成するロジックが含まれる |
tunnelserver | WebSocket Sessionの確立要求があった際に、X-API-Tunnel-Params、X-API-Tunnel-Tokenを元に認証やNode、Cluster情報を取得するなどWebSocket Sessionに関するロジックが含まれる |
pkgディレクトリには、Rancherの大部分のロジックが保存されています。main.go、app/app.go、server/server.goなどは、このpkgディレクトリ配下のプログラムを適宜呼び出すことで、初期化や起動を実施しています。
各ディレクトリごとの概要については、上記で書いた通りです。すべてを見ていくことは、ボリューム的に難しいですが、いくつか重要なパッケージとファイルについて、次回以降でもう少し詳しく紹介します。
まとめ
本連載では、rancher/rancherレポジトリ内の各ディレクトリ、ファイルの役割について一通り紹介しました。Rancherを実際に利用されている方は、ここまででもざっくりどういうロジックがどのディレクトリ、ファイルで実装/実現されているか、ある程度イメージがつかめたかと思います。
次回からは、Rancher Agent(pkg/agent)、Rancher API(pkg/api)、Rancher Controller(pkg/controllers)について、もう少し詳細にどのように実装されているか紹介していきます。
連載バックナンバー
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- Rancherコードリーディング入門(2/3)
- Rancherコードリーディング入門(3/3)
- Rancherを構成するソフトウェア
- RancherのCatalog機能を詳細に見てみる
- Rancherのカスタムカタログの作成
- Pulumi Kubernetes Operatorを活用してPulumiのCI/CDを実現しよう
- 「kwok」でKubernetesクラスターをシュミレーションする
- Oracle Cloud Hangout Cafe Season 4 #5「Kubernetesのオートスケーリング」(2021年8月4日開催)
- GitLabを用いた継続的インテグレーション
- サービスメッシュを使ってみよう