銀の光と碧い空

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

Azure File Storage を kubernetes のボリュームとして使ってみる

Azure File StorageがLinuxからも利用できるので試そうと思ったのですが、せっかくなので単純にアタッチするのではなく kubernetes のボリュームとして使ってみようと思いました。

azure.microsoft.com

github.com

準備

Azure File Storageの作成

kubernetes を起動するマシンと同じリージョンにAzure Storageのアカウントを作成します。作成したら、さらにFile サービスを作っておきます。Storage アカウントのアカウント名と鍵、File Storageの共有名が後々必要になります。下のスクリーンショットでは、k8sがStorage アカウント名、key1もしくはkey2が鍵、k8sfsがFile Storageの共有名になります。

f:id:tanaka733:20160429132129p:plain

f:id:tanaka733:20160429132300p:plain

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が先ほど作成した秘密データのnameshareNameが最初に作成した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時くらいの山も、同じように検証していた状況)

f:id:tanaka733:20160429133659p:plain

起動したら、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側にもファイルが作成されました。

f:id:tanaka733:20160429135926p:plain