はじめに
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でオブジェクトを制御している様を掴むためにも一度は実践してみることおススメします。