落とし穴に立て札を立てるが如く

ハマりどころの解決が少しでも早くなることを願って書いていきます

Kubernetes の Volume、azureFile は azureFile 上のファイルの更新に追従する

f:id:nam_yu_sql:20220118061015j:plain この記事は cloud.config tech blog にもマルチポストしています。

tech-blog.cloud-config.jp

はじめに

Kubernetes で azureFile をマウントする Volume を使っていた際、本来アプリケーションが azureFile 上に配置した設定ファイルが更新されるとそれを検知して設定を更新する振る舞いをするはずなのにアプリケーションの設定が更新されないということが起きました。
問題切り分けのために、azureFile をマウントする Volume を設定したときに azureFile 上のファイルを更新するとその Volume をマウントしている Pod でもその更新が確認できるかどうかを検証してみたので、知見のため共有です。

結論から言うと

azureFile 上のファイルを更新すると、Pod 上から見たときのファイルもちゃんと更新されます。(当たり前と言えば当たり前)

検証の前提

検証手順

  1. AzureFile を用意します

AzureFile を使用するため、ストレージアカウントを作成します。
まずは Azure Portal の左上のハンバーガーボタンから、「+リソースの作成」をクリックします。
f:id:nam_yu_sql:20220118061029p:plain
作成できるリソースの種類の一覧から、ストレージアカウントを探し出し、その下の「作成」をクリックします。
f:id:nam_yu_sql:20220118061039p:plain
ストレージアカウント名、配置する先のリソースグループを設定します。冗長性については、こだわりなければ LRS で問題ないかと思います。
設定できたら「確認および作成」、「作成」をクリックしてストレージアカウントリソースを作成します。
f:id:nam_yu_sql:20220118061049p:plain
ストレージアカウントが作成できたら、Kubernetes からストレージアカウントに接続するためのキーを取得します。
そのリソースを選択してリソースの概要を開きます。
ブレードメニューから、「アクセスキー」を選択します。
f:id:nam_yu_sql:20220118061059p:plain
アクセスキー画面上部にある「キーの表示」ボタンをクリックし、非表示になっているシークレットを表示します。
表示したシークレットはコピーして手元に保存しておきます。
f:id:nam_yu_sql:20220118061109p:plain
2. ファイルをアップロードします

次は、AzureFile にファイルをアップロードします。
ストレージアカウントのブレードメニューから「ファイル共有」を選択します。
開いたファイル共有画面上部の「+ ファイル共有」をクリックします。
f:id:nam_yu_sql:20220118061205p:plain ファイル共有名として今回はsample、レベルは「ホット」を選択して作成ボタンを押します。
f:id:nam_yu_sql:20220118061214p:plain
ファイル共有を作成したらメニューに追加された作成したファイル共有を選択し、中に入ります。
ファイル共有内の画面上部の「アップロード」ボタンを押し、ファイルをアップロードします。
今回はsample.txtという名前のファイルにtest1と文字列を書き込んでアップロードしています。
これから先のマニフェストをそのまま使う場合、ファイル名は sample.txt にしておいてください。
f:id:nam_yu_sql:20220118061227p:plain
3. 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 の状態になれば成功です。

  1. 確認

今回作成した 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 が存在するはずなので、その行の右端の「・・・」メニューから、「編集」を選択します。
f:id:nam_yu_sql:20220118061301p:plain
するとファイルを直接変更できるようになるので、ファイルの中身をtest2に書き換えて上の「保存」ボタンを押して保存しましょう。
f:id:nam_yu_sql:20220118061311p:plain
それが終わったら再度以下の 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...

参考