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=password
やcurl -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