1
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?

More than 3 years have passed since last update.

[02] [k8s]オンプレで静的プロビジョニングを実践してみる (NFS環境)

Last updated at Posted at 2021-08-29

概要

Kubernetes (k8s) の動的プロビジョニングの動作確認のために、
次を実践して、下表の通り 1マスタ・1ノードのオンプレ上に NFS を構築した.
[01] オンプレでの動的プロビジョニング用 NFS サーバの構築手順メモ (サーバ側)
[02] オンプレでの動的プロビジョニング用 NFS サーバの構築手順メモ (クライアント側)

本記事では オンプレ上で k8s を使って静的プロビジョニングを実践したときの手順 を記す.

No 用途 ノード名 形態 IP OS NIC 備考
1 k8sマスタ PC1 物理ホスト 192.168.10.115 Ubuntu18.04 eno1 NFSサーバである.
/export/nfs を公開している.
2 k8sノード node01 物理ホスト 192.168.10.84 Ubuntu18.04 eno1 NFSクライアントにする

参考にしたサイトおよび書籍

URL 備考
https://www.server-world.info/query?os=Ubuntu_20.04&p=nfs&f=1
15Stepで習得 Dockerから入るKubernetes K8s だけでなく、Ansible, Vagrant, GlusterFS のことなども学べる.
https://github.com/takara9/vagrant-k8s 『15Stepで習得 Dockerから入るKubernetes』の著者が公開されている GitHub.
Vagrant や Ansible コードを公開してくださっている.
https://github.com/takara9/vagrant-kubernetes 同上
https://github.com/takara9/codes_for_lessons 同上
https://nextpublishing.jp/book/12197.html 『解体kubeadm フェーズから読み解くKubernetesクラスタ構築ツールの全貌』を参考にして 1マスタ・1ノードを構築した.
http://netstars.co.jp/kubestarblog/kubestarblog5/k8s/ 5.《一目で分かる K8s 永続的なストレージプロセス》
https://qiita.com/YasuhiroABE/items/2e18bb546beea4660a99

手順

1. PV と PVC のマニフェストを作成する

下図左が PV, 下図右が PVC である.
storageClassName の名称は、両マニフェストで一致していれば何でも良い.

image.png

2. NFS サーバが公開するディレクトリ下にサブディレクトリを 100個作成する

下表 No 1 の物理PC での操作である.

No 用途 ノード名 形態 IP OS NIC 備考
1 k8sマスタ PC1 物理ホスト 192.168.10.115 Ubuntu18.04 eno1 NFSサーバである.
/export/nfs を公開している.

検証用ディレクトリの作成

検証用に 100個のディレクトリを作っておく.

/export/nfs/pv0001//export/nfs/pv0100/ を作成する

$ bash -c 'for i in `seq -w 0001 0100`; do sudo mkdir -p /export/nfs/pv$i; done'

アクセス権を付与しておく

検証用なので、余計な問題が生じないように 777 にしておく.

$ sudo chmod 777 /export/nfs/pv*

3. PV 用マニフェスト「nfs-pv0001.yml」を作成する

公式ドキュメント

nfs-pv.yml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv0001
spec:
  capacity:
    storage: 5Gi
  volumeMode: Filesystem
  accessModes:
  - ReadWriteOnce #! Once: 一度に読み書きできるノードは1つだけ
  persistentVolumeReclaimPolicy: Retain
  storageClassName: pv0001
  nfs:
    path: /export/nfs/pv0001
    server: 192.168.10.115

4. マニフェスト「nfs-pv0001.yml」を適用する

$ kubectl apply -f nfs-pv0001.yml 
persistentvolume/pv0001 created

5. 現在の PV の状態を見る (kubectl get pv -o wide)

$ kubectl get pv -o wide
NAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                STORAGECLASS   REASON   AGE   VOLUMEMODE
pv0001   5Gi        RWO            Retain           Bound    default/my-pvc0001                           73m   Filesystem

6. PVC 用のマニフェスト「nfs-pvc0001.yml」を作成する

公式ドキュメント

nfs-pvc0001.yml

下記 💊 は、後述する「nfs-pod0001.yml」における 💊 と対応している.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc0001 #! 💊
spec:
  accessModes:
    - ReadWriteOnce
  volumeMode: Filesystem
  resources:
    requests:
      storage: 5Gi
  storageClassName: pv0001

7. PVC 用のマニフェスト「nfs-pvc0001.yml」を適用する

$ kubectl apply -f nfs-pvc0001.yml

8. 現在の pv, pvc の状態を確認する

$ kubectl get pv,pvc -o wide
NAME                      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                STORAGECLASS   REASON   AGE   VOLUMEMODE
persistentvolume/pv0001   5Gi        RWO            Recycle          Bound    default/my-pvc0001   pv0001                  14s   Filesystem

NAME                               STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE   VOLUMEMODE
persistentvolumeclaim/my-pvc0001   Bound    pv0001   5Gi        RWO            pv0001         2s    Filesystem

9. Pod「nginx」から /export/nfs/pv0001 をマウントするためのマニフェスト「nfs-pod0001.yml」を作成する

nfs-pod0001.yml

apiVersion: v1
kind: Pod
metadata:
  name: my-nginx
spec:
  containers:
    - name: my-nginx
      image: nginx
      imagePullPolicy: IfNotPresent
      ports:
        - containerPort: 80
          name: web
      volumeMounts:
      - mountPath: /usr/share/nginx/html
        name: nginx-volume
  volumes:
    - name: nginx-volume
      persistentVolumeClaim:
        # 作成した PVC 名
        claimName: my-pvc0001 #! 💊 

10. Pod「nginx」から /export/nfs/pv0001 をマウントするためのマニフェスト「nfs-pod0001.yml」を適用する

$ kubectl apply -f nfs-pod0001.yml

11. PV, PVC, Pod の状態を見る (kubectl get pv,pvc,pod -o wide)

下記🌟より、PVC と PV が存在している.
また、🛑 から Pod「my-nginx」が稼働している.

$ kubectl get pv,pvc,po -o wide
NAME                      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                STORAGECLASS   REASON   AGE   VOLUMEMODE
persistentvolume/pv0001   5Gi        RWO            Retain           Bound    default/my-pvc0001🌟                         77m   Filesystem

NAME                               STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE   VOLUMEMODE
persistentvolumeclaim/my-pvc0001   Bound  🌟pv0001   5Gi        RWO                           77m   Filesystem

NAME                              READY   STATUS        RESTARTS   AGE     IP            NODE      NOMINATED NODE   READINESS GATES
pod/my-nginx                      1/1   🛑Running       0          5m44s   10.244.1.95   node01    <none>           <none>
略

12. 動作確認をする

Pod「my-nginx」にログインする

$ kubectl exec -it my-nginx -- bash

192.168.10.115 の /export/nfs/pv0001 をマウントしていることを確認する

下記🛑より、マウントに成功している.

root@my-nginx:/# df -hT
Filesystem                        Type     Size  Used Avail Use% Mounted on
overlay                           overlay   39G  3.7G   36G  10% /
tmpfs                             tmpfs     64M     0   64M   0% /dev
tmpfs                             tmpfs    3.9G     0  3.9G   0% /sys/fs/cgroup
/dev/sda1                         ext4      39G  3.7G   36G  10% /etc/hosts
shm                               tmpfs     64M     0   64M   0% /dev/shm
192.168.10.115:/export/nfs/pv0001 nfs      912G  273G  594G  32% /usr/share/nginx/html🛑
tmpfs                             tmpfs    3.9G   12K  3.9G   1% /run/secrets/kubernetes.io/serviceaccount
tmpfs                             tmpfs    3.9G     0  3.9G   0% /proc/acpi
tmpfs                             tmpfs    3.9G     0  3.9G   0% /proc/scsi
tmpfs                             tmpfs    3.9G     0  3.9G   0% /sys/firmware

マウントポイント「/usr/share/nginx/html/.」にデータを作成する

root@my-nginx:/# pwd > /usr/share/nginx/html/sample
root@my-nginx:/# date >> /usr/share/nginx/html/sample
root@my-nginx:/# cat /usr/share/nginx/html/sample 
/
Sat Jun 12 01:00:42 UTC 2021

Pod「my-nginx」を削除する

$ kubectl delete -f nfs-pod0001.yml 
pod "my-nginx" deleted

$ kubectl get pod my-nginx
Error from server (NotFound): pods "my-nginx" not found

Pod「my-nginx」を再度作成し、再び /export/nfs/pv0001/ をマウントする

$ kubectl apply -f nfs-pod0001.yml 
pod/my-nginx created

$ kubectl get pod my-nginx -o wide
NAME       READY   STATUS    RESTARTS   AGE   IP            NODE     NOMINATED NODE   READINESS GATES
my-nginx   1/1     Running   0          5s    10.244.1.96   node01   <none>           

$ kubectl get pv,pvc -o wide
NAME                      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                STORAGECLASS   REASON   AGE    VOLUMEMODE
persistentvolume/pv0001   5Gi        RWO            Retain           Bound    default/my-pvc0001                           103m   Filesystem

NAME                               STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE    VOLUMEMODE
persistentvolumeclaim/my-pvc0001   Bound    pv0001   5Gi        RWO                           103m   Filesystem

Pod「my-nginx」にログインして前回作成した /usr/share/nginx/html/sample が残っているかを確認する

root@my-nginx:/# cat /usr/share/nginx/html/sample 🛑
/
Sat Jun 12 01:00:42 UTC 2021

 

以上.

1
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
1
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?