kubernetesのAPIサーバーを利用する

APIリクエストデータの調べ方

kubernetesを操作する具体的なAPIを調べるには、kubectlで操作してみて対応するリクエストデータを見る方法が便利です。kubernetsを操作するkubectlコマンドはREST APIのラッパーになっています。

kubectlの各コマンドを実行する際にkubectl --v=8 get podsのように–v=8オプションをつけることで、REST APIレベルでリクエスト/レスポンス情報を確認できます。

KubernetesのコンテナからAPI serverを利用する

Kubernetesの各podからAPIサーバーを利用できます。APIサーバーはBasic認証で保護されているため、リクエスト時にクレデンシャル情報を付加する必要があります。

Basic認証のuser名とpassword文字列は、Google Container Engine(GKE)を利用していてkubectlがセットアップされている環境を前提とすると、kubectlアクセス用のアカウント情報は~/.kube/configのうちuserエントリに記載されています。

wget --http-user=username --http-password=passwordcurl -u "username:password"といったオプションで指定できます。

HTTPヘッダー文字列を直接送出したい場合は、kubectl –v=8で出力されるエンコード済みの”Authorization: Basic (some-encoded-token)”の文字列で認証できます。

また、kubectl用のアカウントとは別に、各podにはservice accountというアカウント情報があり、pod内の/var/run/secrets/kubernetes.io/serviceaccount/ディレクトリにca.crt(SSL接続の検証用証明書)とtoken(Bearer形式の認証用トークン)があります。

これを用いて、curl -v --cacert /var/run/secrets/kubernetes.io/serviceaccount/ca.crt -H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" https://kubernetes/のようにアクセスすることも可能です。(出典: How do I access the Kubernetes api from within a pod container? / Stackoverflow)

各コンテナからの接続先は、kubernetesがコンテナにセットする環境変数KUBERNETES_SERVICE_HOST(IPアドレス)とKUBERNETES_SERVICE_PORT(ポート番号)です。

podにbashログインしてsetコマンドで確認できます。

GKEの環境では、コンテナからプライベートネットワーク経由でAPIサーバーに接続できます。

kubectlが使える以上、外部環境からも接続は可能ではあります。

kubernetesのAPIサーバーは独自の証明書を用いているため、SSL接続時の検証には先ほどの/var/run/secrets/kubernetes.io/serviceaccount/ca.crtをpodからダウンロードして接続時のオプションで指定する必要があります。

セキュリティ上の懸念があるため、独自クライアントによるAPIの利用はプライベートネットワーク経由に限定した方が安全と考えられます。

中馬崇尋
Chuma Takahiro