クラスターへのアクセス

このセクションでは、クラスターとやり取りするための複数の方法について説明します。

kubectlで初めてアクセスする

Kubernetes APIに初めてアクセスする際は、Kubernetes CLIのkubectlを使用することをおすすめします。

クラスターにアクセスするには、クラスターの接続先とアクセス用の認証情報が必要です。 通常、入門ガイドに従って進めると、自動的にセットアップされます。 または、他の誰かがクラスターをセットアップ済みで、認証情報と接続先が提供されている場合もあります。

以下のコマンドで、kubectlが認識している接続先と認証情報を確認してください:

kubectl config view

多くのkubectlの基本的な使い方を紹介しており、完全なドキュメントはkubectlリファレンスで確認できます。

REST APIに直接アクセスする

kubectlは、APIサーバーの接続先を特定し、認証処理を行います。 curlやwget、ブラウザーなどのHTTPクライアントでREST APIに直接アクセスしたい場合、接続先を特定して認証する方法がいくつかあります:

  • kubectlをプロキシモードで実行する。
    • 推奨される方法です。
    • 保存済みのAPIサーバーの接続先を使用します。
    • 自己署名証明書を使用して、APIサーバーの身元を検証します。MITM攻撃は不可能です。
    • APIサーバーに対して認証を行います。
    • 将来的には、クライアント側で高度な負荷分散やフェイルオーバーを行う可能性があります。
  • HTTPクライアントに接続先と認証情報を直接提供する。
    • 代替の方法です。
    • プロキシを使用すると正しく動作しない一部のクライアントコードでも動作します。
    • MITM攻撃を防ぐために、ルート証明書をブラウザーにインポートする必要があります。

kubectl proxyの使用

以下のコマンドを実行すると、kubectlがリバースプロキシとして機能するモードで動作します。 APIサーバーの接続先の特定と認証を処理します。 以下のように実行します:

kubectl proxy --port=8080

詳細については、kubectl proxyを参照してください。

その後、curl、wget、またはブラウザーでAPIにアクセスできます。 IPv6の場合は、localhostを[::1]に置き換えてください:

curl http://localhost:8080/api/

出力は以下のようになります:

{
  "kind": "APIVersions",
  "versions": [
    "v1"
  ],
  "serverAddressByClientCIDRs": [
    {
      "clientCIDR": "0.0.0.0/0",
      "serverAddress": "10.0.1.149:443"
    }
  ]
}

kubectl proxyを使用しない場合

kubectl applykubectl describe secret...を使用して、デフォルトのサービスアカウント用のトークンをgrep/cutで作成します:

まず、デフォルトのServiceAccount用のトークンを要求するSecretを作成します:

kubectl apply -f - <<EOF
apiVersion: v1
kind: Secret
metadata:
  name: default-token
  annotations:
    kubernetes.io/service-account.name: default
type: kubernetes.io/service-account-token
EOF

次に、トークンコントローラーがSecretにトークンを設定するまで待ちます:

while ! kubectl describe secret default-token | grep -E '^token' >/dev/null; do
  echo "waiting for token..." >&2
  sleep 1
done

生成されたトークンを取得して、使用します:

APISERVER=$(kubectl config view --minify | grep server | cut -f 2- -d ":" | tr -d " ")
TOKEN=$(kubectl describe secret default-token | grep -E '^token' | cut -f2 -d':' | tr -d " ")

curl $APISERVER/api --header "Authorization: Bearer $TOKEN" --insecure

出力は以下のようになります:

{
  "kind": "APIVersions",
  "versions": [
    "v1"
  ],
  "serverAddressByClientCIDRs": [
    {
      "clientCIDR": "0.0.0.0/0",
      "serverAddress": "10.0.1.149:443"
    }
  ]
}

jsonpathを使用する場合:

APISERVER=$(kubectl config view --minify -o jsonpath='{.clusters[0].cluster.server}')
TOKEN=$(kubectl get secret default-token -o jsonpath='{.data.token}' | base64 --decode)

curl $APISERVER/api --header "Authorization: Bearer $TOKEN" --insecure

出力は以下のようになります:

{
  "kind": "APIVersions",
  "versions": [
    "v1"
  ],
  "serverAddressByClientCIDRs": [
    {
      "clientCIDR": "0.0.0.0/0",
      "serverAddress": "10.0.1.149:443"
    }
  ]
}

上記の例では、--insecureフラグを使用しているため、MITM攻撃を受ける可能性があります。 kubectlがクラスターにアクセスする際は、保存済みのルート証明書とクライアント証明書を使用してサーバーにアクセスします(これらは、~/.kubeディレクトリにインストールされています)。 通常、クラスター証明書は自己署名されているため、HTTPクライアントでルート証明書を使用するには、特別な設定が必要になる場合があります。

一部のクラスターでは、APIサーバーが認証を必要としない場合があります。 localhostで提供されていたり、ファイアウォールで保護されている場合などです。 このような、認証を必要としない構成を行うための標準的な方法はありません。 クラスター管理者がアクセス制御を設定する方法については、APIへのアクセスコントロールを参照してください。

プログラムによるAPIアクセス

Kubernetesは、GoPythonのクライアントライブラリを公式にサポートしています。

Goクライアント

  • ライブラリを取得するには、次のコマンドを実行します: go get k8s.io/client-go@kubernetes-<kubernetes-version-number>。 詳細なインストール手順については、INSTALL.mdを参照してください。 サポートされているバージョンについては、https://github.com/kubernetes/client-goを参照してください。
  • client-goクライアントを使用してアプリケーションを作成します。 client-goは独自のAPIオブジェクトを定義しているため、必要に応じて、メインリポジトリではなくclient-goからAPI定義をインポートしてください。 例: import "k8s.io/client-go/kubernetes"が正しい形です。

Goクライアントは、kubectl CLIと同じkubeconfigファイルを使用して、APIサーバーの接続先の特定と認証を行うことができます。 こちらのを参照してください。

クラスター内で、アプリケーションがPodとしてデプロイされている場合は、次のセクションを参照してください。

Pythonクライアント

Pythonクライアントを使用するには、次のコマンドを実行します: pip install kubernetes。 その他のインストールオプションについては、Pythonクライアントライブラリページを参照してください。

Pythonクライアントは、kubectl CLIと同じkubeconfigファイルを使用して、APIサーバーの接続先の特定と認証を行うことができます。 こちらのを参照してください。

その他の言語

その他の言語でAPIにアクセスするためのクライアントライブラリもあります。 認証方法については、各ライブラリのドキュメントを参照してください。

PodからAPIにアクセスする

PodからAPIにアクセスする場合、APIサーバーの接続先の特定と認証は多少異なります。

詳細については、PodからAPIにアクセスするを参照してください。

クラスター上で実行されているサービスにアクセスする

前のセクションでは、Kubernetes APIサーバーへの接続方法について説明しました。 Kubernetesクラスター上で実行されている他のサービスへの接続については、クラスターサービスへのアクセスを参照してください。

リダイレクトのリクエスト

リダイレクト機能は非推奨となり、削除されました。 代わりに、プロキシを使用してください(以下を参照)。

様々なプロキシ

Kubernetesを使用する際に見かける可能性のあるプロキシがいくつかあります:

  1. kubectl proxy:

    • ユーザーのデスクトップまたはPod内で実行されます
    • localhostアドレスからKubernetes APIサーバーへプロキシします
    • クライアントからプロキシへの通信では、HTTPを使用します
    • プロキシからAPIサーバーへの通信では、HTTPSを使用します
    • APIサーバーの接続先を特定します
    • 認証ヘッダーを追加します
  2. APIサーバープロキシ:

    • APIサーバーに組み込まれた踏み台サーバーです
    • クラスター外のユーザーを、通常では到達できないクラスターIPに接続します
    • APIサーバーのプロセス内で実行されます
    • クライアントからプロキシへの通信では、HTTPS(または、APIサーバーがHTTPを使うように設定されている場合はHTTP)を使用します
    • プロキシからターゲットへの通信では、利用可能な情報に基づいてプロキシが選択したHTTPまたはHTTPSを使用します
    • ノード、Pod、またはServiceへのアクセスに使用できます
    • Serviceにアクセスする際に負荷分散を行います
  3. kube proxy:

    • 各ノード上で実行されます
    • UDPとTCPをプロキシします
    • HTTPを解釈しません
    • 負荷分散を提供します
    • Serviceへのアクセスにのみ使用されます
  4. APIサーバー前段のプロキシ/ロードバランサー:

    • クラスターによって、存在の有無や実装方法が異なります(例: nginx)
    • すべてのクライアントと1つ以上のAPIサーバーの間に位置します
    • 複数のAPIサーバーがある場合、ロードバランサーとして機能します
  5. 外部サービスのクラウドロードバランサー:

    • 一部のクラウドプロバイダーによって提供されます(例: AWS ELB、Google Cloud Load Balancer)
    • KubernetesサービスのタイプがLoadBalancerの場合、自動的に作成されます
    • UDP/TCPのみを使用します
    • クラウドプロバイダーによって実装が異なります

Kubernetesユーザーは通常、最初の2つのタイプ以外について気にする必要はありません。 残りのタイプは、通常は、クラスター管理者によって適切に設定されます。