Kubernetesマニフェストファイルの雛形作成コマンドたち

マニフェストファイルの雛形を、kubectlにて取得するコマンドをメモしておきます。

目次

環境

基本的な情報

リソース作成用のkubectlコマンドにて、 --dry-run=client オプションと -o yaml オプションを付与して実行すれば、リソースを作成せずテンプレートを出力してくれます。

kubectl xxx --help を実行すれば、必要サブコマンドやオプション、コマンド例を確認できます。

公式の参考ページ

Namespace

$ kubectl create namespace sample --dry-run=client -o yaml

Resource Quota

$ kubectl create quota sample --hard=cpu=2,memory=2Gi,pods=10 --scopes=NotBestEffort --dry-run=client -o yaml

cpurequests.cpu と、 memoryrequests.memory と同義。

Compute Resource Quota

Pod

$ kubectl run sample --image=nginx --restart=Never --labels="key=value" --dry-run=client -o yaml

コンテナのポートを公開する場合。

$ kubectl run sample --image=nginx --restart=Never --port=80 --labels="key=value" --dry-run=client -o yaml

docker runENTRYPOINT オプションを指定する場合。

$ kubectl run sample --image=busybox:1.28 --restart=Never --dry-run=client -o yaml --command -- sleep 60

env の設定する場合。

$ kubectl run sample --image=nginx --env=key1=value1 --restart=Never --dry-run=client -o yaml

Resource RequestsLimits を設定する場合。

$ kubectl run sample --image=nginx --requests=cpu=0.2,memory=100Mi --limits=cpu=0.5,memory=500Mi --restart=Never --dry-run=client -o yaml

Deployment

$ kubectl create deployment sample --image=nginx --dry-run=client -o yaml

ReplicaSet

$ kubectl create deployment sample --image=nginx --replicas=3 --dry-run=client -o yaml

DaemonSet

$ kubectl create deployment sample --image=nginx --dry-run=client -o yaml | sed '/replicas/d;s/Deployment/DaemonSet/g'

参考:Create Daemonset using kubectl?

Service: ClusterIP

$ kubectl expose pod sample --name=svc-sample --port=80 --target-port=8080 --dry-run=client -o yaml

Service: NodePort

$ kubectl expose pod sample --name=svc-sample --port=80 --target-port=8080 --type=NodePort --dry-run=client -o yaml

利用するnodePortを明示的に指定したい場合、マニフェストファイルを直接編集する。

Ingress

$ kubectl create ingress sample --rule="sample.com/=service:8080" --dry-run=client -o yaml

公式ドキュメントを見たほうが分かりやすい。

ingress

ConfigMap

文字列を指定する場合。

$ kubectl create configmap cm-sample --from-literal=key1=value1 --from-literal=key2=value2 --dry-run=client -o yaml

ファイルを指定する場合。

$ kubectl create configmap cm-sample --from-file=/path/to/file --dry-run=client -o yaml

envファイルを指定する場合。

$ kubectl create configmap cm-sample --from-env-file=/path/to/env --dry-run=client -o yaml

Secret

$ kubectl create secret generic secret-sample --from-literal=key1=value2 --dry-run=client -o yaml

Dockerレジストリ情報を登録したい場合、サブコマンド genericdocker-registry に、非対称鍵を登録したい場合 tls に変更する。それぞれ必要オプションは --help で確認すること。

Role

$ kubectl create role role-name --verb=list,view --resource=pod,deployment -n default --dry-run=client -o yaml

RoleBinding

$ kubectl create rolebinding rolebinding-name --role=role-name --user=user-name -n default --dry-run=client -o yaml

ClusterRole

$ kubectl create clusterrole crole-name --verb=list,view --resource=replicaset --dry-run=client -o yaml

ClusterRoleBinding

$ kubectl create clusterrolebinding crolebinding-name --clusterrole=crole-name --user=user-name --dry-run=client -o yaml

ServiceAccount

$ kubectl create serviceaccount sa-name --dry-run=client -o yaml

Job

$ kubectl create job sample --image=busybox:1.28 --restart=OnFailure --dry-run=client -o yaml -- /bin/sh -c 'echo "Hello. Hololive"'

cronjob

$ kubectl create cronjob sample --image=busybox:1.28 --restart=OnFailure -schedule='*/1 * * * *' --dry-run=Client -o yaml -- /bin/sh -c 'echo "Hello. Hololive"'

explainの使い方

雛形を出力できないパラメーター部分に関して、 explain コマンドを利用することで、雛形の確認ができます。

説明を確認したい場合。

$ kubectl explain pod.spec.containers.volumeMounts
KIND:     Pod
VERSION:  v1

RESOURCE: volumeMounts <[]Object>

DESCRIPTION:
     Pod volumes to mount into the container's filesystem. Cannot be updated.

     VolumeMount describes a mounting of a Volume within a container.

FIELDS:
   mountPath    <string> -required-
     Path within the container at which the volume should be mounted. Must not
     contain ':'.

   mountPropagation     <string>
     mountPropagation determines how mounts are propagated from the host to
     container and the other way around. When not set, MountPropagationNone is
     used. This field is beta in 1.10.

   name <string> -required-
     This must match the Name of a Volume.

   readOnly     <boolean>
     Mounted read-only if true, read-write otherwise (false or unspecified).
     Defaults to false.

   subPath      <string>
     Path within the volume from which the container's volume should be mounted.
     Defaults to "" (volume's root).

   subPathExpr  <string>
     Expanded path within the volume from which the container's volume should be
     mounted. Behaves similarly to SubPath but environment variable references
     $(VAR_NAME) are expanded using the container's environment. Defaults to ""
     (volume's root). SubPathExpr and SubPath are mutually exclusive.

もっとシンプルに、雛形のみ確認したい場合は --recursive オプションを利用。

$ kubectl explain pod.spec.containers.volumeMounts --recursive
KIND:     Pod
VERSION:  v1

RESOURCE: volumeMounts <[]Object>

DESCRIPTION:
     Pod volumes to mount into the container's filesystem. Cannot be updated.

     VolumeMount describes a mounting of a Volume within a container.

FIELDS:
   mountPath    <string>
   mountPropagation     <string>
   name <string>
   readOnly     <boolean>
   subPath      <string>
   subPathExpr  <string>

grepを併用することで、ざっくりとした検索も簡単にできるようなります。

$ kubectl explain pod --recursive | grep -iA10 volumemount
         volumeMounts   <[]Object>
            mountPath   <string>
            mountPropagation    <string>
            name        <string>
            readOnly    <boolean>
            subPath     <string>
            subPathExpr <string>
         workingDir     <string>
      dnsConfig <Object>
         nameservers    <[]string>
         options        <[]Object>

kubectl explain

テンプレートの検証

--validate --dry-run=client をつけることで、作成したテンプレートのvalidationをできます。

$ kubectl apply -f sample.yaml --validate --dry-run=client
error: error validating "sample.yaml": error validating data: ValidationError(Pod.spec.containers[0]): unknown field "imege" in io.k8s.api.core.v1.Container; if you choose to ignore these errors, turn validation off with --validate=false