初学者がKubernetesをはじめてみた ~#3 nodeのpvとホストvolumeを同期し、podの中にpvcを設定するなど~

#はじめに
30代未経験からエンジニアを目指して勉強中のYNと申します。
インフラを勉強しだすと、k8sありきみたいな空気感に焦りますよね。キャッチアップのために学んだことなどを記録していきたいと思います。
[前回](https://qiita.com/theFirstPenguin/items/4342500d9d0eef289dc7)の続きです。

#やったこと
やったことを頑張って表題に表現しようとしましたが無理でした。
図にするとこんな感じです。
![スクリーンショット 2020-12-02 20.29.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572098/0f8c4780-2c5e-0baf-bfbf-cacfc9fe075e.png)

#事前準備
## `kubectl`を`k`にエイリアス
コマンドを`kubectl`から`k`にエイリアスすると楽です。そしてついでにコマンドの補完も追加しておきます。[詳細はこちらの記事を参照ください。](https://qiita.com/superbrothers/items/cd26ad2d266995ca7021)
以降、この記事では特に断りなく`kubectl`の代わりに`k`を使います。

```~/.zshrc
source <(kubectl completion zsh)
alias k=kubectl
complete -o default -F __start_kubectl k
```
## 常にコンポーネントの動きをみておく
```
watch 'kubectl get pod,service,namespace,deploy,ingress,cm,secret,persistentvolume,persistentvolumeclaim'
```
#コンポーネントをつくる
##secretをつくる
環境変数などを格納するsecretをつくります。

```
k create secret generic my-secret --from-literal=SECRET_KEY1=SECRET_VALUE1 --from literal=SECRET_KEY2=SECRET_VALUE2 --dry-run=client -o yaml > secret.yaml
k apply -f secret.yaml
```
```secret.yaml
apiVersion: v1
data:
  SECRET_KEY1: U0VDUkVUX1ZBTFVFMQ==
  SECRET_KEY2: U0VDUkVUX1ZBTFVFMg==
kind: Secret
metadata:
  creationTimestamp: null
  name: my-secret
```

##configmapをつくる
key-valueストアとして情報を格納するのにconfigmapを使います。

```
k create configmap my-config --from-literal=TEST_ENV=Hello_World --dry-run=client -o yaml > configmap.yaml
k apply -f congifmap.yaml
```
```configmap.yaml
apiVersion: v1
data:
  TEST_ENV: Hello_World
kind: ConfigMap
metadata:
  creationTimestamp: null
  name: my-config
```
##pvをつくる
nodeの中にpvを作ります。

```pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv
spec:
  storageClassName: manual
  capacity:
    storage: 100M
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/pvc"
```
```
k apply -f pv.yaml
```

##pvcを定義する
podの情報はpodと共に消えてしまいます。podが消えたのちにpodがもつ情報を保持するためにはpvcを使ってpvに書き込むことです。
pvcにはpvから記憶領域の取り分を定義します。

```pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10M
```
```
k apply -f pvc.yaml
```

# podをつくる
コンポーネントをつなぎ合わせて下図のpodをつくります。
![スクリーンショット 2020-12-02 20.29.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572098/40edb458-c9ad-c5f3-63e9-c1ed7d690752.png)

```pod.yaml
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: helloworld-pod
  name: helloworld-pod
spec:
  containers:
    - image: gcr.io/google-samples/hello-app:1.0
      name: helloworld-pod
      env:
        - name: TEST_ENV
          valueFrom:
            configMapKeyRef:
              name: my-config
              key: TEST_ENV
      ports:
        - containerPort: 8080
      resources: {}
      volumeMounts:
        - name: my-pv
          mountPath: /mnt/pvc
        - name: my-config-volume
          mountPath: /my-config/TEST_ENV
        - name: my-secret-volume
          mountPath: /my-secret
          readOnly: true
  volumes:
    - name: my-pv
      persistentVolumeClaim:
        claimName: pvc
    - name: my-config-volume
      configMap:
        name: my-config
        items:
          - key: TEST_ENV
            path: keys
    - name: my-secret-volume
      secret:
        secretName: my-secret
```
#nodeのpvとホストvolumeの同期動作確認
Pod内のコンテナにシェルで入り、ファイルを`/mnt/pvc/from_pod.txt`上に作成する

```
k exec -it helloworld-pod sh
echo "from pod" > /mnt/pvc/from_pod.txt
cat /mnt/pvc/from_pod.txt
```
Nodeにsshして入り、Pod内のコンテナで作成した`/mnt/pvc/from_pod.txt`がNode上にあることを確認できる

```
minikube ssh
cat /mnt/pvc/from_pod.txt 
```

#学習ログ的解説
##configmapを定義する
![スクリーンショット 2020-12-02 20.59.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572098/16d48e3d-587b-ffac-97d5-90d55bee5c78.png)

##podに記憶領域を定義する
![スクリーンショット 2020-12-02 21.02.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572098/e1689f8e-5a39-bcc7-ec49-f4ff6c884635.png)

##podの記憶領域の中にconfigmapを定義する
![スクリーンショット 2020-12-02 21.02.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572098/47e26a3d-5de9-b46a-09d5-ca0d28cd37ba.png)

##podの記憶領域の中にsecretを定義する
![スクリーンショット 2020-12-02 21.04.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572098/05836993-4d4f-c78f-c9af-6fab22f7975f.png)

##pvについて
![スクリーンショット 2020-12-02 21.05.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572098/56f10751-c634-2449-5c69-7045166af9ee.png)

##pvcを定義する
![スクリーンショット 2020-12-02 21.06.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572098/d3abcf13-f490-bb08-d156-aed28ab0ac08.png)


#最後に
完全に自己満な学習ログとなってしまいました。今後もk8sの勉強をがんばっていきたいです。