作成の目的
- サクッとマニュフェストファイル作れる方法習得したい
- Pod、Deploymentの作り方はわかったけど他がわからないのでわかるようにする
kubectl runコマンド
- Podの作成を行うコマンド
Podの作成
- 下記要素で作成
- Pod名:my-nginx
- コンテナのポート番号:80
- イメージ:nginx:1.27.4-alpine
- ラベル:
app: nginx
$ kubectl run my-nginx --port=80 --image=nginx:1.27.4-alpine --labels=app=nginx --dry-run=client -o yaml > my-nginx-pod.yaml
- 作成したmy-nginx-pod.yamlをcatで確認
my-nginx-pod.yaml
apiVersion: v1 kind: Pod metadata: creationTimestamp: null labels: app: nginx name: my-nginx spec: containers: - image: nginx:1.27.4-alpine name: my-nginx ports: - containerPort: 80 resources: {} dnsPolicy: ClusterFirst restartPolicy: Always status: {}
- 作成したmy-nginx-pod.yamlの内容でデプロイ
$ kubectl apply -f my-nginx-pod.yaml pod/my-nginx created
- Podができているのを確認
$ kubectl get pod NAME READY STATUS RESTARTS AGE my-nginx 1/1 Running 0 19s
- Podの削除(今回-fオプションでマニュフェストファイルを指定して削除)
$ kubectl delete -f my-nginx-pod.yaml pod "my-nginx" deleted
kubectl createコマンド
- DeploymentとかConfigMapとか作るコマンド
- helpで確認するとReplicaSetは対応していなかった
Available Commands: clusterrole Create a cluster role clusterrolebinding Create a cluster role binding for a particular cluster role configmap Create a config map from a local file, directory or literal value cronjob Create a cron job with the specified name deployment Create a deployment with the specified name ingress Create an ingress with the specified name job Create a job with the specified name namespace Create a namespace with the specified name poddisruptionbudget Create a pod disruption budget with the specified name priorityclass Create a priority class with the specified name quota Create a quota with the specified name role Create a role with single rule rolebinding Create a role binding for a particular role or cluster role secret Create a secret using a specified subcommand service Create a service using a specified subcommand serviceaccount Create a service account with the specified name token Request a service account token
Deploymentの作成
- 下記要素で作成
- Deployment名:my-nginx-deployment
- コンテナのポート番号:80
- イメージ:nginx:1.27.4-alpine
- レプリカ数:3
$ kubectl create deployment my-nginx-deployment --port=80 --image=nginx:1.27.4-alpine --replicas=3 --dry-run=client -o yaml > my-nginx-deployment.yaml
- 作成したmy-nginx-deployment.yamlをcatで確認
- createコマンドにて
--labels
オプションが存在しなかったが、Deploymentと同じ名前でapp: <ラベル名>
としてつけられているので、必要ないということなのか
my-nginx-deployment.yamlapiVersion: apps/v1 kind: Deployment metadata: creationTimestamp: null labels: app: my-nginx-deployment name: my-nginx-deployment spec: replicas: 3 selector: matchLabels: app: my-nginx-deployment strategy: {} template: metadata: creationTimestamp: null labels: app: my-nginx-deployment spec: containers: - image: nginx:1.27.4-alpine name: nginx ports: - containerPort: 80 resources: {} status: {}
- createコマンドにて
- 作成したmy-nginx-deployment.yamlの内容でデプロイ
$ kubectl apply -f my-nginx-deployment.yaml deployment.apps/my-nginx-deployment created
- Deploymentができているのを確認
$ kubectl get deployment NAME READY UP-TO-DATE AVAILABLE AGE my-nginx-deployment 3/3 3 3 84s
- Podが3つできているか確認
- my-nginx-deployment-でPodが3つ作られている
$ kubectl get pod NAME READY STATUS RESTARTS AGE my-nginx-deployment-7698f79497-29258 1/1 Running 0 3m2s my-nginx-deployment-7698f79497-658fg 1/1 Running 0 3m2s my-nginx-deployment-7698f79497-bw7hg 1/1 Running 0 3m2s
-
kubectl delete pod
で1つPodを削除してみる- 1番上のPodが削除され、新たに1つPodが作成されていることが確認できる
-
replicas: 3
で指定しているため、Podを1つ削除して合計2個にすると、新しくPodが1つ作成され、合計3個になる# Pod削除 $ kubectl delete pod my-nginx-deployment-7698f79497-29258 pod "my-nginx-deployment-7698f79497-29258" deleted # Pod再確認 $ kubectl get pod NAME READY STATUS RESTARTS AGE my-nginx-deployment-7698f79497-658fg 1/1 Running 0 7m1s my-nginx-deployment-7698f79497-bw7hg 1/1 Running 0 7m1s my-nginx-deployment-7698f79497-xnkzm 1/1 Running 0 7s
- kubectl get pod --watchの結果
- 指定したPodの停止とともに新しいPodが作成されている
- StrategyTypeを特に指定していないため、RollingUpdate方式の更新、25% max unavailable, 25% max surgeが指定されていたため
$ kubectl describe deployment my-nginx-deployment Name: my-nginx-deployment Namespace: default … StrategyType: RollingUpdate MinReadySeconds: 0 RollingUpdateStrategy: 25% max unavailable, 25% max surge …
- 指定したPodの停止とともに新しいPodが作成されている
- Deploymentの削除(今回-fオプションでマニュフェストファイルを指定して削除)
$ kubectl delete -f my-nginx-deployment.yaml deployment.apps "my-nginx-deployment" deleted
- Deploymentの削除を行ったため、
kubectl get pod
を行っても、my-nginx-deployment
に関するPodは取得できない
- Deploymentの削除を行ったため、
ConfigMapの作成
- 下記要素で作成
- ConfigMap名:my-config
- HOGE:hoge
- FUGA:fuga
$ kubectl create configmap my-config --from-literal=HOGE=hoge --from-literal=FUGA=fuga --dry-run=client -o yaml > my-config.yaml
- 作成したmy-config.yamlをcatで確認
my-config.yaml
apiVersion: v1 data: FUGA: fuga HOGE: hoge kind: ConfigMap metadata: creationTimestamp: null name: my-config
- my-nginx-pod.yamlをmy-nginx-pod-v2.yamlとしてコピー、containers配下に下記を追加(image、portsと同じ列)
- env配下の- nameに-を付けるのを忘れないように気を付けよう(-つけないとConfigMapからうまく引っ張ってこれない)
my-nginx-pod-v2.yaml
spec: containers: - image: nginx:1.27.4-alpine … + env: + - name: FUGA + valueFrom: + configMapKeyRef: + name: my-config + key: FUGA + - name: HOGE + valueFrom: + configMapKeyRef: + name: my-config + key: HOGE
- env配下の- nameに-を付けるのを忘れないように気を付けよう(-つけないとConfigMapからうまく引っ張ってこれない)
- ConfigMap、Podをそれぞれデプロイ
$ kubectl apply -f my-config.yaml configmap/my-config created $ kubectl apply -f my-nginx-pod-v2.yaml pod/my-nginx created
- ConfigMap、Podができているか確認
- my-config、my-nginxがそれぞれできている
$ kubectl get configmap,pod NAME DATA AGE configmap/kube-root-ca.crt 1 113m configmap/my-config 2 24m NAME READY STATUS RESTARTS AGE pod/my-nginx 1/1 Running 0 9m35s
- my-config、my-nginxがそれぞれできている
- my-nginxにshで入る
$ kubectl exec my-nginx -it -- /bin/sh
- 設定したConfigMapが正しく反映されているかを確認
/ # echo $HOGE hoge / # echo $FUGA fuga
- 確認できたのでConfigMap、Podを削除
$ kubectl delete -f my-config.yaml configmap "my-config" deleted $ kubectl delete -f my-nginx-pod.yaml pod "my-nginx" deleted
Secretの作成
- 下記要素で作成
- Secret名:my-secret
- USER:user
- PASSWORD:password
$ kubectl create secret my-secret --from-literal=USER=user --from-literal=PASSWORD=password --dry-run=client -o yaml > my-config.yaml
- 作成したmy-secret.yamlをcatで確認
- USER、PASSWORDがそれぞれBase64で自動的にエンコードされる
my-secret.yaml
apiVersion: v1 data: PASSWORD: cGFzc3dvcmQ= USER: dXNlcg== kind: Secret metadata: creationTimestamp: null name: my-secret
- USER、PASSWORDがそれぞれBase64で自動的にエンコードされる
- my-nginx-pod.yamlをmy-nginx-pod-v3.yamlとしてコピー、containers配下に下記を追加(image、portsと同じ列)
- ConfigMapの時とだいたい同じ
my-nginx-pod.yamlをmy-nginx-pod-v3.yaml
spec: containers: - image: nginx:1.27.4-alpine … + env: + - name: USER + valueFrom: + secretKeyRef: + name: my-secret + key: USER + - name: PASSWORD + valueFrom: + secretKeyRef: + name: my-secret + key: PASSWORD
- ConfigMapの時とだいたい同じ
- Secret、Podをそれぞれデプロイ
$ kubectl apply -f my-secret.yaml secret/my-secret created $ kubectl apply -f my-nginx-pod-v3.yaml pod/my-nginx created
- Secret、Podができているか確認
- my-secret、my-nginxがそれぞれできている
$ kubectl get secret,pod NAME TYPE DATA AGE secret/my-secret Opaque 2 5m40s NAME READY STATUS RESTARTS AGE pod/my-nginx 1/1 Running 0 4m18s
- my-secret、my-nginxがそれぞれできている
- my-nginxにshで入る
$ kubectl exec my-nginx -it -- /bin/sh
- 設定したSecretが正しく反映されているかを確認
- デコードされた形で表示される
/ # echo $USER user / # echo $PASSWORD password
- デコードされた形で表示される
- 確認できたのでSecret、Podを削除
$ kubectl delete -f my-secret.yaml secret "my-secret" deleted $ kubectl delete -f my-nginx-pod-v3.yaml pod "my-nginx" deleted