k3s-io/kine(Kubernetes用のetcd互換ストア)は、PostgreSQL上に**kine
**という単一のテーブルを作成し、Kubernetesのデータを保存します (kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub)。以下、このテーブルの詳細なスキーマを示します。
テーブル名
-
テーブル名:
kine
(存在しない場合に作成される) (kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub)
※kineは起動時にこのテーブルの存在を確認し、無ければCREATE TABLE IF NOT EXISTS kine (...)
で作成します。
カラム名とデータ型
kine
テーブルには以下のカラムが存在します。それぞれのカラム名とデータ型は次のとおりです(必要に応じて簡単な説明を付記します)。
-
id –
BIGSERIAL
型(64ビット整数の自動インクリメント)。主キーとして設定されています (kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub)。 -
name –
TEXT
型(照合順序 "C" を指定) (kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub)。Kubernetesオブジェクトのキー名を保持します。照合順序"C"はプレフィックス検索などでインデックスを効率的に利用するために設定されています (kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub)。 -
created –
INTEGER
型 (kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub)。エントリの作成時刻や作成バージョンを表す値です(32ビット整数)。 -
deleted –
INTEGER
型 (kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub)。エントリの削除フラグや削除時刻を表す値です(0/1フラグやタイムスタンプとして使用)。 -
create_revision –
BIGINT
型(64ビット整数) (kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub)。エントリが初めて作成された際のリビジョン番号(Kubernetesリソースバージョンに相当)を保持します。 -
prev_revision –
BIGINT
型 (kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub)。このエントリが上書きした直前のリビジョン番号を保持します(前の履歴エントリへの参照)。 -
lease –
INTEGER
型 (kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub)。エントリに関連付けられたLease ID(TTLがある場合)を保持します。 -
value –
BYTEA
型(バイナリデータ) (kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub)。エンコードされた実際の値(オブジェクトの内容)をバイナリ形式で保存します。 -
old_value –
BYTEA
型(バイナリデータ) (kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub)。更新前の古い値をバイナリ形式で保持します(必要に応じて比較や監査に利用)。
※上記のうちid
カラムにはPRIMARY KEY
制約が付与されています(BIGSERIALには暗黙的にシーケンスkine_id_seq
が作成され、自動採番されます) (kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub)。
インデックスおよび制約
kineテーブルでは、パフォーマンスと一意性を確保するために複数のインデックスと制約が定義されています。
-
主キー (Primary Key):
id
カラムに主キー制約(PRIMARY KEY)が設定されています (kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub)。これによりid
は一意かつNULL不可となり、テーブル内で各行を一意に識別します。 -
一意インデックス:
name
とprev_revision
の複合に対してユニークインデックスが張られています (kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub)。これにより、同じname
を持つエントリが同一のprev_revision
(前履歴)を重複して持つことがないよう保証しています。 -
インデックス (name):
name
カラム単体に対するインデックスが作成されています (kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub)。name
での検索(プレフィックス一致を含む)を高速化します。 -
インデックス (name, id):
name
とid
の複合インデックスがあります (kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub)。主にname
で絞り込んだ上でid
(リソースバージョン相当)順に並べ替えるようなクエリに利用されます。 -
インデックス (id, deleted):
id
とdeleted
の複合インデックスがあります (kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub)。特定のid
範囲で削除済みでないエントリを効率よく取得するためのものです。 -
インデックス (prev_revision):
prev_revision
カラムに対するインデックスがあります (kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub)。あるリビジョンを直前のリビジョンに持つエントリの検索を高速化します。 -
インデックス (name, id DESC, deleted):
name
、id (降順)
、およびdeleted
の複合インデックスが追加されています (kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub)。これは各name
ごとに最新の(最大の)id
を持つエントリを効率的に取得する用途に最適化されたインデックスです(クエリ内でORDER BY name, id DESC
を用いた「最新の状態」の取得を高速化) (kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub)。
以上のインデックス構成により、KineはPostgreSQL上でのKubernetesデータの読み書きを高速化しています。
スキーママイグレーション(変更履歴)
Kineではバージョンアップに伴いスキーマ変更が行われた経緯があります。公式ドキュメントのK3sリリースノートによれば、Kine v0.13.0でPostgreSQL使用時のパフォーマンス改善のためスキーマが更新されています (v1.32.X | K3s)。新規にデータベースを作成する場合は自動で新スキーマが適用され、既存データベースについては環境変数KINE_SCHEMA_MIGRATION=2
を指定して起動することでスキーマ変更を適用できます (v1.32.X | K3s)。
具体的な変更点として、Kineのソースコード中のマイグレーション定義では次のようなスキーマ変更が含まれています。
-
整数型の拡張:
id
,create_revision
,prev_revision
の各カラムをBIGINT型に変更する(以前のバージョンでは小さめの整数型だった可能性があります) (kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub)。これにより非常に大きなリビジョン番号にも対応でき、リソースバージョンがオーバーフローしないようになっています。 (kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub) -
文字列比較の最適化:
name
カラムのデータ型に対し照合順序"C"
を適用する変更 (kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub)。これによりname
に対するLIKE
や比較クエリでインデックスが効きやすくなり、PostgreSQL上でのパフォーマンスが向上します(照合順序を"C"にすることでバイナリ比較となり、インデックス利用が可能になるため) (kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub)。
これらの変更はKine内部のマイグレーション機構によって管理されており、新しいスキーマ定義(前述のカラム定義・インデックス定義)は常に最新バージョン用にコード内で定義されています (kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub)。そのため、新規インストール時には最新スキーマでテーブルが作られ、既存インストールのアップグレード時には必要に応じて上記マイグレーションが実行される形になっています。
参考資料: 公式ドキュメントやソースコードでは上記のようなスキーマが確認できます (kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub) (kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub) (kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub)。特にKineのソースコード(GitHub上のkine/pkg/drivers/pgsql/pgsql.go
)にテーブル作成DDLとインデックス定義が記載されており、これが信頼できるスキーマ情報となります (kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub) (kine/pkg/drivers/pgsql/pgsql.go at master · k3s-io/kine · GitHub)。また、K3sリリースノートにもスキーマ変更に関する言及があります (v1.32.X | K3s)。