|
| 1 | +--- |
| 2 | +title: PodからKubernetes APIにアクセスする |
| 3 | +content_type: task |
| 4 | +weight: 120 |
| 5 | +--- |
| 6 | + |
| 7 | +<!-- overview --> |
| 8 | + |
| 9 | +このガイドでは、Pod内からKubernetes APIにアクセスする方法を示します。 |
| 10 | + |
| 11 | +## {{% heading "prerequisites" %}} |
| 12 | + |
| 13 | +{{< include "task-tutorial-prereqs.md" >}} |
| 14 | + |
| 15 | +<!-- steps --> |
| 16 | + |
| 17 | +## Pod内からAPIへのアクセス |
| 18 | + |
| 19 | +Podの中からAPIにアクセスする時、APIサーバーの場所の検出と認証は、外部クライアントの場合とは若干異なります。 |
| 20 | + |
| 21 | +PodからKubernetes APIを使用する最も簡単な方法は、公式の[クライアントライブラリ](/docs/reference/using-api/client-libraries/)を使用することです。 |
| 22 | +これらのライブラリは自動的にAPIサーバーを検出して認証できます。 |
| 23 | + |
| 24 | +### 公式クライアントライブラリの使用 |
| 25 | + |
| 26 | +Podの中からKubernetes APIに接続する推奨された方法として次のものがあります: |
| 27 | + |
| 28 | +- Goクライアントの場合、公式の[Goクライアントライブラリ](https://github.com/kubernetes/client-go/)を使用します。 |
| 29 | + `rest.InClusterConfig()`関数はAPIホストの探索と認証を自動的に処理します。 |
| 30 | + [ここにあるサンプル](https://git.k8s.io/client-go/examples/in-cluster-client-configuration/main.go)を参照してください。 |
| 31 | + |
| 32 | +- Pythonクライアントの場合、公式の[Pythonクライアントライブラリ](https://github.com/kubernetes-client/python/)を使用します。 |
| 33 | + `config.load_incluster_config()`関数はAPIホストの探索と認証を自動的に処理します。 |
| 34 | + [ここにあるサンプル](https://github.com/kubernetes-client/python/blob/master/examples/in_cluster_config.py)を参照してください。 |
| 35 | + |
| 36 | +- 他にも多くのライブラリが利用できます。 |
| 37 | + [クライアントライブラリ](/docs/reference/using-api/client-libraries/)のページを参照してください。 |
| 38 | + |
| 39 | +いずれの場合も、APIサーバーと安全に通信するために、Podのサービスアカウントの資格情報が使用されます。 |
| 40 | + |
| 41 | +### REST APIによる直接アクセス |
| 42 | + |
| 43 | +コンテナは、Pod内での実行中に環境変数`KUBERNETES_SERVICE_HOST`と`KUBERNETES_SERVICE_PORT_HTTPS`を取得することで、Kubernetes APIサーバーのHTTPSのURLを作成することができます。 |
| 44 | +APIサーバーのクラスター内アドレスは、PodがローカルAPIサーバーのDNS名として`kubernetes.default.svc`を参照できるように、`default` Namespaceの`kubernetes`という名前のServiceにも公開されます。 |
| 45 | + |
| 46 | +{{< note >}} |
| 47 | +Kubernetesは、APIサーバーがホスト名`kubernetes.default.svc`に対する有効な証明書を持っていることを保証しません。 |
| 48 | +しかし、コントロールプレーンは`$KUBERNETES_SERVICE_HOST`によって表されるホスト名またはIPアドレスに対する有効な証明書を提示することが期待**されます**。 |
| 49 | +{{< /note >}} |
| 50 | + |
| 51 | +APIサーバーに対して認証を行う推奨された方法は、[サービスアカウント](/docs/tasks/configure-pod-container/configure-service-account/)の資格情報を使用することです。 |
| 52 | +既定では、Podはサービスアカウントと関連づけられており、そのサービスアカウントに対する資格情報(トークン)が、そのPod内の各コンテナのファイルシステムツリーの`/var/run/secrets/kubernetes.io/serviceaccount/token`内に配置されます。 |
| 53 | + |
| 54 | +利用可能であれば、証明書バンドルが各コンテナのファイルシステムツリーの`/var/run/secrets/kubernetes.io/serviceaccount/ca.crt`に配置され、APIサーバーが提供する証明書を検証するために使用されます。 |
| 55 | + |
| 56 | +最後に、NamespaceスコープのAPIの操作に対して使用される既定のNamespaceは、各コンテナの`/var/run/secrets/kubernetes.io/serviceaccount/namespace`にあるファイルに記載されます。 |
| 57 | + |
| 58 | +### kubectl proxyの使用 |
| 59 | + |
| 60 | +公式のクライアントライブラリを使用せずにAPIを呼び出したい場合は、Pod内の新しいサイドカーコンテナの[コマンド](/docs/tasks/inject-data-application/define-command-argument-container/)として`kubectl proxy`を実行することができます。 |
| 61 | +こうすることで、`kubectl proxy`がAPIを認証してPodの`localhost`インターフェースに公開するため、Pod内の他のコンテナが直接使用することができます。 |
| 62 | + |
| 63 | +### プロキシを使用しない方法 |
| 64 | + |
| 65 | +認証トークンを直接APIサーバーに渡すことで、kubectl proxyの使用を避けることも可能です。 |
| 66 | +内部の証明書によって接続を保護します。 |
| 67 | + |
| 68 | +```shell |
| 69 | +# 内部のAPIサーバーのホスト名の指定 |
| 70 | +APISERVER=https://kubernetes.default.svc |
| 71 | + |
| 72 | +# ServiceAccountトークンのパス |
| 73 | +SERVICEACCOUNT=/var/run/secrets/kubernetes.io/serviceaccount |
| 74 | + |
| 75 | +# PodのNamespaceの読み込み |
| 76 | +NAMESPACE=$(cat ${SERVICEACCOUNT}/namespace) |
| 77 | + |
| 78 | +# ServiceAccountのBearerトークンを取得 |
| 79 | +TOKEN=$(cat ${SERVICEACCOUNT}/token) |
| 80 | + |
| 81 | +# 内部の認証局(CA)の参照 |
| 82 | +CACERT=${SERVICEACCOUNT}/ca.crt |
| 83 | + |
| 84 | +# トークンを用いてAPIの探索 |
| 85 | +curl --cacert ${CACERT} --header "Authorization: Bearer ${TOKEN}" -X GET ${APISERVER}/api |
| 86 | +``` |
| 87 | + |
| 88 | +次のような出力になります: |
| 89 | + |
| 90 | +```json |
| 91 | +{ |
| 92 | + "kind": "APIVersions", |
| 93 | + "versions": ["v1"], |
| 94 | + "serverAddressByClientCIDRs": [ |
| 95 | + { |
| 96 | + "clientCIDR": "0.0.0.0/0", |
| 97 | + "serverAddress": "10.0.1.149:443" |
| 98 | + } |
| 99 | + ] |
| 100 | +} |
| 101 | +``` |
0 commit comments