(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【Kubernetes】Proxy経由にてcurlコマンドでAPIサーバと通信する

スポンサーリンク

はじめに

Kubernetesではkubectlコマンドを利用してマスターノードのAPIサーバと通信を行いますが、今回はkubectlコマンドではなくcurlコマンドで直接deploymentの削除であるkubectl delete deploymentに相当するリクエストを行ってみます。

コマンド実行環境
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"15",...

事前準備

以下コマンドでnginx-depという名称のデプロイメントを作成します。

$ kubectl create deployment nginx-dep --image=nginx

このデプロイメントに対して以下コマンドを行えば本デプロイメントを作成できるyamlファイルが作成できるので

$ kubectl get deployment nginx-dep -o yaml --export > nginx-dep.yaml

以下コマンドで削除が可能になります。

$ kubectl delete -f nginx-dep.yaml
deployment.extensions "nginx-dep" delete

起動も同様です。

kubectl deleteで行われていることを確認

kubectlコマンドではオプションとして--v=数値を付与することでコマンドの詳細が確認できます。
例えば数値を6にすると以下のようにkubectl deleteの

$ sudo kubectl delete -f nginx-dep.yaml --v=6
I0627     4109 loader.go:359] Config loaded from file:  /home/xx/.kube/config
I0627     4109 round_trippers.go:438] DELETE https://10.0.0.1:6443/apis/extensions/v1beta1/namespaces/default/deployments/nginx-dep 200 OK in 14 milliseconds
deployment.extensions "nginx-dep" deleted
I0627     4109 round_trippers.go:438] GET https://10.0.0.1:6443/apis/extensions/v1beta1/namespaces/default/deployments?fieldSelector=metadata.name%3Dnginx-dep 200 OK in 11 milliseconds

ここで10.0.0.1はmasterノードのIPアドレスです。

これを見れば分かるようにDeleteコマンドの詳細は以下の通信です。今回はこれをcurlで行います。

DELETE https://10.0.0.1:6443/apis/extensions/v1beta1/namespaces/default/deployments/nginx-dep

kube-proxyを起動

APIサーバとの通信はAPIサーバとの認証をクリアする必要があるので直接上記のURLを叩くと以下のエラーとなります。

$ curl -X DELETE https://10.0.0.1:6443/apis/extensions/v1beta1/namespaces/default/deployments/nginx-dep
curl: (60) SSL certificate problem: unable to get local issuer certificate

よって今回は認証を突破するためにkube-proxyを立ち上げ、kube-proxy経由でAPIサーバと通信することにします。

以下コマンドでバッググラウンドでプロキシサーバが起動するので

$ kubectl proxy --port=8080 &
[1] 13625
$ Starting to serve on 127.0.0.1:8080
bg
-bash: bg: job 1 already in background

先ほどの

https://10.0.0.1:6443

http://localhost:8080

に置き換えてcurlコマンドを打てば認証をクリアできまs。

curlコマンドでDeploymentをDeleteする

デプロイメントが起動している状態で以下のcurlコマンドを押下すれば

$ sudo curl -X DELETE http://localhost:8080/apis/apps/v1/namespaces/default/deployments/nginx-dep

標準出力に以下が返ってきます。成功しています。

{
  "kind": "Status",
  "apiVersion": "v1",
  "metadata": {

  },
  "status": "Success",
  "details": {
    "name": "nginx-dep",
    "group": "apps",
    "kind": "deployments",
    "uid": "086bc1a3-cd68-4fb5-99bf-2f16090388d3"
  }
}

正しくデプロイメントを終了させることができました。尚、APIバージョンはbetaではなくstableを利用しています。

$ kubectl get deployment
No resources found.

終わりに

KubernetesのAPIサーバを直接curlコマンドで叩いてみました。
kubectlを利用せずにAPIサーバと通信する状況はないとは思いつつも、POST&DELETEでオブジェクトを制御している様を掴むためにも一度は実践してみることおススメします。