📝
Kubernetesクラスターにcurlコマンドのpodを立てるときに実行するコマンドを理解する
やりたいこと
調査のためkubernetesクラスタでcurlを実行したい。
(調査対象のコンテナのimageにはcurlは含まれていない環境)
方法
コンテナ環境では他のpodを汚さないよう、調査用に別のpodを作成してその中で実行することが推奨される。
(それ以外の方法としては、Dockerfileに実行したいコマンドを組み込んでコンテナを生成する)
※ 本記事内では1pod 1コンテナの環境を想定しているため、pod=コンテナ と読み替え可能
そこで 以下のコマンドでcurlを含むDocker imageを使ってpodを作成し、そのpodのシェルにログインして、そのpod内でcurlを実行する。
作業後にpodからexitすると、podは自動的に削除される。
$ kubectl run curl --image=curlimages/curl --namespace my-namespace -it --rm -- sh
/ $ curl https://~~
curlに限らず、kubectl run {name} --image={使いたいコマンドユーティリティを含むimageのパス}
でpodを作成し、そのpod内でコマンドを実行すればよい。
コマンド読解
(各オプションの意味を理解したうえで実行したいよね)
kubectl runはpodに特定のimageを作成し、実行(run)するコマンド。
kubectl run コマンドの完全な書式:
$ kubectl run NAME --image=image [--env="key=value"] [--port=port] [--dry-run=server|client] [--overrides=inline-json] [--command] -- [COMMAND] [args...]
今回のコマンドはこれ
$ kubectl run {name} --{image-path} --namespace {namespace} -it --rm -- {command(shell)}
これは3つのパーツに分けて考えることができる。
- kubernetesが{image-path}からimageをpullし、{namespace}内に{name}という名前でコンテナを作成して起動
kubectl run {name} --{image-path} --namespace {namespace}
curlを含むimageを提供しているパスとしては、curlimages/curl
の他にredhat/ubi8
などがある。自作のimageを指定してもOK。
- 作成したコンテナのshellに接続し、現在のコンソールの標準入力をコンテナの標準入力として渡す
-it -- {command(shell)}
- このpodが終了した時点で(= exitしたら)podを削除する
--rm
オプション表
オプション | 意味 |
---|---|
--image | コンテナのimageを指定 |
--namespace | Namespaceを指定 (指定しない場合はdefault namespaceにpodが作成される) |
-i --stdin |
コンテナへstdin(標準入力)を渡す |
-t --tty |
stdinをtty(コンソール入力)にする -i (--stdin)と併用で指定したコンテナのシェルにログインする |
--rm | podが終了した時点でpodを削除する -i (--stdin)と併用する |
参考
- How to run curl in Kubernetes (for troubleshooting)
- Command Reference: kubectl run
誤りがあれば(優しく)教えてくださいませ!🧙♂️
Discussion