これはなに
Oracle Cloud Infrastructure(OCI、OracleのIaaS)のFile Storage Service(FSS)は、少容量から始められて、高パフォーマンス、NFS接続を謳う共有ストレージサービスです。
このエントリーでは、OCI上に構築したKubernetesのPodに、FSSの共有ストレージをマウントする手順を書きます。
OCI上にKubernetesを構築するには、Terraformベースのインストーラーと、マネージドのKaaSサービスであるOracle Container Engine for Kubernetes(OKE)を使う方法があります。
このエントリーの手順は前者の方法で構築したクラスターで動作確認していますが、どちらでも適用可能と思います。
手順の概要
大まかな手順は以下のとおりです。
- FSSをセットアップする
- PodからFSSをマウントする
1 . FSSをセットアップする
まずはFSSをセットアップしていきます。
1-1. FSSのボリュームを作成する
OCIのコンソールにログインしたら、画面左上のハンバーガーメニューアイコンをクリックします。メニューが展開したら、File Systemsをクリックします。
File Systemsの画面が表示されたら、画面左下のメニューで、Kubernetesクラスターを構築してあるCompartmentを選択します。そのうえでCreate File Systemボタンをクリックします。
Create File Systemダイアログで、以下のように値を設定し、Create File Systemボタンをクリックします。
- File System Information
- CREATE IN COMPARTMENT: (Kubernetesクラスターを構築してあるCompartmentが選択されていることを確認)
- NAME: (値は任意。例えば fss4oke)
- AVAILABILITY DOMAIN: (任意。FSSを構成したいAvailability Domainを選択)
- Mount Target Informantion
- NAME: (任意。例えば fss-mount-target)
- VIRTUAL CLOUD NETWORK: (Kubernetesクラスターを構築してあるVCNを選択)
- SUBNET: (Worker Nodeが配置されるサブネットを選択。サブネットが配置されているADが、上のAVAILABILITY DOMAINで選択したものと一致すること)
- PATH: (任意。例えば /fss)
FSSが構成されたら、File Systemsの画面で、FSSの名前のリンク(上の例のとおりであればfss4oke)をクリックします。
Mount Targetの配下に、上記で作成したMount Targetが表示されています。この中にある、Private IP Adressをテキストエディタ等にコピーしておきます。
これでFSSのボリュームの作成が完了です。
1-2. FSSに接続するためのネットワークの設定を行う
OCIコンソールの画面左上のハンバーガーメニューアイコンをクリックします。メニューが展開したら、Virtual Cloud Networksをクリックします。
Kubernetesクラスターが構築してあるVCNの、名前のリンクをクリックします。
画面左のメニューでSecrity Listをクリックします。
KubernetesのWorker Nodeが配置されるサブネットに適用される、Security Listを選択します。
Security Listに、FSSとの通信を許可するための設定をしていきます。
Edit All Rulesボタンをクリックします。
Ingressのルールに、Stateful(StatelessのチェックをOFFに設定)のルールを作成していきます。
例えば、ルールの作成後に、以下の図のようなルール設定が追加されていればOKです。
以上でFSSのセットアップは完了です。
2 . PodからFSSをマウントする
ここまでの手順で構成したFSSを、2つのPodにマウントして共有ストレージとして使ってみます。
FSSはNFSとしてアクセスするので、PodにVolumeの設定をする方法は、一般的なNFSの共有ストレージをマウントする方法と変わりません。
2-1. Worker NodeにNFSをインストール
Worker NodeがNFSクライアントとして動く必要があるので、NFSをインストールしておく必要があります。
Worker NodeにSSH接続した上で、以下のコマンドを実行します(yumベースのパッケージマネージャを使っている例)。
$ sudo yum install nfs-utils
これをPodが配置されうるすべてのWorker Nodeに対して実施しておきます。
2-2. PodからFSSをマウント
ここでは、共有ストレージ上のテキストファイルに定期的にメッセージを追記するPod(hello-fss)と、そのファイルをtailするPod(welcome-fss)とを作成して、2つのPodから共有ストレージを利用できることを確認します。
まず、hello-fssのmanifestです。
apiVersion: v1
kind: Pod
metadata:
name: hello-fss
spec:
containers:
- name: hello-fss
image: busybox
args: [/bin/sh, -c, 'i=0; while true; do echo "$i: Hello FSS!">>/mnt/fss/hello.txt; i=$((i+1)); sleep 1; done']
volumeMounts:
- name: fss
mountPath: "/mnt/fss"
volumes:
- name: fss
nfs:
# FIXME: use the right IP
server: 10.0.40.8
path: "/fss"
__spec.volumes__配下にFSSのMount Targetの情報を記述しています。サーバーのアドレスは、先の手順で保存しておいたIPアドレス、パスはFSS作成時に指定したものになります。
この辺りは、通常のNFSボリュームをマウントするときの記述方法と全く変わりません。
__spec.containers.args__でコンテナが実行するコマンドを記述しており、FSS内のファイル(hello.txt)に定期的にメッセージを追記しています。
続いて、welcome-fssのmanifestです。
apiVersion: v1
kind: Pod
metadata:
name: welcome-fss
spec:
containers:
- name: welcome-fss
image: busybox
args: [/bin/sh, -c, 'tail -f /mnt/fss/hello.txt']
volumeMounts:
- name: fss
mountPath: "/mnt/fss"
volumes:
- name: fss
nfs:
# FIXME: use the right IP
server: 10.0.40.8
path: "/fss"
ボリュームのマウントに関連する記述は、hello-fssと同様です。
__spec.containers.args__のコマンドでは、hello-fssが作成するファイルをtailするにように記述しています。
これで、hello-fssがhello.txtにメッセージを追記していき、welcome-fssがhello.txtをtailした結果、その標準出力に追記内容が順次表示されていく、という動きになるはずです。
それでは動作確認してみます。まずはPodをデプロイします。
$ kubectl create -f hello-fss.yaml
pod "hello-fss" created
$ kubectl create -f welcome-fss.yaml
pod "welcome-fss" created
$ kubectl get po
NAME READY STATUS RESTARTS AGE
hello-fss 1/1 Running 0 10s
welcome-fss 1/1 Running 0 10s
続いてWelcome-fssの標準出力を確認します。
$ kubectl logs -f welcome-fss
0: Hello FSS!
1: Hello FSS!
2: Hello FSS!
3: Hello FSS!
4: Hello FSS!
5: Hello FSS!
6: Hello FSS!
7: Hello FSS!
8: Hello FSS!
こんな感じで Hello FSS! のメッセージが表示されていけばOKです。
これで、2つのPodから、FSSで構成したひとつの共有ストレージをマウントして、ファイルを操作できていることになります。
本エントリの手順は以上です。