投稿日:2020年10月4日
この記事では初心者向けにkubectlコマンドでyamlファイルからKubernetesオブジェクトを作成する方法について解説します。
この記事ではKubernetes初心者向けにkubectlを使用してyamlファイルからKubernetesオブジェクトを作成する方法について解説します。
Kubernetesオブジェクトはクラスターの状態の定義となるもののようです。具体的には以下のような内容を表現することができます。
Kubernetesオブジェクトの作成、変更、削除にはKubernetes APIを使う必要があります。前回使用したkubectlコマンドはこのKubernetes APIを叩くことで間接的にDeployment、Service、Podの管理を行います。
ほとんどのKubernetesオブジェクトはspec(仕様)とstatus(状態)というフィールドを持ちます。
Kubernetesオブジェクトの作成はyamlファイルを定義して行うことができます。
ここではサンプルとしてnginxイメージを使ったDeploymentのオブジェクトを定義してみます。
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
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でどんな値を設定すれば良いのでしょうか?
この値は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/v1、batch/v1beta1の2つ選択肢があります。
基本的にalphaやbetaのついていない安定版を使うのが良いでしょう。apiVersion : batch/v1になります。