※このブログではサーバー運用、技術の検証等の費用のため広告をいれています。
記事が見づらいなどの問題がありましたらContactからお知らせください。

<前のページ
kubectlでKubernetesを操作して簡単なサーバーを起動してみよう
次のページ>
Kubernetesダッシュボードのインストールからログインまで解説

【解説】kubectlコマンドでyamlファイルからKubernetesオブジェクトを作成

kubernetes Minikube kubectl k8s yaml サーバー開発

投稿日:2020年10月4日

このエントリーをはてなブックマークに追加
この記事では初心者向けにkubectlコマンドでyamlファイルからKubernetesオブジェクトを作成する方法について解説します。

はじめに

この記事について

この記事ではKubernetes初心者向けにkubectlを使用してyamlファイルからKubernetesオブジェクトを作成する方法について解説します。

環境

  • OS:Ubuntu18.04LTS
  • kubectl バージョン 1.19.0
  • Minikube バージョン 1.13.1

Kubernetesオブジェクト

Kubernetesオブジェクトとは

Kubernetesオブジェクトはクラスターの状態の定義となるもののようです。具体的には以下のような内容を表現することができます。

  • どのようなコンテナ化されたアプリケーションが稼働しているか(またそれらはどのノード上で動いているか)
  • それらのアプリケーションから利用可能なリソース
  • アプリケーションがどのように振る舞うかのポリシー、例えば再起動、アップグレード、耐障害性ポリシーなど

Kubernetesオブジェクトの作成、変更、削除にはKubernetes APIを使う必要があります。前回使用したkubectlコマンドはこのKubernetes APIを叩くことで間接的にDeployment、Service、Podの管理を行います。

specとstatusについて

ほとんどのKubernetesオブジェクトはspec(仕様)status(状態)というフィールドを持ちます。

  • spec:specを持つオブジェクトについてはオブジェクト作成時に、必ずspecを設定する必要があります。ここにはそのオブジェクトに持たせたい特徴を定義します。例えばDeploymentなどのオブジェクトの場合、使用するImage、レプリカの数などをspecとして設定します。
  • status:statusはそのオブジェクトの現在の状態を示す値で、Kubernetesとそのコンポーネントにより自動的に設定、更新されます。

yamlファイルからKubernetesオブジェクトを作成

yamlファイルを定義

Kubernetesオブジェクトの作成はyamlファイルを定義して行うことができます。

ここではサンプルとしてnginxイメージを使ったDeploymentのオブジェクトを定義してみます。

deployment-sample.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:latest
          ports:
            - containerPort: 80
  • apiVersion:使用するKubernetesAPIのバージョンを定義します。
  • kind:どの種類のリソースを利用するかを定義します。
  • metadata:オブジェクトを一意に特定するための情報。自分が管理しやすい様にnameをつけています。
  • spec:作成するオブジェクトの実際の内容を定義します。

yamlファイルをクラスタに適用

yamlファイルをKubernetesクラスタに適用するにはkubectl applyコマンドを使用します。-fオプションで対象のyamlファイルを指定します。

ターミナル
$ kubectl apply -f deployment-sample.yaml --record

yamlファイル通り動いているか確認してみましょう。リソースはyamlファイルのmetadataのname値に設定した値になっています。

ターミナル
$ kubectl describe deployment nginx-deployment
Name:                   nginx-deployment
Namespace:              default
CreationTimestamp:      Sun, 04 Oct 2020 22:09:35 +0900
Labels:                 <none>
Annotations:            deployment.kubernetes.io/revision: 1
                        kubernetes.io/change-cause: kubectl apply --filename=deployment-sample.yaml --record=true
Selector:               app=nginx
Replicas:               2 desired | 2 updated | 2 total | 2 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  app=nginx
  Containers:
   nginx:
    Image:        nginx:latest
    Port:         80/TCP
    Host Port:    0/TCP
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable
OldReplicaSets:  <none>
NewReplicaSet:   nginx-deployment-585449566 (2/2 replicas created)
Events:
  Type    Reason             Age    From                   Message
  ----    ------             ----   ----                   -------
  Normal  ScalingReplicaSet  3m41s  deployment-controller  Scaled up replica set nginx-deployment-585449566 to 2

apiVersionとkindがわからない?

apiVersionとkindでどんな値を設定すれば良いのでしょうか?

この値はkubectlのkubectl api-resourcesコマンドを使うことで特定することができます。このコマンドは利用可能なリソースを一覧表示できるコマンドです。

ターミナル
$ kubectl api-resources
NAME                              SHORTNAMES   APIGROUP                       NAMESPACED   KIND
bindings                                                                      true         Binding
componentstatuses                 cs                                          false        ComponentStatus
configmaps                        cm                                          true         ConfigMap
endpoints                         ep                                          true         Endpoints
events                            ev                                          true         Event
limitranges                       limits                                      true         LimitRange
namespaces                        ns                                          false        Namespace
nodes                             no                                          false        Node
persistentvolumeclaims            pvc                                         true         PersistentVolumeClaim
persistentvolumes                 pv                                          false        PersistentVolume
pods                              po                                          true         Pod
podtemplates                                                                  true         PodTemplate
replicationcontrollers            rc                                          true         ReplicationController
resourcequotas                    quota                                       true         ResourceQuota
secrets                                                                       true         Secret
serviceaccounts                   sa                                          true         ServiceAccount
services                          svc                                         true         Service
mutatingwebhookconfigurations                  admissionregistration.k8s.io   false        MutatingWebhookConfiguration
validatingwebhookconfigurations                admissionregistration.k8s.io   false        ValidatingWebhookConfiguration
customresourcedefinitions         crd,crds     apiextensions.k8s.io           false        CustomResourceDefinition
apiservices                                    apiregistration.k8s.io         false        APIService
controllerrevisions                            apps                           true         ControllerRevision
daemonsets                        ds           apps                           true         DaemonSet
deployments                       deploy       apps                           true         Deployment
replicasets                       rs           apps                           true         ReplicaSet
statefulsets                      sts          apps                           true         StatefulSet
tokenreviews                                   authentication.k8s.io          false        TokenReview
localsubjectaccessreviews                      authorization.k8s.io           true         LocalSubjectAccessReview
selfsubjectaccessreviews                       authorization.k8s.io           false        SelfSubjectAccessReview
selfsubjectrulesreviews                        authorization.k8s.io           false        SelfSubjectRulesReview
subjectaccessreviews                           authorization.k8s.io           false        SubjectAccessReview
horizontalpodautoscalers          hpa          autoscaling                    true         HorizontalPodAutoscaler
cronjobs                          cj           batch                          true         CronJob
jobs                                           batch                          true         Job
certificatesigningrequests        csr          certificates.k8s.io            false        CertificateSigningRequest
leases                                         coordination.k8s.io            true         Lease
endpointslices                                 discovery.k8s.io               true         EndpointSlice
events                            ev           events.k8s.io                  true         Event
ingresses                         ing          extensions                     true         Ingress
ingressclasses                                 networking.k8s.io              false        IngressClass
ingresses                         ing          networking.k8s.io              true         Ingress
networkpolicies                   netpol       networking.k8s.io              true         NetworkPolicy
runtimeclasses                                 node.k8s.io                    false        RuntimeClass
poddisruptionbudgets              pdb          policy                         true         PodDisruptionBudget
podsecuritypolicies               psp          policy                         false        PodSecurityPolicy
clusterrolebindings                            rbac.authorization.k8s.io      false        ClusterRoleBinding
clusterroles                                   rbac.authorization.k8s.io      false        ClusterRole
rolebindings                                   rbac.authorization.k8s.io      true         RoleBinding
roles                                          rbac.authorization.k8s.io      true         Role
priorityclasses                   pc           scheduling.k8s.io              false        PriorityClass
csidrivers                                     storage.k8s.io                 false        CSIDriver
csinodes                                       storage.k8s.io                 false        CSINode
storageclasses                    sc           storage.k8s.io                 false        StorageClass
volumeattachments                              storage.k8s.io                 false        VolumeAttachment

ここでNameとして表示されているのがkindに設定する値です。
例えばCronJobのyamlファイルを作成する際にはkind : cronjobsと設定すれば良いわけです。

apiVersionにはそのリソースのAPIGROUPの値/バージョンを設定します。上記コマンドで利用したいリソースのAPIGROUPの値は確認できるのですが、どのバージョンの値がわかりません。その環境で構築されているKubernetesでどのバージョンが利用できるのかを調べる必要があります。
利用可能なAPIのバージョンはkubectlのコマンドkubectl api-versionsで一覧表示することができます。

ターミナル
$ kubectl api-versions
admissionregistration.k8s.io/v1
admissionregistration.k8s.io/v1beta1
apiextensions.k8s.io/v1
apiextensions.k8s.io/v1beta1
apiregistration.k8s.io/v1
apiregistration.k8s.io/v1beta1
apps/v1
authentication.k8s.io/v1
authentication.k8s.io/v1beta1
authorization.k8s.io/v1
authorization.k8s.io/v1beta1
autoscaling/v1
autoscaling/v2beta1
autoscaling/v2beta2
batch/v1
batch/v1beta1
certificates.k8s.io/v1
certificates.k8s.io/v1beta1
coordination.k8s.io/v1
coordination.k8s.io/v1beta1
discovery.k8s.io/v1beta1
events.k8s.io/v1
events.k8s.io/v1beta1
extensions/v1beta1
networking.k8s.io/v1
networking.k8s.io/v1beta1
node.k8s.io/v1beta1
policy/v1beta1
rbac.authorization.k8s.io/v1
rbac.authorization.k8s.io/v1beta1
scheduling.k8s.io/v1
scheduling.k8s.io/v1beta1
storage.k8s.io/v1
storage.k8s.io/v1beta1
v1

CronJobの場合、APIGROUPはbatchでした。上記コマンドの出力を確認するとこのAPIGROUPで利用可能なバージョンはbatch/v1batch/v1beta1の2つ選択肢があります。
基本的にalphaやbetaのついていない安定版を使うのが良いでしょう。apiVersion : batch/v1になります。

このエントリーをはてなブックマークに追加

<前のページ
kubectlでKubernetesを操作して簡単なサーバーを起動してみよう
次のページ>
Kubernetesダッシュボードのインストールからログインまで解説

関連記事

記事へのコメント