銀の光と碧い空

クラウドなインフラとC#なアプリ開発の狭間にいるエンジニアの日々

kubernetes on Azure の1.7~1.9あたりの更新をまとめてみた

Release Notesにリンクされているものをみると、さらっと一文ですまされているところが実はいろいろ更新されていたのでまとめてみました。なお、すべて修正内容のコメントとソースを見ただけでまだ試してはないです。あと断定形で書いてますが、あやしいところがあればコメントもらえると助かります。

kubernetes 1.7

全体のリリースノートはこちら。

kubernetes/CHANGELOG-1.7.md at master · kubernetes/kubernetes · GitHub

Azure Managed Diskを永続化ディスクとして使用可能にする

いままではUnmanaged Diskしか使えなかったのをManaged Diskも利用可能になりました。コード的には大規模な変更になっています。 github.com

どうも説明を読んでいると、これ以前のバージョンではAzure Diskを利用するpodがnodeを移動するときに問題があったり、パフォーマンス的にいけてないとか書いてあったりします。これについては、AKS,OpenShift 3.7の両方でテスト済みです。AKSの記事はこちらをどうぞ。

tech.tanaka733.net

OpenShiftはアカウント登録が必要ですが、こちらにあります。

OpenShift Container Platform on Microsoft Azure with Azure Disk failed to create a pod with Persistent Volume - Red Hat Customer Portal

Azure Fileをglobal Azure(通常のpublic Azureクラウド)以外のAzure環境(Azure GermanyやChinaなど)でも利用可能にする

github.com

通常のglobal Azure region以外に、Azure GermanyなどもkubernetesやOpenShiftはサポートしています。azure configurationファイルにCLOUDというキーがあり、そこでAZUREGERMANCLOUDなどと指定することでAPIのエンドポイントの変更に対応できます。

kubernetes/azure.go at 1586823c9414a1f4db5553b964782326cfabde9b · clement-buchart/kubernetes · GitHub

kubernetes/azure.go at 1586823c9414a1f4db5553b964782326cfabde9b · clement-buchart/kubernetes · GitHub

のですが、Azure Fileだけエンドポイントがハードコードされていたのでその修正が入りました。

kubernetesが存在するresource group以外のVNetも許容する

github.com

いままではVNetはkubernetesが配置されているresource groupと同じresource groupに存在するのが前提でしたが、vnetResourceGroupというキーでAzure Configuration ファイルに指定すると、VNetが別のresource groupに存在してもいいようになりました。なお、VNetはAzure Load Balancerを作成するときに利用されるようです。

Azure Load Balancerのhealthprobeで名前とポートの両方をチェックするようにした

github.com

Azure Load Balancerリソースを使う際に、nodeportsの変更に追随するようにしました。

1.8

全体のリリースノートはこちら。

kubernetes/CHANGELOG-1.8.md at master · kubernetes/kubernetes · GitHub

Azure File/Diskをマウントする際のパーミッションを0755にする。

github.com

いままで0700だったのを0755に変更しました。

Standard_GRS, Standard_RAGRS をAzure Storageのオプションとしてサポート

github.com

Azure Diskを永続化ディスクとして利用する際のオプションとして、Standard_LRSとPremium_LRS に加えて Standard_GRSとStandard_RAGRSがサポートされるようになりました。指定する場所はstorageclassのstorageaccounttypeになります。

Azure Fileを永続化ディスクとして使う場合にマウントオプションをサポートする

github.com

Azure Fileを永続化ディスクとしてマウントする場合、LinuxのCIFSモジュールを使ってマウントするのですが、その際のマウントオプションをstorageclassの中で指定できるようになりました。これ使うとパスワードとか渡せるので、Linux側がSMB 3.0の暗号化プロトコルに対応していれば*1、Regionの異なるAzure Fileにもマウントできるのではと思います。

Azure DiskとFileをWindowsノードにもマウント可能にする

github.com github.com

Azure DiskとAzure FileをWindowsノードにもマウントできるよう、マウントパスにドライブレターが指定でき、Linux全体の制約がいくつか消えました。

インスタンスメタデータサービスのサポート

github.com github.com

インスタンスメタデータサービスからノードに関する情報を取得するようになりました。ノードのホスト名とプライベートIPとVMサイズなどの取得にまず使っているようです。useInstanceMetadataをAzure configurationファイルで有効にしておく必要があります。コードを見るかぎり、VM名とノード名が一致しないといけない制約はまだありそうです。

API実行時のリトライフローの改善

github.com github.com

仮想マシンの状態を取得するときなどにAPIを実行しますが、エラーが起きた際のリトライフローの改善が行われました。

Azure Fileの共有名を自動生成する際に妥当な名前を生成するようにした

github.com

Azure Fileの共有を自動生成する際に、Azure側の制約に沿った妥当な名前を生成するようにしました。

デバイス名の変更によるkubelet再起動時に発生する問題の対処

github.com github.com

デバイス名が変更されると、kubelet再起動時に起動しなくなる問題があったため、マウントパスのチェックと再マウント処理を追加しました。マウント先を/dev/sd*から/dev/disk/by-idに変え変更されないようにしています。

Azure FIleを利用したPVCの作成に失敗したときのエラーメッセージの改善

github.com

ストレージキーの不一致や、共有の作成失敗などの際もすべてfailed to find a matching storage accountと表示されていたのを変更しました。

ストレージアカウント初期化処理の改善

github.com

不要な初期化処理をなくし、on-demandで初期化するようにしました。

既存のノードが属するAvailability Setに存在しないノードを追加する際にクラッシュしないようにした

github.com

AKSでノードを手動追加する際に発生していたバグのようですが、原理としては、最初に構築したノードは1つのAvailabilitySetに属していて、そのAvailabilitySetに属さないノードを後から追加する際に、クラッシュしていたので、それを防止するコードを追加しています。

VolumeSource.ReadOnlyがnilの際にクラッシュしないようにした

github.com

nilの場合はデフォルト値としてfalseを設定するようにしました。

Azure Fileに接続する際に利用するsecretを別のnamespaceのものを参照できるようにした。

github.com

secretNamespaceを指定することで、別のnamespaceのsecretを利用できるようにしました。

kubectlの認証にAzure Active Directoryのプラグインが利用できるようにした

github.com

1.9

全体のリリースノートはこちら。

kubernetes/CHANGELOG-1.9.md at master · kubernetes/kubernetes · GitHub

[1.7から1.9へ変更]サービスプリンシパルをMSIから取得できるようにする

github.com

いままではAzure Configuration ファイルにAPIを実行するためのサービスプリンシパルのIDとかパスワードを指定していたのですが、それらをManaged Service Identity経由で受け取れるようになりました。

(2018/02/02 17:10 追記) 1.7で使える!と思って試したら動かなくて、じつはバグがあって1.9で修正されています。 github.com

ServiceをAzure DNS経由でpublic IPに解決するためのアノテーションを導入した

github.com

service.alpha.kubernetes.io/label-name: myserviceというアノテーションをkubernetesのサービスに設定すると、myservice.<azure-region>.cloudapp.azure.comというAzure DNSのレコード経由でpublic IPに解決してくれるようになります。

Azure FileをWindowsノードにマウントする際、上限を越えたらエラーを出すようにした

github.com

Windowsの場合、ネットワークドライブとしてマウントするので、ドライブレターの上限を超えたらマウントできなくなります。その際のエラメッセージを出すようになりました。

*1:RHELについては7.5 beta1で使用可能になっているので、このままいけば7.5で対応予定