この連載が書籍になりました!『RancherによるKubernetes活用完全ガイド

Rancherコードリーディング入門(1/3)

2019年11月5日(火)
西脇 雄基
今回からは、紙面の都合で「RancherによるKubernetes活用完全ガイド」に掲載されなかったパートをご紹介します。

Rancherのアプリケーションコード

続いて本題であるRancherのアプリケーションコードについて紹介します。

リスト10:Rancherのアプリケーションコードに関するファイルとディレクトリ

.
├── main.go
├── app
├── server
├── k8s
├── pkg

main.go

Rancher Serverのエントリーポイントとなるコードです。コマンドライン引数の処理や、Logレベルの設定、Rancherが利用するKubernetes Clientの初期化など基本的な処理を実施し、その後のMainとなるRancher Serverのロジックの呼び出しをapp/app.goを通して実施します。

app

リスト11: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ディレクトリ内のファイルの説明

ファイル説明
app.gomain.goから呼ばれるRancher Serverの初期化ロジックを含む
authconfig_data.go認証プロバイダを表すauthconfigリソースの初期データの作成
catalog_data.goRancherデフォルトのCatalogリソースの初期データの作成
cluster_data.goRancherを動かすLocal Kubernetesを表すClusterリソースの作成
ensure_admin_user.goAdmin Userリソースの作成
listenconfig_data.goRancher API ServerのListenConfigリソースの作成
machinedriver_data.goNodeDriverリソースの作成
podsecuritypolicytemplate_data.goデフォルトの2種類のPodSecuirytPolicyTemplateリソースの作成
resetpassword.goCLIにReset Passwordの実装
role_data.go初期Roleの作成
rolebuilder.go初期Roleの作成
setting.goSettingリソースに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

リスト12:serverディレクトリ内のファイル

server/
├── capabilities
├── health.go
├── responsewriter
├── server.go
├── ui
└── whitelist

serverディレクトリ内のファイルの説明

ファイル説明
capabilities/meta/gkeXXXX /meta/aksXXXX に関するコード
health.goHealth Checkのための /ping の実装コード
responsewriterHTTP Responseに関するラッパー
server.goRancher APIの初期化と起動のコード
uiRancher UIに関するコード
whitelistRancher 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

リスト13: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

リスト14: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

pkgディレクトリ内のファイルの説明

ファイル説明
agentRancher AgentのEntry PointになるMainコードが含まれる
apiRancher APIに関するコードが含まれる
auditRancher Auditに関するコードが含まれる
auth Rancherの認証に関わるコードが含まれる
catalogRancherのCatalog機能に関わるコードが含まれるが、基本的にはControllerから呼び出されるライブラリ
certAPI Controllerの1つのdynamiclistenerコントローラがRancher API Serverの証明書に関連する操作をする時にメインで利用されるライブラリ
clustermanagerRancher Controllerに渡されるCluster管理のオブジェクトを実装しており、該当のオブジェクトから特定のChild ClusterのAPI Clientの初期化、User Controllerの起動できる機能を提供する
clusterprovisioningloggerCluster Provisioning中のKontainer Engineが出力するLogをCluster ObjectのConditionに出力するためのLoggerに関するコード
clusterrouterKubernetes Authentication Proxy API(/k8s/clusters/)のClusterのLookupと実際のProxyのロジックに関するコード
configfieldNode、Clusterなどの複数のProviderに関するConfigをXXXXConfigのフォーマットで持っているResourceからXXXの部分を抜き出すためのライブラリ
controllersRancher User ControllerとManagement Controllerの実装が含まれる
dialerNode Agent、Cluster AgentのWebSocket Session経由のProxy機能を使うためのDialerを提供するロジックが含まれる
dynamiclistenerRancher API Serverの起動ロジックと証明書関連の実装が含まれる
embeddedEmbedded Kubernetesの起動ロジックが含まれる
encryptedstoreKontainer 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ロジックが含まれる
hyperkubeEmebedded Kubernetesを起動するためにhyperkubeを利用しており、そのエントリポイント。このコードは、vendor/k8s.io/kubernetes/cmd/hyperkubeからコピーされてきている
imageコントローラなどがSystem Imageを参照するとき、Rancher Serverに設定されているRegistryを利用するようにImageのURLを変換するためのロジックが含まれる
k8scheckapp/app.goでKubernetesが利用可能になるまで処理をブロックするためのロジックが含まれる
k8slookupAPIリクエストのHTTP HeaderまたはPathからCluster IDを特定し、Clusterオブジェクトを返すためのロジックが含まれる
k8sproxyclusterrouterのRouterオブジェクトを初期化し、/k8s/clusters/のKubernetes Authentication ProxyのHTTP Handlerを返すロジックをが含まれる
kubeconfig管理しているKubernetesのkubeconfigを生成して返すAPIのロジックが含まれる
kubectlRancher Serverがkubectlを利用してChild Kubernetesと通信する際のkubectlのラッパーを含む
librkeEmebedded Kubernetesを起動する際、Node Config API(/v3/connect/config)が呼ばれた際のRKEを呼び出すロジックが含まれる。起動すべきProcess、作成すべきFileを計算するために利用される
logserverRancher Server(main.go)、Rancher Agent(pkg/agent/main.go)の両方で起動され、Unix Socket(/tmp/log.sock)ファイル経由で公開されるAPI ServerでLog Levelを動的に切り替える機能を提供するコードが含まれる
namespaceNamespaceからProjectIdを取得したり、NamespaceにConditionを設定したりするためのライブラリ
nodeRancherのCRDのNodeのリソースを扱うためのライブラリ
nodeconfigdocker-machineを利用する際にmetadataをsecretから展開したり、アーカイブしてsecretリソースに保存したりするライブリ。主にnodeコントローラ(pkg/controllers/management/node)から利用される
pipelinepipelineコントローラ(pkg/controllers/user/pipeline)から利用されるpipelineに関するライブラリ
projectデフォルトで作成されるProjectを示す定数のみが定義されている
randomtokenRancherのTokenの値をRandomに生成するための関数が定義されている
rbacRancher APIでリソースを返す際に、KubernetesのRolebinding、ClusterRolebindingでカバーできないrbac機能を提供するライブラリ(例:List APIから権限のないリソースを削除するなど)
refリソースから、リソースを特定するためのIDを<Namespace>:<Name>のルールで生成する関数が定義されている
remotedialerWebSocket Sessionを管理するロジックが含まれる
resourcequotaresourcequotaコントローラ(pkg/controllers/user/resourcequota)にメインで利用されるresourcequota関連のライブラリ
rkecertsRKEを利用してクラスタを構築した際のCertification関連ファイルに関するライブラリ
rkedialerfactoryKontainer-EngineのRKE Driverを利用してクラスタを構築する際に、各Node上のDockerdへのProxyを提供するためのDialer(Rancher Node AgentのWebSocket Sessionを利用)
rkenodeconfigclientRancher Node AgentがNode Config API(/v3/connect/config)を呼び出し、結果を元にrkeworkerを利用して、Containerを起動したり、Fileを作成したりするためのロジックが含まれる
rkenodeconfigserverNode Config API(/v3/connect/config)で返すべき、リクエスト元のNodeのあるべき像(動かすべきコンテナ、作成すべきファイル)をlibrkeを利用して、算出するロジックが含まれる
rkeworkerrkenodeconfigclientがNode Config APIの結果をこのパッケージに渡し、このパッケージが実際にContainerを起動したり、Fileを作成したりする
settingsRancher Serverのすべての設定がここで管理されており、すべてのRancher Server内のコードは、このsettingsを通して設定を確認する
systemaccountクラスタごとに作成されるSystem Userの作成ロジックが含まれる
systemtemplateRancherでKubernetesクラスタを管理するためにChild Kubernetesで動かすべきリソースを定義したKubernetesマニフェストのテンプレートが定義されている
telemetry定期的にRancher Labの管理サーバにUsageを送るためのTelemetry Clientの起動のロジックが含まれる
templatecontentTemplateContentのNameから実際のファイルデータを取得するためのライブラリ
tickerContextによるCancel機能付きのTickerを提供するライブラリ
tlsRancher Server起動時に初期化するTLSに関する設定のListenConfigリソースを作成するロジックが含まれる
tunnelserverWebSocket 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)について、もう少し詳細にどのように実装されているか紹介していきます。

LINE株式会社

Verda室 Verdaプラットフォーム開発室 マネージャ兼Senior Software Engineer

LINE株式会社にてOpenStackとManaged Kubernetes Clusterの開発/運営を担当しているVerdaプラットフォーム開発チームリード。大規模なクラスターの開発者およびオペレーターとして3年以上OpenStackに取り組んでいる。2018年からはRancherを利用したManaged Kubernetes Serviceの開発/運用も開始。

現在は両プロジェクトを担当し、安定したプライベートクラウドプラットフォームの提供に務める。

連載バックナンバー

クラウド技術解説
第11回

Rancherコードリーディング入門(3/3)

2020/2/19
前回に続き、紙面の都合で「RancherによるKubernetes活用完全ガイド」に掲載されなかったパートをご紹介します。
クラウド技術解説
第10回

Rancherコードリーディング入門(2/3)

2019/12/25
前回に続き、紙面の都合で「RancherによるKubernetes活用完全ガイド」に掲載されなかったパートをご紹介します。
クラウド技術解説
第9回

Rancherコードリーディング入門(1/3)

2019/11/5
今回からは、紙面の都合で「RancherによるKubernetes活用完全ガイド」に掲載されなかったパートをご紹介します。

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています