[小ネタ]kubectl proxy を使って API サーバーに curl でアクセスしてみる


curl コマンドで Kubernetes の API サーバーへアクセスする際に kubectl proxyを使った時の話をメモします。

環境

kubectl version
Client Version: version.Info{Major:"1", Minor:"16+", GitVersion:"v1.16.6-beta.0", GitCommit:"e7f962ba86f4ce7033828210ca3556393c377bcc", GitTreeState:"clean", BuildDate:"2020-01-15T08:26:26Z", GoVersion:"go1.13.5", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"15+", GitVersion:"v1.15.11-eks-af3caf", GitCommit:"af3caf6136cd355f467083651cc1010a499f59b1", GitTreeState:"clean", BuildDate:"2020-03-27T21:51:36Z", GoVersion:"go1.12.17", Compiler:"gc", Platform:"linux/amd64"}

参考

kubectl proxyオプションの紹介 ~--accept-hosts, --address, --port, --api-prefix, --www, --www-prefix~

Operations

proxy kubectl proxy [--port=PORT] [--www=static-dir] [--www-prefix=prefix] [--api-prefix=prefix] [flags] Run a proxy to the Kubernetes API server.

やってみる

kubectl を実行する場合、kubectl get pods などのコマンドを実行しますが、具体的にどのようなパスがあるか確認したいということがありました。

kubectl を使ってリクエストする場合、~./kube/config などを使って接続先への認証情報の設定を行って HTTP リクエストしている認識です。
curl などで実行する場合、認証情報をすればリクエスト出来る気もしますが面倒そうなので kubectl proxy を使ってプロキシさせて認証情報を設定するようにします。

ではやってみます。
まずは kubectl proxy を実行します。

$kubectl proxy
Starting to serve on 127.0.0.1:8001

上記で 8001 ポートが API サーバーにプロキシされるようになっています。

実際にアクセスしてみます。

$curl http://localhost:8001
{
  "paths": [
    "/api",
    "/api/v1",
    "/apis",
    "/apis/",

Deployments ではどんな verbs があるか見てみます。

$curl http://localhost:8001/apis/apps/v1/ |less

・・・

    {
      "name": "deployments",
      "singularName": "",
      "namespaced": true,
      "kind": "Deployment",
      "verbs": [
        "create",
        "delete",
        "deletecollection",
        "get",
        "list",
        "patch",
        "update",
        "watch"
      ],
      "shortNames": [
        "deploy"
      ],
      "categories": [
        "all"
      ],
      "storageVersionHash": "8aSe+NMegvE="
    },

以下のように実行することで deployments の情報の確認もできます。

{
  "kind": "DeploymentList",
  "apiVersion": "apps/v1",
  "metadata": {
    "selfLink": "/apis/apps/v1/deployments",
    "resourceVersion": "8544893"
  },
  "items": [
    {
      "metadata": {
        "name": "2048-deployment",
        "namespace": "2048-game",
        "selfLink": "/apis/apps/v1/namespaces/2048-game/deployments/2048-deployment",
        "uid": "bec46c02-b046-11ea-847f-06ff6f9a4084",
        "resourceVersion": "5306426",
        "generation": 6,
        "creationTimestamp": "2020-06-17T03:00:48Z",
        "labels": {
          "app": "2048"
        },

kubectl でも同じように情報を取得出来ます。

$kubectl get deployments -A |grep 2048
2048-game     2048-deployment          1/1     1            1           19d