【図解】KubernetesのAPIについて理解する
はじめに
Kubernetesはコンテナを自動で管理するシステムです。
その強力な仕組みを全て動かしているのは、Kubernetes APIになります。
Kubernetesは単なるコンテナ管理システムではなく、「APIを中心に動くシステム」と捉え直すと本質を理解することができます。
Kubernetes APIとは?
Kubernetes APIは、kubernetesクラスターを動かすための唯一の共通言語であり、全ての操作と情報の一元管理を行う「司令塔」です。
Kubernetesを操作する際、私たちは「Podを起動せよ」や「Serviceを公開せよ」といった命令を出します。この命令をKuberntesが理解し、実行するためにルール化されたインターフェースであるKuberntes APIが存在しています。
APIを実行する実体:kube-apiserverとは?
Kubernetes APIを実際に受付処理をしているのは、コントロールプレーンの主要コンポーネントであるkube-apiserver
です。
役割:すべての操作の「フロントエンド」
kube-apiserverは、Kubernetesのすべてのコンポーネントと外部ユーザーからのリクエストが最初に到着する窓口です。
リクエストの受付と認証
kubectlコマンドや各種ツールから送られてきたAPIリクエスト(命令)を最初に受け取ります。そして、そのリクエストが正当なユーザーから来ているか、そのユーザーに実行する権限があるか(認証・認可)を厳しくチェックします。
データストアの仲介
チェックを通過した命令は、クラスターのマスターデータベースであるetcdに記録されます。apiserverは、このetcdへのデータの読み書きを仲介する唯一のコンポーネントです。
APIを通じてやり取りされるリソース
Kubernetesでは、クラスタを構成するあらゆる要素をリソースとしてAPI経由で操作します。
代表的なリソースは以下があります。
- Pod:コンテナの実行単位。最小のデプロイ単位
- Deployment:複数のPodを管理・更新するための仕組み
- Service:Podへのアクセス方法を定義
これらはすべてAPIサーバーに対してCRUD操作することで扱います。
Head | CRUD | Head |
---|---|---|
kubectl get |
Read(読み取り) | リソースの状態取得 |
kubectl apply |
Create/ Update(作成/更新) | リソースの理想の状態を宣言 |
kubectl delete |
Delete(削除) | リソースの削除を命令 |
APIの構造
Kubernetes APIはRESTful APIとして設計されている。
つまり、HTTPリクエストを使ってリソースの作成・取得・更新・削除を行う
基本のエンドポイント構造
KubernetesはAPIエンドポイントは、以下のような形式になっている。
/apis/<APIグループ>/<バージョン>/<リソース>
または一部の基本リソースでは:
/api/v1/<リソース>
例:
- Pod一覧の取得:
GET /api/v1/pods
- ある名前空間のDeployment一覧:
GET /apis/apps/v1/namespaces/default/deployments
kubectlとAPIの関係
kubectlコマンドがAPIを呼び出している仕組み
kubectl
はKubernetesを操作するためのCLIツールだが、実際にはAPIサーバーにHTTPリクエストを送るクライアント。
- 例えば
kubectl get pods
を実行すると、内部的には以下のようなAPI呼び出しを行なっている
GET /api/v1/pods
認証と認可
認証方式(Authentication)
認証とは「アクセスしてきたのは誰か?」を確認する仕組み。Kubernetes APIサーバーは以下の方法で認証を行う。
-
証明書認証(X.509証明書)
- 管理者やkubeletなどクラスタの内部コンポーネントはクライアント証明書を利用
-
~/.kube/config
内に埋め込まれている証明書を kubectl が使用
-
ベアラートークン
- ServiceAccountに関連づけられたトークンを利用し、PodやアプリケーションからAPIにアクセス
-
OIDC(OpenID Connect)
- Google、Azure AD、Keycloakなど外部IdPと連携し、シングルサインオンを実現
これらを組み合わせて「クラスタ外の人間」「クラスタ内のPod」「外部サービス」など、様々なクライアントを認証する。
RBACによる権限制御(Authorization)
認証で「誰か」が分かったら、次は「その人が何をできるか?」を制御。これが認可
Kubernetesでは主にRBAC(Role-Based Access Control)を使う。
-
Role/ClusterRole
- Roleは特定のネームスペース内の権限を定義
- ClusterRoleはクラスタ全体で有効な権限を定義
-
RoleBinding/ClusterRoleBinding
- ユーザーやServiceAccountをRoleに紐付ける
まとめ
- Kubernetes = すべての操作はAPIで実行
- kube-apiserver = APIを実行するコンポーネント
- APIは REST構造で、PodやDeploymentなどのリソースをCRUD操作可能
- kubectl はAPIクライアントであり、認証・認可やRBACを通じて安全にリソースを管理
Discussion