【Kubernetes】マニフェストファイルを爆速で書く

めんどくさがりやは考える

これまで何度も扱ってきたマニフェストファイルは一度書いてしまえばその後リソースの破壊と創造を容易としてくれますが、いかんせん項目がたくさんあるのでイチから記述するのがとても大変です。
既に作成されたものをコピペして書くのも良いですが、元のファイルの仕様や書いた人独自の考え方に影響されてしまい、本来あるべき構成で記述できなくなるリスクもあります。(これはエンジニアあるある…と思いたい)

dry-runオプション

dry-runコマンドを使うと雛形となるyamlファイルを表示したり、他のオプションと組み合わせてファイルとして出力させることができます。

mysqlのリソースをDeploymentで構築する例で解説します。
Deploymentの最もシンプルなデプロイ方法は、以下のようにcreateコマンドでリソースを構築する方法です。
実行するとcreateされた旨メッセージが表示されました。(実際にリソースがデプロイされています)

kubectl create deploy mysql --image=mysql:latest
deployment.apps/mysql created

ではこのコマンドにdry-runを付け足してみます。

kubectl create deploy mysql --image=mysql:latest --dry-run=client -o yaml                               
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: mysql
  name: mysql
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: mysql
    spec:
      containers:
      - image: mysql:latest
        name: mysql
        resources: {}
status: {}

あら不思議。mysqlリソースのDeploymentのyamlが表示されたではありませんか。
ちなみにこのコマンドではリソースはデプロイされていません。

ここで表示されたものをyamlファイルとして保存し微修正すれば良さそうです。
でもいちいち保存するのは面倒なので、一発でyamlファイルで出力すことはできるのでしょうか。
できるのか、できないのか、どっちなーーんだい。

でーきーる!

kubectl create deploy mysql --image=mysql:latest --dry-run=client -o yaml > mysql-deployment-dryrun.yaml

実行結果こそ何も表示されないものの、指定したファイル名でyamlファイルが作成されています。

出力されたyamlファイル

mysqlの場合はDBの名前やrootユーザの指定が必須なので、それらを付け足します。

apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: mysql
  name: mysql
spec:A
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: mysql
    spec:
      containers:
      - image: mysql:latest
        name: mysql
[ここから追記]
        env:
          - name: MYSQL_ROOT_PASSWORD
            value: ********
          - name: MYSQL_DATABASE
            value: mysql_db
          - name: MYSQL_USER
            value: macbooker
          - name: MYSQL_PASSWORD
            value: ********
[ここまで]
        resources: {}
status: {}

ではapplyしていきます。

kubectl apply -f mysql-deployment-dryrun.yaml
deployment.apps/mysql created

mysqlという名前のDeploymentが確認できました。

kubectl get deployment
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
mysql   1/1     1            1           68s

確認が終わったらリソースは消しておきましょう。

kubectl delete -f mysql-deployment-dryrun.yaml
deployment.apps "mysql" deleted

まとめ

何十行にもわたるマニフェストファイルをイチから記述するのは骨が折れますが、dry-runオプションを活用することで雛形を自動作成できました。さらに他のオプションと組み合わせることでyamlファイルとして出力することがきました。これを微修正した上でapplyし、リソースがデプロイされたところまで確認しました。

ご覧いただきありがとうございました。