🍎

【図解】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