Kubernetes

Kubernetes kubectl create deploymentでコマンドラインだけでdeploymentを作成してみる

概要

マニフェストファイルを作成しなくてもコマンドラインだけでdeploymentを作成できます。
例えば、Podだけでは試験できてないことをサクッと確認したい際に便利ですね。

コマンド

kubectl create deployment

オプション

help を確認するといろいろやり方がありますね。

vagrant@kubemaster:~$ kubectl create deployment --help
Create a deployment with the specified name.

Aliases:
deployment, deploy

Examples:
  # Create a deployment named my-dep that runs the busybox image
  kubectl create deployment my-dep --image=busybox

  # Create a deployment with a command
  kubectl create deployment my-dep --image=busybox -- date

  # Create a deployment named my-dep that runs the nginx image with 3 replicas
  kubectl create deployment my-dep --image=nginx --replicas=3

  # Create a deployment named my-dep that runs the busybox image and expose port 5701
  kubectl create deployment my-dep --image=busybox --port=5701

Options:
      --allow-missing-template-keys=true: If true, ignore any errors in templates when a field or map key is missing in
the template. Only applies to golang and jsonpath output formats.
      --dry-run='none': Must be "none", "server", or "client". If client strategy, only print the object that would be
sent, without sending it. If server strategy, submit server-side request without persisting the resource.
      --field-manager='kubectl-create': Name of the manager used to track field ownership.
      --image=[]: Image names to run.
  -o, --output='': Output format. One of:
json|yaml|name|go-template|go-template-file|template|templatefile|jsonpath|jsonpath-as-json|jsonpath-file.
      --port=-1: The port that this container exposes.
  -r, --replicas=1: Number of replicas to create. Default is 1.
      --save-config=false: If true, the configuration of current object will be saved in its annotation. Otherwise, the
annotation will be unchanged. This flag is useful when you want to perform kubectl apply on this object in the future.
      --show-managed-fields=false: If true, keep the managedFields when printing objects in JSON or YAML format.
      --template='': Template string or path to template file to use when -o=go-template, -o=go-template-file. The
template format is golang templates [http://golang.org/pkg/text/template/#pkg-overview].
      --validate=true: If true, use a schema to validate the input before sending it

Usage:
  kubectl create deployment NAME --image=image -- [COMMAND] [args...] [options]

Use "kubectl options" for a list of global command-line options (applies to all commands).
vagrant@kubemaster:~$

コマンドを試してみる

ヘルプの例を実行するとどんな、デプロイが作成できるのか試してみました。

kubectl create deployment my-dep --image=busybox

busybox イメージを実行する my-dep という名前のデプロイメントを作成するコマンドで、
基本的なImageだけ指定したコマンドですね


vagrant@kubemaster:~$ kubectl create deployment my-dep --image=busybox
deployment.apps/my-dep created
vagrant@kubemaster:~$

#サンプルのまま実行すると、PODが「CrashLoopBackOff」になりますねー
#busybox 起動時にコマンドを実行させないとこのような状態になるようです。

vagrant@kubemaster:~$ kubectl get all
NAME                          READY   STATUS             RESTARTS      AGE
pod/my-dep-7cb9c979b4-468bc   0/1     CrashLoopBackOff   3 (18s ago)   77s

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   25d

NAME                     READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/my-dep   0/1     1            0           77s

NAME                                DESIRED   CURRENT   READY   AGE
replicaset.apps/my-dep-7cb9c979b4   1         1         0       77s
vagrant@kubemaster:~$

vagrant@kubemaster:~$ kubectl describe po my-dep-7cb9c979b4-468bc

Events:
  Type     Reason     Age                   From               Message
  ----     ------     ----                  ----               -------
  Normal   Scheduled  2m43s                 default-scheduler  Successfully assigned default/my-dep-7cb9c979b4-468bc to kubenode01
  Normal   Pulled     2m38s                 kubelet            Successfully pulled image "busybox" in 4.26338891s
  Normal   Pulled     2m34s                 kubelet            Successfully pulled image "busybox" in 3.056194791s
  Normal   Pulled     2m16s                 kubelet            Successfully pulled image "busybox" in 3.072105817s
  Normal   Created    105s (x4 over 2m37s)  kubelet            Created container busybox
  Normal   Started    105s (x4 over 2m37s)  kubelet            Started container busybox
  Normal   Pulled     105s                  kubelet            Successfully pulled image "busybox" in 3.063392846s
  Warning  BackOff    67s (x8 over 2m33s)   kubelet            Back-off restarting failed container
  Normal   Pulling    53s (x5 over 2m42s)   kubelet            Pulling image "busybox"
vagrant@kubemaster:~$

#テストしたら削除しましょう
kubectl delete deployment my-dep

vagrant@kubemaster:~$ kubectl delete deployment my-dep
deployment.apps "my-dep" deleted
vagrant@kubemaster:~$ kubectl get all
NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   25d
vagrant@kubemaster:~$

kubectl create deployment my-dep --image=busybox -- date

Podでコマンドを実行するコンテナをデプロイする例ですね。

vagrant@kubemaster:~$ kubectl create deployment my-dep --image=busybox -- date
deployment.apps/my-dep created
vagrant@kubemaster:~$

#コンテナが「date」を実行して終了することを繰り返します。

vagrant@kubemaster:~$ kubectl get po -w
NAME                      READY   STATUS              RESTARTS   AGE
my-dep-649755cd95-t5lck   0/1     ContainerCreating   0          2s
my-dep-649755cd95-t5lck   0/1     Completed           0          5s
my-dep-649755cd95-t5lck   0/1     Completed           1 (4s ago)   9s
my-dep-649755cd95-t5lck   0/1     CrashLoopBackOff    1 (1s ago)   10s
my-dep-649755cd95-t5lck   0/1     Completed           2 (19s ago)   28s
my-dep-649755cd95-t5lck   0/1     CrashLoopBackOff    2 (14s ago)   41s
my-dep-649755cd95-t5lck   0/1     Completed           3 (29s ago)   56s

kubectl create deployment my-dep --image=nginx --replicas=3

3 つのレプリカで nginx イメージを実行する my-dep という名前のデプロイメントを作成します
レプリカ数を指定したい際のコマンドですね。

kubectl create deployment my-dep --image=nginx --replicas=3

#エラーもなく成功します。

vagrant@kubemaster:~$ kubectl get all
NAME                        READY   STATUS    RESTARTS   AGE
pod/my-dep-84885b44-8x7mc   1/1     Running   0          14s
pod/my-dep-84885b44-9qsj6   1/1     Running   0          14s
pod/my-dep-84885b44-xl44d   1/1     Running   0          14s

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   26d

NAME                     READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/my-dep   3/3     3            3           15s

NAME                              DESIRED   CURRENT   READY   AGE
replicaset.apps/my-dep-84885b44   3         3         3       14s
vagrant@kubemaster:~$

kubectl create deployment my-dep --image=busybox --port=5701

busybox イメージを実行し、ポート 5701 を公開する my-dep という名前のデプロイメントを作成します。


#コマンドは成功
vagrant@kubemaster:~$ kubectl create deployment my-dep --image=busybox --port=5701
deployment.apps/my-dep created
vagrant@kubemaster:~$ 

#コンテナで何も処理されていないので、Completed →CrashLoopBackOff を繰り返しますね。

vagrant@kubemaster:~$ kubectl get all
NAME                          READY   STATUS              RESTARTS   AGE
pod/my-dep-56c7c8b96d-m7n6d   0/1     ContainerCreating   0          1s

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   26d

NAME                     READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/my-dep   0/1     1            0           2s

NAME                                DESIRED   CURRENT   READY   AGE
replicaset.apps/my-dep-56c7c8b96d   1         1         0       2s
vagrant@kubemaster:~$ kubectl get po -w
NAME                      READY   STATUS      RESTARTS   AGE
my-dep-56c7c8b96d-m7n6d   0/1     Completed   0          6s
my-dep-56c7c8b96d-m7n6d   0/1     Completed   1 (5s ago)   9s
my-dep-56c7c8b96d-m7n6d   0/1     CrashLoopBackOff   1 (2s ago)   10s
my-dep-56c7c8b96d-m7n6d   0/1     Completed          2 (20s ago)   28s

テストする際のおすすめ

コンテナ内でコマンドを実行した際には、
kubectl create deployment my-dep --image=busybox -- sleep 4500
が良さそうですね。
※ コンテナでsleep コマンドを実行させることで、コンテナを維持させます。

コンテナに対する通信を確認したい際に
kubectl create deployment my-dep --image=nginx --replicas=3
でPODを作成するのが簡単そうです。
※アクセスをテストするのであれば、別途Serviceも作成した方が良さそうですね。

# deploymentを作成する際に、sleep を実行するコンテナを作成

vagrant@kubemaster:~$ kubectl create deployment my-dep --image=busybox  -- sleep 4500
deployment.apps/my-dep created
vagrant@kubemaster:~$

# これだと、sleep コマンドで指定した時間までコンテナは削除されないので
# STATUS が ContainerCreating ではなくRunning ですね!

vagrant@kubemaster:~$ kubectl get all
NAME                          READY   STATUS    RESTARTS   AGE
pod/my-dep-68f944b6f7-7k8pd   1/1     Running   0          19s

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   26d

NAME                     READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/my-dep   1/1     1            1           19s

NAME                                DESIRED   CURRENT   READY   AGE
replicaset.apps/my-dep-68f944b6f7   1         1         1       19s
vagrant@kubemaster:~$

# コマンド実行しているみるとこんな感じ

vagrant@kubemaster:~$ kubectl exec -it my-dep-68f944b6f7-7k8pd -- ls -l
total 36
drwxr-xr-x    2 root     root         12288 Sep  1 16:42 bin
drwxr-xr-x    5 root     root           360 Sep  3 07:44 dev
drwxr-xr-x    1 root     root          4096 Sep  3 07:44 etc
drwxr-xr-x    2 nobody   nobody        4096 Sep  1 16:42 home
dr-xr-xr-x  129 root     root             0 Sep  3 07:44 proc
drwx------    2 root     root          4096 Sep  1 16:42 root
dr-xr-xr-x   13 root     root             0 Sep  3 07:44 sys
drwxrwxrwt    2 root     root          4096 Sep  1 16:42 tmp
drwxr-xr-x    3 root     root          4096 Sep  1 16:42 usr
drwxr-xr-x    1 root     root          4096 Sep  3 07:44 var
vagrant@kubemaster:~$

# コンテナにログインしてコマンドを実行することもできますね!

vagrant@kubemaster:~$ kubectl exec -it my-dep-68f944b6f7-7k8pd -- /bin/sh
/ # ps aux
PID   USER     TIME  COMMAND
    1 root      0:00 sleep 4500
   16 root      0:00 /bin/sh
   21 root      0:00 ps aux
/ #

参考情報

kubectlリファレンスドキュメント
https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#-em-deployment-em-

Deployment
https://kubernetes.io/ja/docs/concepts/workloads/controllers/deployment/

人気記事

1

Kubernetes kubectl rollout コマンドでdeploymentをロールバックしてみる 概要 kubectl rollout コマンドでデプロイ履歴を確認してロールバックするやり方 ...

2

  terraformのバージョン管理どうすればいいのか? terraformの複数バージョンを簡単に動かしたい terraformのインストール方法が分からない と、疑問を抱えている人の疑 ...

3

本記事では どんな環境にterraformをインストールできるの? terraformのインストールどうしたらいいの? terraformのどのバージョンをインストールすればいいの? と、困っている人 ...

4

Kubernetes kubectl version コマンドでバージョンを調べてみる 概要 kubectl version は、Kubernetes の Client、Serverのバージョンを確認 ...

-Kubernetes