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


はじめに

30代未経験からエンジニアを目指して勉強中のYNと申します。
インフラを勉強しだすと、k8sありきみたいな空気感に焦りますよね。キャッチアップのために学んだことなどを記録していきたいと思います。
前回の続きです。

やったこと

やったことを頑張って表題に表現しようとしましたが無理でした。
図にするとこんな感じです。

事前準備

kubectlkにエイリアス

コマンドをkubectlからkにエイリアスすると楽です。そしてついでにコマンドの補完も追加しておきます。詳細はこちらの記事を参照ください。
以降、この記事では特に断りなく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をつくります。

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を定義する

podに記憶領域を定義する

podの記憶領域の中にconfigmapを定義する

podの記憶領域の中にsecretを定義する

pvについて

pvcを定義する

最後に

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