帰ってきた(?)Stackato改めSUSE Cloud Application Platform

この記事は

Cloud Foundry Advent Calendar 2017 - Qiita

の23日目のエントリーです。間に合うか。

Last Christmas, I gave you my heart

去年のクリスマス、私は何をしていたかというとこんなのを書いてました。

qiita.com

Stackato4は本当に面白いプロダクトで、

  • 当時まだ(今ほどは)メジャーになっていなかったKubernetesを大胆にコントロールプレーンとして採用
  • 各種サービスをKubernetesのネームスペース上で管理
  • 通常BOSHで仮想マシンレベルでデプロイされるCloud Foundryの各コンポーネントをコンテナ化してKubernetes上で実行

という、当時としてはかなりぶっ飛んだというか、時代の2歩ぐらい先を行っていたモノだったと思います。さらにKubernetesの下のレイヤーではOpenStackとも統合され、HeatがNeutron LB(Octavia)やCinderをKubernetes用に構成してくれました。今となってはふつうにできることではありますが。

私はkubectlを10万回ぐらい叩きながら、「うぉーこれがこれからの分散サービスプラットフォームの姿か」と思ったものでした。

But the very next day you gave it away

そんなStackatoをHPEは手放してしまいました。開発リソースはSUSEに引き継がれましたが、Stackatoは販売 糸冬 了。かくしてPivotal Cloud Foundryが唯一の商用Cloud Foundryディストリビューションとなりました。

ヤツが帰ってくる・・・のか?

SUSEは2017年にSUSE CaaS Platform (CaaSP)という名の、Kubernetesのエンタープライズ向けディストリビューションを発売しました。

www.suse.com

これは「純粋な」KubernetesのクラスタをSaltを使って構成するというもので、HPEから引き継がれたHelion Control Plane(StackatoのKubernetes部分)とは全く別の実装となっています。現在ではKubernetes1.7ベースのV2.0がリリースされています。

そして2017年11月。シドニーでの(なぜか)OpenStack Summitで、SUSE Cloud Application Platform (CAP)が発表されました。

www.suse.com

SUSE Cloud Application Platform | SUSE

下記の図はSUSEのblogからの転載ですが、

https://www.suse.com/communities/blog/files/2017/12/SUSE-CAP-architecture-1-450x248.png

要するにSUSE CaaSP (Kubernetes)の上にコンテナ化されたCloud Foundryを載せたというディストリビューションに見えます。

Stackatoでは、Kubernetesの上にCloud Foundryだけではなく、CI/CDツール(ConcourceベースのHelion Code Engine)やデータサービス(MySQL、Postgresなど)も載っていましたが、そういったものはなさそうです。ふつうにKubernetes上にhelmとか使って構成してください、ということなのでしょう。

さて動かしてみよう

というわけで動かしてみようかと思ったのですが、SUSE CAPはまだリリースされておらず、ベータも入手できませんでした。が、SUSE Cloud Foundry (SCF)はオープンソースで開発されており、GitHubからソースコードとベータリリースを入手できます。

github.com

ということは、SUSE CaaSP 2.0(これは評価版ダウンロード可能です)の上に、OSSのSCFを展開すれば、SUSE CAPのベータっぽいものになるんではないか?ということで、試してみました。

だがしかし

SUSE CaaSPのドキュメントが、ベアメタルへのインストールを前提としており、しかもDVDを入れるところからというハードモードな展開で、いきなり断念しました。そんな何台もサーバ持ってませんって。

Suse Doc: Deployment Guide - Installing SUSE CaaS Platform - November 16 2013

ダウンロードできるイメージはDVDのISOの他にKVMやOpenStack用のQCOW2やHyper-V用のものもあったので、IaaS上へのデプロイも可能なんでしょうが、やり方がどこにも書いてませんでした。

仕方がないのでSCFだけでも

しょうがないのでAKSかDC/OSで動いているKubernetesの上にSCFをデプロイしようとしたのですが、

https://github.com/SUSE/scf#deploying-scf-on-kubernetes

After careful consideration of the difficulty of the current install, we decided not to detail the instructions to install on bare K8s because it still requires far too much knowledge of SCF related systems and troubleshooting.

Please be patient while we work on a set of Helm charts that will help people easily install on any Kubernetes.

と書いてありましたとさ。えー。

で、VagrantでローカルPC上にシングルノードKubernetes環境を作って、そこでSCFを動かす方法が書いてあったので、それを試してみました。

まずソースコードをダウンロードしろと

$ git clone --recurse-submodules https://github.com/SUSE/scf

ん、 --recurse-submodules ですか。。。もしかして fissile 使ってゼロからDockerイメージビルドする手順ってことですか。。。

github.com

まあいいや。OSSらしくていいじゃないですか。1時間近くかけてgit clone。

ビルドビルド

Vagrantfileも入っているので vagrant up するとシングルノードのKubernetesが上がってきます。

vagrant@vagrant-kube:~/scf> kubectl get nodes
NAME        STATUS    ROLES     AGE       VERSION
127.0.0.1   Ready     <none>    10m        v1.8.4

で、 make vagrant-prep とするとDockerイメージのビルド、Helm Chartの作成が行われます。Core i7, メモリ16Gをフルに使って2時間ぐらいかかりましたので、ここは寝るとこです。翌朝目覚めると

vagrant@vagrant-kube:~/scf> docker images
REPOSITORY                                             TAG                                        IMAGE ID            CREATED             SIZE
splatform/uaa-mysql                                    2b79bdda86a441c39e90e6e2743834d6ed8a25fe   1e97f9c0f14a        7 hours ago         3.2 GB
splatform/uaa-uaa                                      d743ee771b1d5ddbf60f9acd5022b5e4ff47b582   a44c6b3da9a8        7 hours ago         3.2 GB
splatform/uaa-secret-generation                        46d409f7080d58367476a773c6c66ddde9b3f98b   0a63e5fb877b        7 hours ago         3.2 GB
uaa-role-packages                                      6213179b3f9c0903db42c7ad9390f203871b1afe   c8a0c3534c94        7 hours ago         3.2 GB
splatform/scf-secret-generation                        a55a32c6d64fa9de0510336792fcb02a13cd2510   007ae398cc40        7 hours ago         6.781 GB
splatform/scf-post-deployment-setup                    7b25df7bae098f5ff259d2a370e1acaa4f8e6c2b   bfdd5a328624        7 hours ago         6.781 GB
splatform/scf-acceptance-tests                         defb68ce504472c73fc7589b9c0164cdc9574f5e   a0f3784ddabc        7 hours ago         6.781 GB
splatform/scf-smoke-tests                              d3055b8eb2ac356833757ec47de875bb47c07673   f3d0620917ad        7 hours ago         6.781 GB
splatform/scf-acceptance-tests-brain                   01e823895d97eb918a7276eb4b1b442cc48e32ad   fc38d1dd4d77        7 hours ago         6.781 GB
splatform/scf-diego-cell                               82ed8025c021a7d1eac531204dbc1fe3269a6863   12591a847c56        7 hours ago         6.781 GB
splatform/scf-nfs-broker                               847a907e0a82515348ab307c7b1e7e7168cf61ef   e0801950a17a        7 hours ago         6.781 GB
splatform/scf-diego-access                             d0745225743b233ce40819d4fd2d0e3ec6385213   bbf9c7d14035        7 hours ago         6.781 GB
splatform/scf-cc-uploader                              5adf1d0e9b2ffb355793bf017cc57f76170dd1f6   85666eea772c        7 hours ago         6.781 GB
splatform/scf-loggregator                              98439bdbbd97e6209044c40b3411e04e8cd68d9e   cf85f6dc71a3        7 hours ago         6.781 GB
splatform/scf-diego-brain                              f8e02e2aa0ba9241a30c119aebf15fe1116e1e12   190160b08a0b        7 hours ago         6.781 GB
splatform/scf-doppler                                  f0c49f89a8b6083394eba73573ab2eaa3422ff2b   7bf78c32b852        7 hours ago         6.781 GB
splatform/scf-cc-clock                                 35aed0de79491e69406dba042978e4aa818bf241   7368f088abfe        7 hours ago         6.781 GB
splatform/scf-cc-worker                                bd5b07b58f2331dc6db8f781e08e3927e7e8f15b   bff56502bd23        7 hours ago         6.781 GB
splatform/scf-blobstore                                02c3a328b26c0be009cfc899bd33ed9087790294   ec9dc6f464c9        7 hours ago         6.781 GB
splatform/scf-api                                      f5be5b8166a9c0efc8f20f66a803abb10ab1f01e   b8acea8750b6        7 hours ago         6.781 GB
splatform/scf-routing-api                              2741864e80fae353aae7b74338bca72a021b92e5   aa48bb10665c        7 hours ago         6.781 GB
splatform/scf-tcp-router                               102ea409285ad34c313cdc014db2b68c04f564c3   93a5076834ed        7 hours ago         6.781 GB
splatform/scf-diego-api                                eb51c6eaa324a35344a3debf0065f3905ab97b6f   836473c9c1f8        7 hours ago         6.781 GB
splatform/scf-router                                   a7d0daaa947812f817e2882a3e224afc814c77ad   9710c857f908        7 hours ago         6.781 GB
splatform/scf-diego-locket                             5b0240c35728ce0990f20b467700b8dea04adced   6f6f2a6407d9        7 hours ago         6.781 GB
splatform/scf-cf-usb                                   7105951f303938552323e880301515c7d5ec256d   2e77448049d2        7 hours ago         6.781 GB
splatform/scf-mysql                                    caa428174f926b1f028557371114e2c0dde855d0   774c56099f7d        7 hours ago         6.781 GB
splatform/scf-mysql-proxy                              0da1a69e760c35036236ec94eb455127eeed7d37   9a96072009a7        7 hours ago         6.781 GB
splatform/scf-syslog-scheduler                         83c45a25e66a506b5705b278ece1e96cc344b9f1   4eb7ae77afbf        7 hours ago         6.781 GB
splatform/scf-syslog-rlp                               7c8efb17c21a60bcf16b1ea8f0761505fac4b17c   a8f51fd49692        7 hours ago         6.781 GB
splatform/scf-syslog-adapter                           24d868865aedd6da58742a4607bacbac812d9952   a9bb5ccc7366        7 hours ago         6.781 GB
splatform/scf-nats                                     24443c42c637aff34e93960eaa4cdb256f2bd7c3   6adb2f5468ee        7 hours ago         6.781 GB
scf-role-packages                                      114a7f364a78112c23c4acaf3e927547d8eec1ed   cdf4d393c9c3        7 hours ago         6.781 GB
splatform/fissile-stemcell-opensuse                    42.2-21.g0757523-29.55                     826dc0eadd9a        7 days ago          1.755 GB
gcr.io/kubernetes-helm/tiller                          v2.6.2                                     069459be335a        11 weeks ago        78.02 MB
splatform/bosh-cli                                     39747e9d1fbc1d32af3672f903b6c4b73e1e1a9e   6b95889b110a        11 weeks ago        1.995 GB
gcr.io/google_containers/k8s-dns-sidecar-amd64         1.14.1                                     fc5e302d8309        9 months ago        44.52 MB
gcr.io/google_containers/k8s-dns-kube-dns-amd64        1.14.1                                     f8363dbf447b        9 months ago        52.36 MB
gcr.io/google_containers/k8s-dns-dnsmasq-nanny-amd64   1.14.1                                     1091847716ec        9 months ago        44.85 MB
gcr.io/google_containers/pause-amd64                   3.0                                        99e59f495ffa        19 months ago       746.9 kB

おー。できた。

いちおうこちらにはビルド済みのリリースっぽいものもあるので、これを使うと上記の手順は飛ばせるのかもしれません。

github.com

起動

あとは make run すれば、namespaceが作られ、helmチャートが走って、UAAとCloud Foundryがそれぞれのnamespace内で起動します。これは数分。

vagrant@vagrant-kube:~/scf> kubectl get pods --namespace cf
NAME                              READY     STATUS    RESTARTS   AGE
api-0                             1/1       Running   1          8m
blobstore-0                       1/1       Running   0          8m
cc-clock-5c4c8fb74c-96n9t         1/1       Running   0          8m
cc-uploader-5d7665c5d7-hhjqs      1/1       Running   0          8m
cc-worker-6799fbf5c9-s5d94        1/1       Running   0          8m
cf-usb-79577cd664-bsf4j           1/1       Running   0          8m
diego-access-b54c65f9f-vw2xc      1/1       Running   0          8m
diego-api-769fb4cf8c-247s5        1/1       Running   0          8m
diego-brain-64f44b9f67-npnm8      1/1       Running   0          8m
diego-cell-0                      1/1       Running   0          8m
diego-locket-9cc87ff78-g6dpq      1/1       Running   0          8m
doppler-5ccc5746f9-v28p2          1/1       Running   0          8m
loggregator-85f6cf876d-8zcqq      1/1       Running   0          8m
mysql-0                           1/1       Running   0          8m
mysql-proxy-755b7dbfc7-6blw9      1/1       Running   0          8m
nats-0                            1/1       Running   0          8m
nfs-broker-566564c64-zq582        1/1       Running   0          8m
router-6cd48dd877-5lv67           1/1       Running   0          8m
routing-api-0                     1/1       Running   0          8m
syslog-adapter-779759b677-j65f4   1/1       Running   0          8m
syslog-rlp-755d7b8647-swnsr       1/1       Running   0          8m
syslog-scheduler-c669995d-qmcxr   1/1       Running   0          8m
tcp-router-77676b9d9-gn25j        1/1       Running   0          8m
vagrant@vagrant-kube:~/scf> cf api --skip-ssl-validation https://api.cf-dev.io
Setting api endpoint to https://api.cf-dev.io...
OK

                
API endpoint:   https://api.cf-dev.io (API version: 2.99.0)
User:           admin
Org:            system
Space:          No space targeted, use 'cf target -s SPACE'
vagrant@vagrant-kube:~/scf> cf login
API endpoint: https://api.cf-dev.io

Email> admin

Password> 
Authenticating...
OK

Targeted org system


                
API endpoint:   https://api.cf-dev.io (API version: 2.99.0)
User:           admin
Org:            system
Space:          No space targeted, use 'cf target -s SPACE'

よろしい。ちゃんとCFだ。

さてこれはいいものなのか

まだ完成したディストリビューションとは言い難く、私もとりあえず起動してみただけなのでなんとも言えませんが、少なくとも以下は前向きに評価できるポイントかと思います。

  • 少なくともBOSHリリースからfissileを使ってコンテナ化するところはちゃんとできているようだ。
  • デプロイにHelmを使っている。つまり独自技術に頼らず、Kubernetesのエコシステムに乗っかることを前提としている。
  • fissileも含めてオープンソースである。
  • Pivotalの、BOSHを共通レイヤーとしてその上にPKS(Kubernetes) + PAS(Cloud Foundry)というコンセプトもよいが、それとは別のエッジが効いている。

個人的には

やはりふつうのKubernetesの上で動かしてみたいですね。あと、

特別なお客様限定でSUSE Cloud Application Platformのご提供を開始しました

ってありますがどこまで本気で商用展開しようとしているのかも気になります。

間に合った。メリークリスマス。

Mesosphere DC/OSがKubernetesと叫ぶ声が聞こえた

言い訳から入るのがいちばんダメなやつ

この記事は

Kubernetes Advent Calendar 2017 - Qiita

および

Mesos Advent Calendar 2017 - Qiita

の15日目・・・だったはずなのですが、インフルエンザB型を発症してしまいましてですね。死ぬかと思ったです。窓があったら飛び降りてたかもしれない。皆さんもお気を付けください。

そして今日は18日、メルカリ方面から流れてくるコアなみなさんの楽しげなツイートを眺めながらこの記事を書いています。くそう。

猫も杓子もKubernetesと言い出した2017年

さすがに杓子が言ってるのは聞いたことないけど猫はたまに言ってる。AWSMicrosoftもCNCFのプラチナメンバーになり、PivotalもMesosphereも、しまいにゃDockerも「これからはKubernetesだよ」とかドヤ顔で言い出し、Oracleまで「おれもおれも」とかかぶせてくるという2017年でした。

今回取り上げるのは、そのなかでもMesosphere DC/OSです。こちらが10月に出たMesosphere社のブログでのアナウンス。

mesosphere.com

Kubernetesの公式Docにも載りました。

https://kubernetes.io/docs/getting-started-guides/dcos/

  • 100%純粋なアップストリームのKubernetes!
  • クリック1回でKubernetesクラスタが出来上がる!
  • デフォでHAでセキュア!
  • イケてるデータプラットフォームとKubernetesが共存できる!

だそうです。ほう。

ちなみにDC/OSではなく、素のMesosの上にFrameworkとしてKubernetesをデプロイする方法も案内されています。

https://kubernetes.io/docs/getting-started-guides/mesos/

もちろんこちらのほうが手間はかかります。

そもそもMesosphere DC/OSとはなんだ

上記ブログの絵を引用しますが

https://mesosphere.com/wp-content/uploads/2017/08/mesosphere-dcos-kubernetes.png

DC/OSという名前が示す通り、データセンターをひとつのOSにしてしまおうという野心に満ちたコンセプトであり、考え方としてはGoogleのBorgとか、AWSそのものに近いところを目指したアーキテクチャになっています。と思います。下回りのリソース管理はApache Mesosが行い、タスクのスケジューリングは各種Frameworkが行うという、Two-level Scheduling を特徴としています。

これまでDC/OS上でのコンテナオーケストレーターとしては、Mesosphere社自身が開発したMarathonがメインでしたが、そもそもMarathonもFrameworkのひとつでしかないため、別のFrameworkとしてKubernetesが併存するというのはアーキテクチャ的にはアリなわけです。

なにはともあれデプロイしてみましょう

DC/OSのサービスカタログ(Universe)に、beta-kubernetesというものがあります。まだbetaです。年内にGAという話でしたがはたして。

f:id:jyoshise:20171218140532p:plain

こちらをデプロイしてみます。

f:id:jyoshise:20171218141312p:plain

このようにGUIからも各種パラメーターを指定できるのですが、だるいのでJSONで書きます。ざっとこんな感じです。

{
  "service": {
    "name": "kubernetes",
    "sleep": 1000,
    "log_level": "INFO"
  },
  "kubernetes": {
    "service_cidr": "10.100.0.0/16",
    "node_count": 3,
    "node_cpus": 2,
    "node_mem": 2048,
    "node_disk": 1024
  },
  "etcd": {
    "count": 3,
    "cpus": 0.5,
    "mem": 1024,
    "data_disk": 3072,
    "wal_disk": 512,
    "disk_type": "ROOT"
  },
  "scheduler": {
    "count": 3,
    "cpus": 0.5,
    "mem": 512
  },
  "controllermanager": {
    "count": 3,
    "cpus": 0.5,
    "mem": 512
  },
  "apiserver": {
    "count": 3,
    "cpus": 0.5,
    "mem": 1024
  },
  "kube-proxy": {
    "cpus": 0.1,
    "mem": 128
  }
}

基本的には各コンポーネントに対するリソース割当を指定すればOKです。上記は最低限のHA構成です。少なくともetcdは3ノードないとデプロイしてくれません。

JSONファイルを用意したらあとはコマンド一発でデプロイ開始です。

$ dcos package install beta-kubernetes --options=dcos_kubernetes.json

手元の環境では全部上がってくるのに10分ぐらいかかりました。 f:id:jyoshise:20171218153001p:plain

単純に各コンポーネントを起動しているだけではなく、kube-dns, heapster, dashboardといったadd-onを設定するジョブも走ります。

最初のひとつのタスク(上記の例で言うと kubernetes.509a7e81-e3b4-11e7-a0ee-9eaf3842cc33 )はMarathon上のコンテナとして起動し、これをブートストラップとして、残りのタスクがMesosのFrameworkとして起動されます。Mesosから見るとこうなります。 f:id:jyoshise:20171218152623p:plain

この状態で、DC/OSクラスタの外からAPIを叩いたり kubectl を使うにはsshトンネルを掘る必要があります。

$ ssh -4 -N -L 9000:apiserver-insecure.kubernetes.l4lb.thisdcos.directory:9000 <user>@<DC/OSノードのどれか>

あとはふつうに

$ kubectl get nodes
NAME                                   STATUS    AGE       VERSION
kube-node-0-kubelet.kubernetes.mesos   Ready     5h        v1.7.10
kube-node-1-kubelet.kubernetes.mesos   Ready     5h        v1.7.10
kube-node-2-kubelet.kubernetes.mesos   Ready     5h        v1.7.10

おー。

どんなもんか

現時点ではbetaですので、いろいろと制約があります。

https://docs.mesosphere.com/service-docs/beta-kubernetes/0.3.0-1.7.10-beta/limitations/

  • One Kubernetes cluster per DC/OS cluster.
  • One Kubernetes worker node per DC/OS agent.

のあたりは、まあそういうものだと割り切ればよいのですが

  • Authorization mode is not configurable.

とか

  • Horizontal Pod Autoscaling custom metrics are not available.

とか

  • Package upgrades are not supported.

といったあたりは、やはりまだプロダクションで使えるものではなさそうです。正式リリースに期待。

こんな人は検討してみる価値はあるかも

  • KubernetesとKubernetes以外のワークロードを共通のリソースプール上で動かしたい。たとえば
    • Kubernetes上のマイクロサービス
    • Cassandra、HDFSなどの分散データサービス
    • コンテナ化できないGPUワークロードとか

これは強力な動機になりえるんじゃないかと思います。AWSとかのパブリッククラウド上でk8sを動かすのであれば、データ系のサービスなんかはマネージドのものを使えばいいんですが、オンプレでそれをやろうとしたときに、SMACK Stackみたいなものが手軽に組めるDC/OSは強いです。

簡単ななんちゃってexampleですが、DC/OS上のKubernetesとCassandraを連携させる例が公開されてました。 dcos-kubernetes-quickstart/os-detector.md at master · mesosphere/dcos-kubernetes-quickstart · GitHub

あとは

  • オンプレでKubernetesを組むにあたり、クラスタ自体の管理レイヤーがなにか欲しいけどOpenStackとか持ってないし

ってとこですかね。少なくともOpenStackを導入するよりはDC/OSを導入するほうが手軽ではあります。

これから

下回りのプラットフォームの選択肢が多いことはKubernetesのいいところですが、裏返すと、Kubernetesクラスタ自体をどうデプロイして管理するべきか、という問に対して(少なくともオンプレでは)ただひとつの答えというものはありません。

PivotalはそこにBOSHを持ってきましたね。これもおもしろいですね。 Cloud Foundry Container Runtimeでk8s運用 - Cloud Penguins

2018年は、各社からオンプレ/プライベート向けKubernetesのディストリビューションが出てくるんじゃないかと思います。そこでポイントになるのは

  • Kubernetesの純粋さ →Forkは悪手ですよね。
  • Kubernetesクラスタ自体をどう管理するか →ここが各社の腕の見せ所

なんじゃないかなーと思いつつ、どうだ忘年会が終わるまでに書き終えたぞ!みんなインフルエンザには気をつけろ!(3日遅れで失礼しました。)

いまさらブログかよ

なぜブログ

45年も生きてりゃブログのひとつやふたつの経験はあるんですが・・・あまり個人的に情報発信するってことは積極的にはやってなかったわけです。とはいえ仕事でいろいろイベントに登壇したりとか、コミュニティ的な活動なんかもあるわけで、Qiitaとか使ってたんですが、そうすると仕事なのか個人的な活動なのかって話になるわけで、めんどくせえからもう全部個人ってことでいいんじゃねえかと。はてブでいいんじゃねえかと。Qiitaにポエム書くと消されるそうですし。

ていうか

師走だなあ。僕は君といるときがいちばん師走なんだ。僕は死ぬまで君を離さないぞ。いいだろう?

というわけでアドベントカレンダーの季節でして、勢いで3つエントリーしてしまってました。

qiita.com

qiita.com

qiita.com

で順番迫ってきたので慌てて書く場所用意したってことです。はい。