0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Pod,Deployment,ConfigMap,Secretをdry-runでつくってみる

Last updated at Posted at 2025-03-10

作成の目的

  • サクッとマニュフェストファイル作れる方法習得したい
  • Pod、Deploymentの作り方はわかったけど他がわからないのでわかるようにする

kubectl runコマンド

  • Podの作成を行うコマンド

Podの作成

  1. 下記要素で作成
    • 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 
    
  2. 作成した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: {}
    
  3. 作成したmy-nginx-pod.yamlの内容でデプロイ
    $ kubectl apply -f my-nginx-pod.yaml
    pod/my-nginx created
    
  4. Podができているのを確認
    $ kubectl get pod
    NAME       READY   STATUS    RESTARTS   AGE
    my-nginx   1/1     Running   0          19s
    
  5. 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の作成

  1. 下記要素で作成
    • 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
    
  2. 作成したmy-nginx-deployment.yamlをcatで確認
    • createコマンドにて--labelsオプションが存在しなかったが、Deploymentと同じ名前でapp: <ラベル名>としてつけられているので、必要ないということなのか
    my-nginx-deployment.yaml
    apiVersion: 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: {}
    
  3. 作成したmy-nginx-deployment.yamlの内容でデプロイ
    $ kubectl apply -f my-nginx-deployment.yaml
    deployment.apps/my-nginx-deployment created
    
  4. Deploymentができているのを確認
    $ kubectl get deployment
    NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
    my-nginx-deployment   3/3     3            3           84s
    
  5. 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
    
  6. 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が作成されている
        スクリーンショット 2025-03-10 180055.png
      • 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
        …
        
  7. Deploymentの削除(今回-fオプションでマニュフェストファイルを指定して削除)
    $ kubectl delete -f my-nginx-deployment.yaml
    deployment.apps "my-nginx-deployment" deleted
    
    • Deploymentの削除を行ったため、kubectl get podを行っても、my-nginx-deploymentに関するPodは取得できない

ConfigMapの作成

  1. 下記要素で作成
    • 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
    
  2. 作成したmy-config.yamlをcatで確認
    my-config.yaml
    apiVersion: v1
    data:
      FUGA: fuga
      HOGE: hoge
    kind: ConfigMap
    metadata:
      creationTimestamp: null
      name: my-config
    
  3. 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
      
  4. ConfigMap、Podをそれぞれデプロイ
    $ kubectl apply -f my-config.yaml
    configmap/my-config created
    $ kubectl apply -f my-nginx-pod-v2.yaml
    pod/my-nginx created
    
  5. 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
      
  6. my-nginxにshで入る
    $ kubectl exec my-nginx -it -- /bin/sh
    
  7. 設定したConfigMapが正しく反映されているかを確認
    / # echo $HOGE
    hoge
    / # echo $FUGA
    fuga
    
  8. 確認できたのでConfigMap、Podを削除
    $ kubectl delete -f my-config.yaml
    configmap "my-config" deleted
    $ kubectl delete -f my-nginx-pod.yaml
    pod "my-nginx" deleted
    

Secretの作成

  1. 下記要素で作成
    • 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
    
  2. 作成した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
      
  3. 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
      
  4. Secret、Podをそれぞれデプロイ
    $ kubectl apply -f my-secret.yaml
    secret/my-secret created
    $ kubectl apply -f my-nginx-pod-v3.yaml
    pod/my-nginx created
    
  5. 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
      
  6. my-nginxにshで入る
    $ kubectl exec my-nginx -it -- /bin/sh
    
  7. 設定したSecretが正しく反映されているかを確認
    • デコードされた形で表示される
      / # echo $USER
      user
      / # echo $PASSWORD
      password
      
  8. 確認できたのでSecret、Podを削除
    $ kubectl delete -f my-secret.yaml
    secret "my-secret" deleted
    $ kubectl delete -f my-nginx-pod-v3.yaml
    pod "my-nginx" deleted
    
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?