aptpod Tech Blog

株式会社アプトポッドのテクノロジーブログです

Volterraのサービスでintdashを動かしてみた

f:id:aptpod_tech-writer:20210225200520p:plain

はじめに

SRE チームの川又です。

Volterraはグローバルで優れたEdge-as-a-Service プラットフォームサービスを提供する事で注目を集めています。 先日、F5, Inc. に買収された事でも話題になりました。

一方、弊社intdash の一部を構成する intdash Server は基本的にクラウド上で動作させます。 ですが、お客様の要件によってはEdge 環境で動作させる事もあります。 SRE チームの検討課題の1つとして、Edge 環境における効率的なサーバアプリケーションの管理・提供 があります。

以上の背景から、今回はVolterraのサービスプラットフォーム上でintdash Server の一部であるintdash のbackend service を簡易に動作させてみましたのでご紹介します。

Volterra について

前述の通り、Volterra はグローバルスケールで優れたEdge-as-a-Service プラットフォームを提供しています。 クラウド・Edge 環境を統一的に扱いセキュアでスケーラブルなアプリケーションセントリックインフラストラクチャを構成可能なSaaS 製品です。 特に以下の点に特徴を感じています。

  • dev, devops, security エンジニアが統一されたコンソールで一元的な管理が可能
  • 豊富な機能を備えたグローバルバックボーンネットワークを保有している

Volterra のCo-founder & CEO であるAnkur Singla 氏は Juniper Networks, Inc. に買収されたContrail Systems の創設者かつCEO を務めていた方ですので、 ネットワーク技術がこの優れたコンセプトを構成する重要な要素の1つとなっていると考えられます。

正式・詳細な情報に関しては公式ドキュメントをご覧ください。

Volterra のサービス

Volterra のサービスは主に、以下2 つのサービスで構成されます。

分散されたインフラストラクチャ上で統一されたアプリケーション管理を可能にする VoltStack と それらをグローバルスケールでセキュアに接続する VoltMesh です。

VoltStack

VoltStackVolterra Node と呼ばれるmanaged Kubernetes をVolterra Console と呼ばれる管理画面で一元的に制御可能にするSaaS です。

Volterra Node はクラウドまたはEdge 環境で動作させ、ユーザがセットアップを行います。 Volterra Console はWebUI であり、Volterra Node はグローバルな分散コントロールプレーンで管理されます。 それぞれのmanaged Kubernetes は仮想的に1つのVirtual Kubernetes として取り扱うことが可能です。

正式・詳細な情報に関しては公式ドキュメントをご覧ください。

VoltMesh

VoltMesh はVolterra のバックボーンネットワークを介してVoltStack 間を接続します。 Volterra のバックボーンネットワーク内のRegional Edge(RE) とCustomer Edge(CE) の Volterra Node 内で動作し セキュアでisolate されたネットワーク接続を提供します。 また、ロードバランサやWeb Application Firewall(WAF) の機能も豊富でネットワーク機能を一元的に管理することが可能です。

正式・詳細な情報に関しては公式ドキュメントをご覧ください。

実際に使ってみた

今回はこれらのVolterra サービスを用いて弊社intdash Server のbackend service を簡易に動作させてみました。 プランはお試しのためFree プランを使ってみました。 Free プランには一部機能制限の他、各種リソースの利用制限がありますが簡易な動作確認には十分です。

プラン毎の制限事項の詳細はこちらをご覧ください。

また、本検証は非公式ではありますが以下のチュートリアルを参考にさせて頂きました。

本検証構成の概要図は以下です。

f:id:aptpod_tech-writer:20210225200604p:plain

Volterra Node のインストールと設定

まずは、managed Kubernetes である Volterra Node のインストールと設定を行います。 Volterra Node のイメージはこちらからダウンロード可能です。

今回はKVM 上にインストールしますので Certified Hardware & KVM Images のイメージを選択してダウンロードします。 流れとしては、このイメージでOS のインストールと初期設定を行い、Volterra Console からSoftware のセットアップを実行します。

ダウンロードしたイメージをKVM 環境に設置したら以下のコマンドで仮想マシンを作成します。 disk のパスやイメージのパスは適宜環境に合わせてください。

また、Volterra Node の要求スペックや動作確認環境の情報はこちらをご覧ください。

virt-install --name site4 --ram 8192 --vcpus 4 --disk path=/var/lib/libvirt/images/site4.qcow2,format=qcow2,size=20 --network bridge=virbr0,model=virtio --cdrom /home/lab/Downloads/vsb-ves-ce-certifiedhw-generic-production-centos-7.2006.9-202010131432.1602604079.iso --noreboot --autostart --cpu host-passthrough

次に、Volterra Node の初期設定を行うためにVolterra Console でToken を発行します。

以下の様に、Volterra ConsoleSystem タブのSite Management -> Site Tokens からToken を発行できます。Name を入力し、Add Site Token を選択しTokenを発行します。

f:id:aptpod_tech-writer:20210224120636p:plain
Tokenの発行

発行したToken のUID を確認したら、作成したVolterra Node にSSH 接続します。 初期 ID/PASS は admin/Volterra123 です。ログインしたら以下の様に初期設定を行います。

 /$$    /$$          /$$   /$$
| $$   | $$         | $$  | $$
| $$   | $$ /$$$$$$ | $$ /$$$$$$    /$$$$$$   /$$$$$$   /$$$$$$  /$$$$$$
|  $$ / $$//$$__  $$| $$|_  $$_/   /$$__  $$ /$$__  $$ /$$__  $$|____  $$
 \  $$ $$/| $$  \ $$| $$  | $$    | $$$$$$$$| $$  \__/| $$  \__/ /$$$$$$$
  \  $$$/ | $$  | $$| $$  | $$ /$$| $$_____/| $$      | $$      /$$__  $$
   \  $/  |  $$$$$$/| $$  |  $$$$/|  $$$$$$$| $$      | $$     |  $$$$$$$
    \_/    \______/ |__/   \___/   \_______/|__/      |__/      \_______/

WELCOME IN VOLTERRA NODE LOGIN SHELL
This allows to:
- configure Volterra Node registration information
- factory reset Volterra Node
- collect debug information for support
Use TAB to select various options.
You must change password during first login:
? Please type your current password ***********
### 初期パスワードを変更します。
? Please type your new password **********
? Please retype your new password **********
>>> configure
### 先ほど発行したToken のUID を設定します。
? What is your token? $TOKEN_UID
### 任意のsite 名ホスト名を設定します。
? What is your site name? [optional] site4
? What is your hostname? [optional] site4-0
### site の緯度経度を設定します。Volterra Console のMap で描画される際に参照されます。
### site4 は仮想的に大阪の緯度経度とします。
? What is your latitude? [optional] 34.6776234
? What is your longitude? [optional] 135.4160243
? What is your default fleet name? [optional] trial-vk8s
? Select certified hardware: kvm-volstack-combo
? Select primary outside NIC: eth0
certifiedHardware: kvm-volstack-combo
clusterName: site4
fleet: trial-vk8s
hostname: site4-0
latitude: 34.677624
longitude: 135.41603
primaryOutsideNic: eth0
token: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
? Confirm configuration? Yes
>>>

Volterra Node がインターネットに接続可能な状態になっていればこれで Volterra Node 側での設定は完了です。 次に、以下の様にVolterra Console 側から Volterra Node の登録を行います。

System -> Manage -> Site Management -> Registrations に設定したVolterra Node がpending 状態で表示されているのでフォームに従いRegion: tokyo を選択しAccept します。

f:id:aptpod_tech-writer:20210224122605p:plain

System -> Sites -> Site List に移動すると以下の様に新たにVolterra Node が追加されProvisioning が開始されます。 SW versionOS versionSuccessful になり、Health Score100/100 になれば完了です。

f:id:aptpod_tech-writer:20210224125125p:plain

f:id:aptpod_tech-writer:20210224125144p:plain

なお、 System -> Sites -> Site MapSystem -> Sites -> Connectivity を確認すると設定したsite の位置関係や VoltMesh RE との接続状態を確認できます。 既存のsite3 には仮想的に東京の緯度経度を設定しています。

f:id:aptpod_tech-writer:20210224125820p:plain

f:id:aptpod_tech-writer:20210224125842p:plain

Virtual Site, Virtual K8s の設定

Virtual Kubernetes(Virtual K8s) の設定を行います。Virtual K8s はVolterra 独自の概念です。複数のK8s Cluster を1つの仮想的なK8s Cluster として扱えます。こちらの概念図が非常にわかりやすいです。

まず、事前にこちらを参考にVolterra Node に任意のLabel 設定をしておきます。 今回はpref: tokyo をsite3 に設定しています。

最初に Virtual Site を作成します。 App -> Applications -> Virtual SitesAdd Virtual site を選択することで Virtual Site を作成できます。 Virtual Site を作成する際の識別子に事前に設定したLabel を利用します。

Name: pref-tokyo, Site type: CE, Site Selecter Expression: pref:tokyo

Virtual Site が作成できたら Virtual K8s を作成します。 App -> Applications -> Virtual k8sAdd Virtual K8s を選択すること Virtual K8s を作成できます。 先ほど作成した Virtual Site を紐付けます。

Name: trial-vk8s, Select vsite ref: pref-tokyo

Virtual K8s 作成後 Cluster status: Ready になれば完了です。 なお、Virtual K8skubectl でも操作可能です。Credential は以下からダウンロード可能です。

f:id:aptpod_tech-writer:20210224132253p:plain
kubeconfig

intdash backend service のデプロイ

intdash backend serviceVirtual K8s 上にデプロイしていきます。 intdash backend service の構成は以下の通りです。

f:id:aptpod_tech-writer:20210224181819p:plain

今回は RDBPostgreSQL, TSDBInfluxDBを利用します。

App -> Applications -> Virtual K8s -> Cluster: trial-vk8s からK8s でお馴染みのリソース群の作成が可能です。 PersitentVolume(PV) に関しては、PVC を作成することでよしなに Volterra Node 上に作成されます。

上記、Volterra ConsoleVirtual K8s UI 上から以下のManifest 用いてK8s リソースを作成します。 なお、Free プランではK8s のリソースは基本的に2つずつまでしか作成できません。 (例: Deployment は3 つ以上作れない。)

  • Deployment
kind: Deployment
apiVersion: apps/v1
metadata:
  name: intdash-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: intdash
  template:
    metadata:
      labels:
        app: intdash
    spec:
      volumes:
        - name: influx-pvc
          persistentVolumeClaim:
            claimName: influx-pv-claim
        - name: intdash-pgres-pvc
          persistentVolumeClaim:
            claimName: intdash-postgres-pv-claim
      containers:
        - name: intdash
          image: intdash:latest
          ports:
            - containerPort: 80
              protocol: TCP
        - name: intdash-pgres
          image: postgres:12-alpine
          ports:
            - name: intdash-pgres
              containerPort: 5432
              protocol: TCP
          env:
            - name: POSTGRES_USER
              value: ************
            - name: POSTGRES_PASSWORD
              value: ************
            - name: POSTGRES_DB
              value: intdash
          volumeMounts:
            - name: intdash-pgres-pvc
              mountPath: /var/lib/postgresql/data
        - name: "influx"
          image: influxdb:1.8.4-alpine
          ports:
            - name: "influx"
              containerPort: 8086
              protocol: TCP
          env:
            - name: INFLUXDB_ADMIN_USER
              value: ************
            - name: INFLUXDB_ADMIN_PASSWORD
              value: ************
            - name: INFLUXDB_DB
              value: "intdash"
            - name: INFLUXDB_HTTP_AUTH_ENABLED
              value: "true"
          volumeMounts:
            - name: influx-pvc
              mountPath: /var/lib/influxdb
      imagePullSecrets:
        - name: aptpod-registry-intdash
  • PVCs
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: "intdash-postgres-pv-claim"
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: "20Gi"
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: "influx-pv-claim"
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: "20Gi"
  • Service
kind: Service
metadata:
  name: intdash
  labels:
    app: intdash
spec:
  ports:
  - port: 80
    targetPort: 80
    protocol: TCP
  selector:
    app: intdash

ここで、intdash のコンテナイメージはプライベートレジストリから取得しているため、 kubectl を使用して以下の通り、docker-registry のsecret を事前に作成しておきます。 kubectl から作成したリソースも Volterra Console 上で確認・編集可能です。

kubectl create secret docker-registry aptpod-registry-intdash --docker-server=aptpod --docker-username=aptpod --docker-password=xxxxxxxxxxxxxxxxxxxx

Ingress Gatewayの設定

作成したintdash backend service のapi を外部からアクセス可能にするためIngress Gateway の設定を行います。 流れとしては、service を Origin Pool に紐付け、作成したHTTP Load Balancer の向け先をその Origin Poolにします。

Volterra Console にて App -> Manage -> Load Balancers -> Origin Pools を選択し、 Add Origin Pool にて Origin Pool を作成します。

Name: intdash-endpoint
Select Type of Origin Server: k8s Service Name of Origin Server on given Sites
Service Name: intdash.default (kubernetes service名.namespaceのフォーマット)
Select Site or Virtual Site: Virtual Site -> default/pref-tokyo
Select Network on the Site: Vk8s Networks on Site
Port: 80

次に、HTTP Load Balancer の作成を行います。 App -> Manage -> Load Balancers -> HTTP Load Balancers を選択し、 Add HTTP load balancer にて HTTP Load Balancer を作成します。

Name: intdash-lb
Domains: dummy.localhost 
#(作成後、DNS info にVolterra からdomain 名が払い出されます。払い出されたドメイン名を本項に上書き再設定してください。)
Select Type of Load Balancer: HTTP
Default Route Origin Pools: default/intdash-endpoint

この設定で HTTP Load Balancer を作成するとDNS info にVolterra からdomain 名が払い出されます。 こちらのドメインを用いて外部から、作成した kubernetes service にアクセス可能になります。

(例: ves-io-56d5ae17-6da1-4fcc-bf72-bd273056f415.ac.vh.ves.io

動作確認

試しに Virtual K8s に対してget pods してみます。

❯ kubectl get pods
NAME                                  READY   STATUS    RESTARTS   AGE
intdash-deployment-59f9c5c75b-sxsrx   4/4     Running   2          165m

ちゃんとpod が動いているのが確認できますが、想定よりコンテナの数が多いです。 これはwingman というVolterra が提供するセキュリティサイドカーが動いているためです。

また、各コンテナにはkubectl 経由でシェル実行してログインも可能ですが、以下の様に Volterra Console からもログイン可能です。

f:id:aptpod_tech-writer:20210224170640p:plain

作成したintdash backend service に対しても簡易にREST API でアクセスしてみます。 前述の、Volterra から払い出されたdomain 名に対してエッジ情報をGET するAPI を叩くと以下のレスポンスが返ってきました。

{
  "items": [
    {
      "uuid": "2af10d18-6545-489c-aabd-f15ffc8a538a",
      "name": "intdash",
      "description": "",
      "nickname": "",
      "type": "user",
      "disabled": false,
      "protected": false,
      "internal": true,
      "created_at": "2021-02-24T04:45:29.230827Z",
      "updated_at": "2021-02-24T04:45:47.016113Z",
      "last_login_at": "2021-02-24T04:45:38.028793Z",
      "last_lived_at": "2021-02-24T04:45:47.013862Z"
    }
  ],
  "page": {
    "total_count": 1,
    "first": true,
    "next": "",
    "last": true,
    "previous": ""
  }
}

試しにエッジを追加して、再度GET を行うと追加されたエッジの情報も返ってきました。 intdash backend service の機能の極一部ですが、問題なく動作している様です。

{
  "items": [
    {
      "uuid": "c2df9231-bc99-4b7f-a742-8764c49cabd3",
      "name": "UPSTREAM_1614154684727910000",
      "description": "created by bench",
      "nickname": "UPSTREAM_1614154684727910000",
      "type": "device",
      "disabled": false,
      "protected": false,
      "internal": false,
      "created_at": "2021-02-24T08:18:04.939179Z",
      "updated_at": "2021-02-24T08:18:04.939179Z",
      "last_login_at": "1970-01-01T00:00:01Z",
      "last_lived_at": "1970-01-01T00:00:01Z"
    },
    {
      "uuid": "2af10d18-6545-489c-aabd-f15ffc8a538a",
      "name": "intdash",
      "description": "",
      "nickname": "",
      "type": "user",
      "disabled": false,
      "protected": false,
      "internal": true,
      "created_at": "2021-02-24T04:45:29.230827Z",
      "updated_at": "2021-02-24T08:18:07.754192Z",
      "last_login_at": "2021-02-24T08:18:04.726411Z",
      "last_lived_at": "2021-02-24T08:18:07.753735Z"
    }
  ],
  "page": {
    "total_count": 2,
    "first": true,
    "next": "",
    "last": true,
    "previous": ""
  }
}

まとめ

今回は、Volterra のサービスを利用して弊社intdash Server の一部であるintdash backend service をEdge 環境で簡易に動作させてみました。Edge のノードがインターネットにアクセス可能でさえあれば、簡単に高いネットワーク接続性を有するサービスを提供することができ、管理も一元的に可能で魅力を感じました。

SRE チームでは今後も引き続きVolterra サービスの検証・検討を行なっていきたいと思います。