Edited at

快適な kubernetes オンプレミス環境を構築する(7. NFSサーバ&NFSクライアントセットアップ)

More than 1 year has passed since last update.


シリーズ目次


  1. 設計編

  2. RancherOSインストール & セットアップ

  3. Rancher Server のセットアップ

  4. Kubernetes環境にホストを追加する

  5. nginx-ingress-controllerを使ったIngress環境のセットアップ

  6. SSL自動発行環境セットアップ(kube-lego)

  7. NFSサーバ&NFSクライアントセットアップ

  8. プライベートレジストリを構築する

  9. 総括


NFSサーバ&NFSクライアントセットアップ


  • NFS サーバと k8s から利用できるように NFS クライアントの役割を担う Pod を構築していきます


NFS サーバの構築


  • NFS サーバの構築は Ubuntu 16.04 上で行いました。「設計編」で紹介した Host E に構築していきます

  • OS のインストールなどは省きます


nfs-kernel-server インストール

sudo apt-get install -y nfs-kernel-server


/etc/exports の設定

$ sudo mkdir -p /opt/nfs

$ sudo vim /etc/exports # exports ファイルの編集。以下を追記
/opt/nfs 172.16.0.0/24(rw,sync,no_subtree_check,no_root_squash,no_all_squash)


nfs-kernel-server 起動

$ sudo systemctl enable nfs-kernel-server.service

$ sudo systemctl start nfs-kernel-server.service


Ubuntu 16.04 のバグへの対応 ( https://bugs.launchpad.net/ubuntu/+source/nfs-utils/+bug/1624715 )

sudo cp /lib/systemd/system/rpc-statd.service /etc/systemd/system/

echo "WantedBy=nfs-client.target" | sudo tee -a /etc/systemd/system/rpc-statd.service
sudo systemctl reenable rpc-statd.service
sudo systemctl restart rpc-statd.service


k8s 環境から NFS サーバのディレクトリをマウントして StorageClass として利用する

$ cat <<EOF | kubectl create -f -

kind: Deployment

apiVersion: extensions/v1beta1
metadata:
name: nfs-client-provisioner
spec:
replicas: 1
strategy:
type: Recreate
template:
metadata:
labels:
app: nfs-client-provisioner
spec:
containers:
- name: nfs-client-provisioner
image: quay.io/external_storage/nfs-client-provisioner:latest
volumeMounts:
- name: nfs-client-root
mountPath: /persistentvolumes
env:
- name: PROVISIONER_NAME
value: fuseim.pri/ifs
- name: NFS_SERVER
value: (NFS サーバのホスト名: host_d など)
- name: NFS_PATH
value: (マウントするパス: /opt/nfs など)
volumes:
- name: nfs-client-root
nfs:
server: (NFS サーバのホスト名)
path: (マウントするパス: /opt/nfs など)
EOF


  • つぎに StorageClass を定義します

$ cat <<EOF | kubectl create -f -

apiVersion: storage.k8s.io/v1beta1

kind: StorageClass
metadata:
name: managed-nfs-storage
provisioner: fuseim.pri/ifs # or choose another name, must match deployment's env PROVISIONER_NAME'
EOF


  • これで環境が整いました


動作確認


  • 作成した StorageClass で PVC (Persistent Volume Claim) をデプロイし、実際にディスクが確保されるか確認します

$ cat <<EOF | kubectl create -f -

kind: PersistentVolumeClaim

apiVersion: v1
metadata:
name: test-claim
annotations:
volume.beta.kubernetes.io/storage-class: "managed-nfs-storage"
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Mi
EOF



  • kubectl get pv を実行して、実際にディスクが追加されたか確認してみましょう


(蛇足) これどーやって動いてんの?


  • 最初自分も戸惑いましたが、レポジトリ ( https://github.com/kubernetes-incubator/external-storage/tree/master/nfs-client )に含まれている provisioner.go が動作するコンテナが k8s の Pod としてデプロイされて NFS のマウントなどを良しなにやってくれる、という仕組みになっているそうです

  • go が書ければ StorageClass など k8s の拡張もできそうですね


まとめ


  • これで、PVC の yaml をデプロイすることで NFS サーバからディスクを確保するまで完了しました

  • 次回からは(やっとこさ) プライベートレジストリの構築に入っていきましょう


  • プライベートレジストリを構築する に続く