Azure File StorageがLinuxからも利用できるので試そうと思ったのですが、せっかくなので単純にアタッチするのではなく kubernetes のボリュームとして使ってみようと思いました。
準備
Azure File Storageの作成
kubernetes を起動するマシンと同じリージョンにAzure Storageのアカウントを作成します。作成したら、さらにFile サービスを作っておきます。Storage アカウントのアカウント名と鍵、File Storageの共有名が後々必要になります。下のスクリーンショットでは、k8sがStorage アカウント名、key1もしくはkey2が鍵、k8sfsがFile Storageの共有名になります。
kubernetes のセットアップ
今回はAzure Marketplaceに用意されている CentOS 7.2 を使いました。
Microsoft Azure Marketplace にある CentOS-based 7.2
今回はここにある手順でこのCentOS単体で動くようにしてみます。
Kubernetes - Running Kubernetes Locally with No VM
dockerとetcdとgoをセットアップします。etcdはインストール手順のリンク先にはetcdプロセスを起動するように書いていますが、この後kubernetesが自動で起動するので起動しないでください。
$ sudo -i # curl -fsSL https://get.docker.com/ | sh # curl -L https://github.com/coreos/etcd/releases/download/v2.3.2/etcd-v2.3.2-linux-amd64.tar.gz -o etcd-v2.3.2-linux-amd64.tar.gz # tar xzvf etcd-v2.3.2-linux-amd64.tar.gz # wget https://storage.googleapis.com/golang/go1.6.2.linux-amd64.tar.gz # tar -C /usr/local -xzf go1.6.2.linux-amd64.tar.gz # export PATH=$PATH:$HOME/bin:$HOME/etcd-v2.3.2-linux-amd64:/usr/local/go/bin
ついで、kubernetes をセットアップします。手順にはバイナリリリースがリンクされていますが、手順のスクリプトはソースにしかないので、リポジトリを丸ごとダウンロードします。バージョンはとりあえずドキュメントのタグが打たれている v1.2.0 にしておきました。
# yum install -u gcc # export K8S_VERSION=v1.2.0 # wget https://github.com/kubernetes/kubernetes/archive/${K8S_VERSION}.tar.gz # cd kubernetes-1.2.0/ # hack/local-up-cluster.sh <中略> To start using your cluster, open up another terminal/tab and run: cluster/kubectl.sh config set-cluster local --server=http://127.0.0.1:8080 --insecure-skip-tls-verify=true cluster/kubectl.sh config set-context local --cluster=local cluster/kubectl.sh config use-context local cluster/kubectl.sh
hack/local-up-cluster.sh
を起動すると、初期はビルドが走って、こんなメッセージが出て起動します。あとは別ターミナルで表示されているようなコマンドを実行できる状態になります。
Azure File Storageを使うpodを立ち上げる
Azure File Storageを利用するためには、Azure Storageへの接続情報をkubernetes secret
コマンドを使って秘密情報といて保存しておく必要があります。保存する情報はStorage Accountのアカウント名と鍵ですが、どちらもbase64エンコードした値を記述する必要があります。改行などを含めてBase64しないように気を付けてください。
このような形式でsecret.yaml
などの名前で保存しておきます。nameのazure-secretは任意の名前でいいですが、次の手順でこの名前を参照します。
apiVersion: v1 kind: Secret metadata: name: azure-secret type: Opaque data: azurestorageaccountname: azhz azurestorageaccountkey: eElGMXpKYm5ub2pGTE1Ta0JwNTBteDAyckhzTUsyc2pVN21GdDRMMTNob0I3ZHJBYUo4akQ2K0E0NDNqSm9nVjd5MkZVT2hRQ1dQbU02WWFOSHk3cWc9PQ
# cluster/kubectl.sh create -f ~/secret.yaml secret "azure-secret" created
そして、podを作成するために同じように設定ファイルを作成します。 azureFile
の下のsecretName
が先ほど作成した秘密データのname
、shareName
が最初に作成したAzure File Storageの共有名になります。
apiVersion: v1 kind: Pod metadata: name: nginx-pod spec: containers: - image: nginx name: nginx-container volumeMounts: - name: azure mountPath: /mnt/azure volumes: - name: azure azureFile: secretName: azure-secret shareName: k8sfs readOnly: false
podを作成します。
# cluster/kubectl.sh create -f ~/nginx.yaml pod "nginx-pod" created
あとは、 get pods
でpodのstatusを確認したり、describe pod azure
で詳細ログを見たりします。
# cluster/kubectl.sh get pods NAME READY STATUS RESTARTS AGE nginx-pod 1/1 Running 0 6m # cluster/kubectl.sh get pods NAME READY STATUS RESTARTS AGE azure 1/1 Running 0 12m nginx-pod 1/1 Running 0 6m [root@centos72 kubernetes-1.2.0]# cluster/kubectl.sh describe pod nginx-pod Name: nginx-pod Namespace: default Node: 127.0.0.1/127.0.0.1 Start Time: Fri, 29 Apr 2016 04:47:53 +0000 Labels: <none> Status: Running IP: 172.17.0.3 Controllers: <none> Containers: nginx-container: Container ID: docker://c3435758c9783f3ce43bdb4062fc8e1d49332deea445831bdb831ab45759fd4f Image: nginx Image ID: docker://sha256:6f8d099c3adc0f9c14bdc11d6c698a647c2f0457aa1ae76a592d6f7dc9bdb5b8 Port: QoS Tier: cpu: BestEffort memory: BestEffort State: Running Started: Fri, 29 Apr 2016 04:49:06 +0000 Ready: True Restart Count: 0 Environment Variables: Conditions: Type Status Ready True Volumes: azure: <unknown> default-token-wnp5v: Type: Secret (a volume populated by a Secret) SecretName: default-token-wnp5v Events: FirstSeen LastSeen Count From SubobjectPath Type Reason Message --------- -------- ----- ---- ------------- -------- ------ ------- 7m 7m 1 {default-scheduler } Normal Scheduled Successfully assigned nginx-pod to 127.0.0.1 7m 7m 1 {kubelet 127.0.0.1} spec.containers{nginx-container} Normal Pulling pulling image "nginx" 6m 6m 1 {kubelet 127.0.0.1} spec.containers{nginx-container} Normal Pulled Successfully pulled image "nginx" 6m 6m 1 {kubelet 127.0.0.1} spec.containers{nginx-container} Normal Created Created container with docker id c3435758c978 6m 6m 1 {kubelet 127.0.0.1} spec.containers{nginx-container} Normal Started Started container with docker id c3435758c978
こんな感じで書き込みされている様子がわかります。(手前にある1時くらいの山も、同じように検証していた状況)
起動したら、docker ps
でdockerのコンテナIDを見つけて、中に入ってマウントされたストレージに書き込んでみます。
# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c3435758c978 nginx "nginx -g 'daemon off" 7 minutes ago Up 7 minutes k8s_nginx-container.535f2595_nginx-pod_default_88db7e95-0dc5-11e6-ba3e-000d3a402382_1f19dcb5 # docker exec -it c3435758c978 bash root@nginx-pod:/# echo "Hello Azure File Storage" >> /mnt/azure/test
File Storage側にもファイルが作成されました。