はじめに
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
VoltStack は Volterra 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 プランには一部機能制限の他、各種リソースの利用制限がありますが簡易な動作確認には十分です。
プラン毎の制限事項の詳細はこちらをご覧ください。
また、本検証は非公式ではありますが以下のチュートリアルを参考にさせて頂きました。
本検証構成の概要図は以下です。
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 Console のSystem
タブのSite Management -> Site Tokens
からToken を発行できます。Name
を入力し、Add Site Token
を選択し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
します。
System -> Sites -> Site List
に移動すると以下の様に新たにVolterra Node が追加されProvisioning
が開始されます。
SW version
と OS version
が Successful
になり、Health Score
が 100/100
になれば完了です。
なお、 System -> Sites -> Site Map
や System -> Sites -> Connectivity
を確認すると設定したsite の位置関係や VoltMesh RE との接続状態を確認できます。
既存のsite3 には仮想的に東京の緯度経度を設定しています。
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 Sites
で Add 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 k8s
で Add Virtual K8s
を選択すること Virtual K8s を作成できます。
先ほど作成した Virtual Site を紐付けます。
Name: trial-vk8s, Select vsite ref: pref-tokyo
Virtual K8s 作成後 Cluster status: Ready
になれば完了です。
なお、Virtual K8s は kubectl
でも操作可能です。Credential は以下からダウンロード可能です。
intdash backend service のデプロイ
intdash backend service を Virtual K8s 上にデプロイしていきます。 intdash backend service の構成は以下の通りです。
今回は RDB
にPostgreSQL, TSDB
にInfluxDBを利用します。
App -> Applications -> Virtual K8s -> Cluster: trial-vk8s
からK8s でお馴染みのリソース群の作成が可能です。
PersitentVolume(PV)
に関しては、PVC
を作成することでよしなに Volterra Node 上に作成されます。
上記、Volterra Console の Virtual 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 からもログイン可能です。
作成した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 サービスの検証・検討を行なっていきたいと思います。