概要
マニフェストファイルを作成しなくてもコマンドラインだけで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/