📝

Kubernetesクラスターにcurlコマンドのpodを立てるときに実行するコマンドを理解する

2022/06/08に公開

やりたいこと

調査のため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つのパーツに分けて考えることができる。

  1. kubernetesが{image-path}からimageをpullし、{namespace}内に{name}という名前でコンテナを作成して起動
    kubectl run {name} --{image-path} --namespace {namespace}
    curlを含むimageを提供しているパスとしては、curlimages/curlの他にredhat/ubi8などがある。自作のimageを指定してもOK。
  1. 作成したコンテナのshellに接続し、現在のコンソールの標準入力をコンテナの標準入力として渡す
    -it -- {command(shell)}
  2. この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)と併用する

参考


誤りがあれば(優しく)教えてくださいませ!🧙‍♂️

Discussion