マニフェストと kubectl コマンド基本操作

マニフェストと kubectl コマンド基本操作

マニフェスト

Kubernetes では、マニフェストと呼ばれる構成ファイルに定義したリソースの情報を利用して管理できます。マニフェストは、リソースごとに定められた設定情報を記述する YAML もしくは Json 形式のファイルです。

次のマニフェストは nginx-pod という名前の Pod を定義した簡単なマニフェストの例です。

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
spec:
  containers:
  - name: nginx-contaier
    image: nginx

マニフェスト内には複数のリソースを定義することもできます。複数のリソースを記述する際は、リソースの間を「—」で区切ります。

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx-contaier
        image: nginx
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: ClusterIP
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: nginx

利用可能なリソース種類の取得

kubectl コマンドで利用可能なリソースの種類は次のコマンドで取得できます。

kubectl api-resource

実行すると次のような結果を取得できます。

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

基本コマンド

kubectl では次のようなコマンドで各リソースを操作できます。

  • create
  • delete
  • get
  • describe
  • apply

create

リソースを作成します。create コマンドでは次の種類のリソースを指定して作成することもできます。

  • clusterrole
  • clusterrolebinding
  • configmap
  • cronjob
  • deployment
  • ingress
  • job
  • namespace
  • poddisruptionbudget
  • priorityclass
  • quota
  • rolerolebinding
  • secret
  • service
  • serviceaccount

例えば、Deployment を作成する場合には次のように実行します。

kubectl create deployment nginx --image=nginx

実行すると、リソースが作成されたメッセージが返ってきます。

$ kubectl create deployment nginx --image=nginx
deployment.apps/nginx created

このほか、-f オプションを付与してマニフェストからリソースを作成することも可能です。

kubectl create -f [マニフェスト ファイル パス]
$ kubectl create -f sample.yaml
pod/nginx-pod created

delete

リソースを削除します。リソースの種類とリソース名を指定することで、リソースを削除します。

kubectl delete deployment nginx
$ kubectl delete deployment nginx
deployment.apps "nginx" deleted

また、-f オプションを付与してマニフェストに合致するリソースを削除することも可能です。

kubectl delete -f [マニフェスト ファイル パス]
$ kubectl delete -f sample.yaml
pod "nginx-pod" deleted

get

リソースの概要情報を取得します。Pod の情報を取得する際には次のように指定します。

kubectl get pod
$ kubectl get pod
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-67bcd7f67d-9ks5r   1/1     Running   0          11m
nginx-deployment-67bcd7f67d-f2h6x   1/1     Running   0          11m
nginx-deployment-67bcd7f67d-wnml8   1/1     Running   0          11m

$ kubectl get deployment       
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           12m

describe

リソースの詳細情報を取得します。describe を実行する際はコマンドの結果が長くなるので、リソースを指定する方が良いです。

kubectl describe pod [Pod 名]
$ kubectl describe pod nginx-deployment-67bcd7f67d-9ks5r 
Name:         nginx-deployment-67bcd7f67d-9ks5r
Namespace:    default
Priority:     0
Node:         k8s-worker-02/192.168.11.42
Start Time:   Sat, 06 Nov 2021 15:43:21 +0900
Labels:       app=nginx
              pod-template-hash=67bcd7f67d
Annotations:  <none>
Status:       Running
IP:           10.244.1.12
IPs:
  IP:           10.244.1.12
Controlled By:  ReplicaSet/nginx-deployment-67bcd7f67d
Containers:
  nginx-contaier:
    Container ID:   docker://da419eb567b88791f9477d7cf1df47edfccaf399f269bb075e90ee566d2169ce
    Image:          nginx
    Image ID:       docker-pullable://nginx@sha256:644a70516a26004c97d0d85c7fe1d0c3a67ea8ab7ddf4aff193d9f301670cf36
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Sat, 06 Nov 2021 15:43:25 +0900
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-k48kv (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  kube-api-access-k48kv:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    ConfigMapOptional:       <nil>
    DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  19m   default-scheduler  Successfully assigned default/nginx-deployment-67bcd7f67d-9ks5r to k8s-worker-02
  Normal  Pulling    19m   kubelet            Pulling image "nginx"
  Normal  Pulled     19m   kubelet            Successfully pulled image "nginx" in 2.367473402s
  Normal  Created    19m   kubelet            Created container nginx-contaier
  Normal  Started    19m   kubelet            Started container nginx-contaier

apply

マニフェストを指定し、既存のリソース状態と変更差分がある場合にその部分を変更します。リソースが存在しない場合にはリソースを新規作成します。

kubectl apply -f [マニフェスト ファイル パス]
# リソースがないでは新規作成
$ kubectl apply -f sample2.yaml
deployment.apps/nginx-deployment created
service/nginx-service created

# リソースに変更がない状態
$ kubectl apply -f sample2.yaml
deployment.apps/nginx-deployment unchanged
service/nginx-service unchanged

# Deployment に変更を加えた状態 
$ kubectl apply -f sample2.yaml
deployment.apps/nginx-deployment configured
service/nginx-service unchanged

作成と変更の両方に対応できるため、リソースの新規作成および変更は apply コマンドを使うのが推奨されます。