zaki work log

作業ログやら生活ログやらなんやら

[oc / kubectl] runでデプロイできるpodとその親リソースについて (廃止予定オプション--generatorの動作)

oc runを使ったPodのデプロイについて。

OpenShift v4では、oc runを使ってDeploymentConfigやDeploymentを作成するとDEPRECATEDの警告が表示さるようになった。(正確にはv4.1は触ったことないからわからない)
k8sバージョン1.18で無くなる模様。

github.com

予定ではpod単体のデプロイに特化するようになるらしいが、現状どう動作するかについてまとめた。
以下、OKD v4.4(k8s v1.17.1)で確認。

[zaki@okd4-manager ~]$ oc version
Client Version: 4.4.0-0.okd-2020-01-28-022517
Kubernetes Version: v1.17.1

Pod単発

現在は--restart=Neverを付けるとpod単体でデプロイされる。(将来これがデフォルトの動作になるっぽい)

[zaki@okd4-manager ~]$ oc run never-restart-pod --restart=Never --image=rhel:7.7 -- tail -f /dev/null
pod/never-restart-pod created
[zaki@okd4-manager ~]$ oc get all
NAME                    READY   STATUS              RESTARTS   AGE
pod/never-restart-pod   0/1     ContainerCreating   0          2s

DeploymentConfigで起動

OpenShiftではこれがデフォルト動作。

[zaki@okd4-manager ~]$ oc run dc-run-pod --image=rhel:7.7 -- tail -f /dev/null
kubectl run --generator=deploymentconfig/v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
[zaki@okd4-manager ~]$ oc get all -l run=dc-run-pod
NAME                     READY   STATUS    RESTARTS   AGE
pod/dc-run-pod-1-ht77f   1/1     Running   0          49s

NAME                                 DESIRED   CURRENT   READY   AGE
replicationcontroller/dc-run-pod-1   1         1         1       57s

NAME                                            REVISION   DESIRED   CURRENT   TRIGGERED BY
deploymentconfig.apps.openshift.io/dc-run-pod   1          1         1         config

DeploymentConfig, ReplicationController, Podが作成される。

Deploymentで起動

--generator=deployment/apps.v1を付けるとDeploymentConfigでなくDeploymentが作成される。
kubectlの場合はこちらがデフォルト動作。

[zaki@okd4-manager ~]$ oc run deploy-run-pod --generator=deployment/apps.v1 --image=rhel:7.7 -- tail -f /dev/null
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
[zaki@okd4-manager ~]$ oc get all -l run=deploy-run-pod
NAME                                  READY   STATUS    RESTARTS   AGE
pod/deploy-run-pod-56c6698fdb-dzk2g   1/1     Running   0          42s

NAME                             READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/deploy-run-pod   1/1     1            1           42s

NAME                                        DESIRED   CURRENT   READY   AGE
replicaset.apps/deploy-run-pod-56c6698fdb   1         1         1       42s

Deployment, ReplicaSet, Podが作成される。


k8s(1.17)の場合

$ kubectl version
Client Version: version.Info{Major:"1", Minor:"17", GitVersion:"v1.17.0", GitCommit:"70132b0f130acc0bed193d9ba59dd186f0e634cf", GitTreeState:"clean", BuildDate:"2019-12-07T21:20:10Z", GoVersion:"go1.13.4", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"17", GitVersion:"v1.17.0", GitCommit:"70132b0f130acc0bed193d9ba59dd186f0e634cf", GitTreeState:"clean", BuildDate:"2019-12-07T21:12:17Z", GoVersion:"go1.13.4", Compiler:"gc", Platform:"linux/amd64"}
$ kubectl run k8s-run-pod --image=centos:7 -- tail -f /dev/null
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
deployment.apps/k8s-run-pod created
$ kubectl get all -l run=k8s-run-pod
NAME                               READY   STATUS    RESTARTS   AGE
pod/k8s-run-pod-655b579894-dzlc2   1/1     Running   0          20s

NAME                          READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/k8s-run-pod   1/1     1            1           20s

NAME                                     DESIRED   CURRENT   READY   AGE
replicaset.apps/k8s-run-pod-655b579894   1         1         1       20s

デプロイと同時にServiceリソースも作成する

--exposeと、--portで使用するポート番号を指定する。
(--portのみだとserviceは作成されない。--expose--portの指定が無ければエラーになる)

[zaki@okd4-manager ~]$ oc run dc-run-with-svc --image=rhel:7.7 --port=8080 --expose -- tail -f /dev/null 
kubectl run --generator=deploymentconfig/v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
service/dc-run-with-svc created
deploymentconfig.apps.openshift.io/dc-run-with-svc created
[zaki@okd4-manager ~]$ oc get all -l run=dc-run-with-svc
NAME                          READY   STATUS              RESTARTS   AGE
pod/dc-run-with-svc-1-wddbs   0/1     ContainerCreating   0          1s

NAME                                      DESIRED   CURRENT   READY   AGE
replicationcontroller/dc-run-with-svc-1   1         1         0       9s

NAME                                                 REVISION   DESIRED   CURRENT   TRIGGERED BY
deploymentconfig.apps.openshift.io/dc-run-with-svc   1          1         1         config
[zaki@okd4-manager ~]$ oc get svc
NAME              TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
dc-run-with-svc   ClusterIP   172.30.211.158   <none>        8080/TCP   16s

dc,rc,pod,svcが作成される。

Depoyment + Service

これまでの組み合わせ。

[zaki@okd4-manager ~]$ oc run deploy-run-with-svc --image=rhel:7.7 --generator=deployment/apps.v1 --port=8080 --expose -- tail -f /dev/null
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
service/deploy-run-with-svc created
deployment.apps/deploy-run-with-svc created
[zaki@okd4-manager ~]$ oc get all -l run=deploy-run-with-svc
NAME                                       READY   STATUS    RESTARTS   AGE
pod/deploy-run-with-svc-5ffbb8d9c7-h2j28   1/1     Running   0          20s

NAME                                  READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/deploy-run-with-svc   1/1     1            1           20s

NAME                                             DESIRED   CURRENT   READY   AGE
replicaset.apps/deploy-run-with-svc-5ffbb8d9c7   1         1         1       20s
[zaki@okd4-manager ~]$ oc get svc
NAME                  TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
dc-run-with-svc       ClusterIP   172.30.211.158   <none>        8080/TCP   2m54s
deploy-run-with-svc   ClusterIP   172.30.202.241   <none>        8080/TCP   22s

oc run--dry-runが使えるので、実行前に--dry-run -o yamlすれば何が起きるかわかりやすいし、何ならYAMLファイルに出力してマニフェスト作成して、oc apply -fするのが何かと楽と思う。きっと。

とはいえ--generatorは近い将来(というか次のk8sリリース)に廃止されるオプションなので、大人しくoc createに移行するのが吉。


ちなみにpod単体でデプロイしてもオートヒーリングとか聞かないしデプロイされてるノードをdrainしても退避できないのでいろいろ注意(というか検証用に使おう)

zaki-hmkc.hatenablog.com