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

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

# kubectl runコマンド
* Podの作成を行うコマンド

## Podの作成
1. 下記要素で作成
    * Pod名：my-nginx
    * コンテナのポート番号：80
    * イメージ：nginx:1.27.4-alpine
    * ラベル：`app: nginx`
    ```Terminal
    $ 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の内容でデプロイ
    ```Terminal
    $ kubectl apply -f my-nginx-pod.yaml
    pod/my-nginx created
    ```
4. Podができているのを確認
    ```Terminal
    $ kubectl get pod
    NAME       READY   STATUS    RESTARTS   AGE
    my-nginx   1/1     Running   0          19s
    ```
5. Podの削除(今回-fオプションでマニュフェストファイルを指定して削除)
    ```Terminal
    $ kubectl delete -f my-nginx-pod.yaml
    pod "my-nginx" deleted
    ```

# kubectl createコマンド
* DeploymentとかConfigMapとか作るコマンド
* helpで確認するとReplicaSetは対応していなかった
    ```Terminal
    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
    ```Terminal
    $ 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の内容でデプロイ
    ```Terminal
    $ kubectl apply -f my-nginx-deployment.yaml
    deployment.apps/my-nginx-deployment created
    ```
4. Deploymentができているのを確認
    ```Terminal
    $ 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固有の値>でPodが3つ作られている
    ```Terminal
    $ 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個になる 
        ```Terminal
        # 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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4029294/b16ee3a3-32f4-4849-b24c-774f8fdff4b2.png)
        * StrategyTypeを特に指定していないため、RollingUpdate方式の更新、25% max unavailable, 25% max surgeが指定されていたため
            ```Terminal
            $ 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オプションでマニュフェストファイルを指定して削除)
    ```Terminal
    $ 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
    ```Terminal
    $ 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をそれぞれデプロイ
    ```Terminal
    $ 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がそれぞれできている
        ```Terminal
        $ 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で入る
    ```Terminal
    $ kubectl exec my-nginx -it -- /bin/sh
    ```
7. 設定したConfigMapが正しく反映されているかを確認
    ```Terminal
    / # echo $HOGE
    hoge
    / # echo $FUGA
    fuga
    ```
8. 確認できたのでConfigMap、Podを削除
    ```Terminal
    $ 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
    ```Terminal
    $ 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をそれぞれデプロイ
    ```Terminal
    $ 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がそれぞれできている
        ```Terminal
        $ 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で入る
    ```Terminal
    $ kubectl exec my-nginx -it -- /bin/sh
    ```
7. 設定したSecretが正しく反映されているかを確認
    * デコードされた形で表示される
        ```Terminal
        / # echo $USER
        user
        / # echo $PASSWORD
        password
        ```
8. 確認できたのでSecret、Podを削除
    ```Terminal
    $ kubectl delete -f my-secret.yaml
    secret "my-secret" deleted
    $ kubectl delete -f my-nginx-pod-v3.yaml
    pod "my-nginx" deleted
    ```