この記事はなむゆの個人ブログにもマルチポストしています。
はじめに
Kubernetes で azureFile をマウントする Volume を使っていた際、本来アプリケーションが azureFile 上に配置した設定ファイルが更新されるとそれを検知して設定を更新する振る舞いをするはずなのにアプリケーションの設定が更新されないということが起きました。
問題切り分けのために、azureFile をマウントする Volume を設定したときに azureFile 上のファイルを更新するとその Volume をマウントしている Pod でもその更新が確認できるかどうかを検証してみたので、知見のため共有です。
結論から言うと
azureFile 上のファイルを更新すると、Pod 上から見たときのファイルもちゃんと更新されます。(当たり前と言えば当たり前)
検証の前提
- 利用可能な Azure のサブスクリプションがあること
- 利用可能な Kubernetes クラスターがセットアップ済みであること
検証手順
- AzureFile を用意します
AzureFile を使用するため、ストレージアカウントを作成します。
まずは Azure Portal の左上のハンバーガーボタンから、「+リソースの作成」をクリックします。
作成できるリソースの種類の一覧から、ストレージアカウントを探し出し、その下の「作成」をクリックします。
ストレージアカウント名、配置する先のリソースグループを設定します。冗長性については、こだわりなければ LRS で問題ないかと思います。
設定できたら「確認および作成」、「作成」をクリックしてストレージアカウントリソースを作成します。
ストレージアカウントが作成できたら、Kubernetes からストレージアカウントに接続するためのキーを取得します。
そのリソースを選択してリソースの概要を開きます。
ブレードメニューから、「アクセスキー」を選択します。
アクセスキー画面上部にある「キーの表示」ボタンをクリックし、非表示になっているシークレットを表示します。
表示したシークレットはコピーして手元に保存しておきます。
- ファイルをアップロードします
次は、AzureFile にファイルをアップロードします。
ストレージアカウントのブレードメニューから「ファイル共有」を選択します。
開いたファイル共有画面上部の「+ ファイル共有」をクリックします。
ファイル共有名として今回はsample
、レベルは「ホット」を選択して作成ボタンを押します。
ファイル共有を作成したらメニューに追加された作成したファイル共有を選択し、中に入ります。
ファイル共有内の画面上部の「アップロード」ボタンを押し、ファイルをアップロードします。
今回はsample.txt
という名前のファイルにtest1
と文字列を書き込んでアップロードしています。
これから先のマニフェストをそのまま使う場合、ファイル名は sample.txt にしておいてください。
- Kubernetes クラスターに設定を行います
サンプル用のファイルがアップロードできたら、次は Kubernetes 側で azureFile をマウントする Pod を作成する準備を行います。
azureFile タイプの Volume を使用する方法はこちらにあるのですが、あちらではコマンドベースで作業を行っています。
この記事ではもう少しお行儀よく、マニフェストファイルを作成してそれを適用する方法で進めていきたいと思います。
それでは、まずは以下の 3 つのマニフェストファイルを作成してください。
<>で囲っている部分については、1.で AzureFile を作成したときの情報をコピー&ペーストしてきておいてください。
00_secret.yaml
apiVersion: v1
stringData:
azurestorageaccountkey: <1でコピーしてきたストレージアカウントのシークレット>
azurestorageaccountname: <作成したストレージアカウントの名前>
kind: Secret
metadata:
name: azure-secret
00_pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: azurefile-pv
spec:
capacity:
storage: 1Gi
volumeMode: Filesystem
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
storageClassName: azurefile
azureFile:
secretName: azure-secret
shareName: sample
readOnly: true
00_pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: azurefile-pvc
spec:
accessModes:
- ReadWriteMany
volumeMode: Filesystem
resources:
requests:
storage: 1Gi
storageClassName: azurefile
01_pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: azurefile-test
spec:
containers:
- name: busybox
image: busybox
volumeMounts:
- name: storage
mountPath: /data/sample
command:
- sh
- -c
- "while true;do date; echo current sample file is:; cat /data/sample/sample.txt; echo; sleep 10; done"
volumes:
- name: storage
persistentVolumeClaim:
claimName: azurefile-pvc
準備できたら、これらのマニフェストファイルを上から順に適用していきます。
kubectl apply -f 00_secret.yaml
kubectl apply -f 00_pv.yaml
kubectl apply -f 00_pvc.yaml
kubectl apply -f 01_pod.yaml
pod が立ち上がり、Running の状態になれば成功です。
- 確認
今回作成した Pod は、10 秒おきに AzureFile 上にある sample.txt の中身を cat してログ出力するようにしています。
なので、ログを確認してみましょう。
kubectl logs azurefile-test
すると、以下のようなログが出力されているはずです。
Mon Jan XX XX:XX:XX UTC 2022
current sample file is:
test1
Mon Jan XX XX:XX:XX UTC 2022
current sample file is:
test1
それでは本題に入り、azureFile 上のファイルを更新して、Pod 上からもその更新が読み取れるか確認してみましょう。
まずは、再度 AzureFile のページを開きます。アップロードした sample.txt が存在するはずなので、その行の右端の「・・・」メニューから、「編集」を選択します。
するとファイルを直接変更できるようになるので、ファイルの中身をtest2
に書き換えて上の「保存」ボタンを押して保存しましょう。
それが終わったら再度以下の kubectl コマンドを実行します。
kubectl logs azurefile-test
すると以下のようなログが出力されるはずです。
ある時期を境に file の中身がtest2
になっていますね。
これにて azureFile のファイルに変更を加えると Pod から再度ファイルを取得したときにはその変更が読み取れることが確認できました。
Mon Jan XX XX:XX:XX UTC 2022
current sample file is:
test1
Mon Jan XX XX:XX:XX UTC 2022
current sample file is:
test1
Mon Jan XX XX:XX:XX UTC 2022
current sample file is:
test2
Mon Jan XX XX:XX:XX UTC 2022
current sample file is:
test2
おわりに
疑ってごめんね azureFile…