kubernetesはじめました ~ kubectl runについて ~

最近kubernetesを始めました。
なかなか手が出ないでいましたが、いざ使ってみると様々な機能があり
非常に強力ですね。

kubernetesを試す中で「docker run」みたいにちょっと起動して、
どんなものか試すために「kubectl run」を利用したのですが、
オプションが色々あり調べたのでまとめました。

# kubectl run について

「kubectl run --help」でオプションを見ると色々ありますね。
その中で使ったものを整理してみました。

利用した環境は以下です

|パッケージ|バージョン|
|:---:|:---:|
|docker-ce|18.06.1-ce|
|kubernetes群|v1.12.2

## kindに関するオプション

「kubectl run」はオプションなしの場合には deployment としてリソースが作成される
オプションを付けることでkindを変えることができる

| kind | オプション |
|:---:|:---:|
|deployment|なし|
|pod|--restart=Never|
|job|--restart=OnFailure|
|cronjob|--schedule='cron format(0/5 * * * ? など)'|


## コンテナイメージに関するオプション

```
--image=イメージ名
```

「--image=イメージ名」で起動するイメージを指定(必須オプション)

```
--image-pull-policy=Always(default)|IfNotPresent|Never
```

「--image=」で指定したコンテナイメージは、dockerレジストリに問い合わせを行うため、
imageの更新をしない場合や、ローカルのコンテナイメージを使用する場合は
「--image-pull-policy=IfNotPresent|Never」を利用する。

「image-pull-policy=」に指定できる項目と内容は以下。

|image-pull-policy|内容|
|:---:|:---:|
|Always|デフォルト値<br />常にレジストリに問い合わせを行う|
|IfNotPresent|存在しない場合は問い合わせを行う、<br />存在する場合は取得済み(ローカル)のコンテナイメージを利用する|
|Never|取得済み(ローカル)のコンテナイメージを利用する|

## 実行に関するオプション

```
--env="key=value"
```

「--env="key=value"」を指定することで起動するリソースの環境変数を指定することができる
複数指定する場合は「--env="key1=value1" --env="key2=value2"」のように複数並べる

```
--command -- 起動コマンドと引数
```

起動コマンドを変更する場合は「--command -- 起動コマンドと引数」を利用する

```
-- 引数
```

起動コマンドは変更しないけど、引数は変更したい場合は「-- 引数」を利用する

```
-ti (-t -i)
```

起動したリソースに接続する場合は「-ti」を利用する

```
--port ポート番号
```

外部にポート番号を公開する場合は「--port ポート番号」を指定する

## 確認/色々変える場合のオプション

```
-o json( or yaml) --dry-run
```

他のコマンドでもありますが、
「-o json( or yaml) --dry-run」を指定すると、
実際にはリソースの作成は行わず、作成されるリソースのマニュフェストが確認できる

```
--overrides='{jsonで記載したマニュフェスト}'
```

オプションにはないがマニュフェストでは設定できる詳細な設定を行う場合は、
「--overrides='{jsonで記載したマニュフェスト}'」で指定することができるため
APIリファレンスを見ながらjsonを書いて指定する

注意点は、上書きされない部分(恐らくkindのみ)と、される部分(恐らく、kind以外)がある点
例えば「--env="key=value"」オプションを付けても、--overridesで指定したマニュフェストに
Envの指定がない場合は環境変数は設定されない

また、--overridesでkindを指定しても、上述のkindを変更するオプションの指定と合っていないとエラーになる

※ すみません。このあたりの挙動は理解が不十分なので最終実行前に--dry-runで確認するのが良いかと思っています。

そのため、一度全オプションを付けて、「-o json --dry-run」でマニュフェストを出力し、
それを基に修正すると楽できそう

# 最後に

色々調べた後で気づいたのですが、Exampleがとても分かりやすい!!
上記に記載した内容がほぼ例ででています。
(最初はkubernetesの仕組みで分からない部分が多かったので、「？」で読み飛ばしていましたが、
今ならExmpleで理解できそうな気がします)

```
Examples:
  # Start a single instance of nginx.
  kubectl run nginx --image=nginx

  # Start a single instance of hazelcast and let the container expose port 5701 .
  kubectl run hazelcast --image=hazelcast --port=5701

  # Start a single instance of hazelcast and set environment variables "DNS_DOMAIN=cluster" and "POD_NAMESPACE=default" in the container.
  kubectl run hazelcast --image=hazelcast --env="DNS_DOMAIN=cluster" --env="POD_NAMESPACE=default"

  # Start a single instance of hazelcast and set labels "app=hazelcast" and "env=prod" in the container.
  kubectl run hazelcast --image=hazelcast --labels="app=hazelcast,env=prod"

  # Start a replicated instance of nginx.
  kubectl run nginx --image=nginx --replicas=5

  # Dry run. Print the corresponding API objects without creating them.
  kubectl run nginx --image=nginx --dry-run

  # Start a single instance of nginx, but overload the spec of the deployment with a partial set of values parsed from JSON.
  kubectl run nginx --image=nginx --overrides='{ "apiVersion": "v1", "spec": { ... } }'

  # Start a pod of busybox and keep it in the foreground, don't restart it if it exits.
  kubectl run -i -t busybox --image=busybox --restart=Never

  # Start the nginx container using the default command, but use custom arguments (arg1 .. argN) for that command.
  kubectl run nginx --image=nginx -- <arg1> <arg2> ... <argN>

  # Start the nginx container using a different command and custom arguments.
  kubectl run nginx --image=nginx --command -- <cmd> <arg1> ... <argN>

  # Start the perl container to compute π to 2000 places and print it out.
  kubectl run pi --image=perl --restart=OnFailure -- perl -Mbignum=bpi -wle 'print bpi(2000)'

  # Start the cron job to compute π to 2000 places and print it out every 5 minutes.
  kubectl run pi --schedule="0/5 * * * ?" --image=perl --restart=OnFailure -- perl -Mbignum=bpi -wle 'print bpi(2000)'
```


他の皆さんの記事等でもっと詳しくなり、kubernetesを最大限利用していきたいと思います。