Kubernetes on Mesos
Deep Dive
@jyoshise
おしながき
• なぜMesosでKubernetesか
• Kubernetes on Mesosの過去と現在
• どうデプロイされるか
• セキュリティ
• ネットワーク
• 現時点での制約
• どんな人におすすめか
• Marathonはどうなる
Kubernetes使ってますか?
• 猫も杓子もk8sな昨今
• 私はMesos/Marathon勢ですが、k8s勢でもあります
• 私ほどいろんなk8sを触ってる人もあんまいない気がする
• 手作りクラスタ、minikube、kubeadm、GKE、EKS、AKS、SUSE CaaSP、
OpenShift、Docker EE、Rancher、Tectonic、Stackato4
• 触ったことはないけどPKS、CDK、などなど
• いったいどれがええねん、て話は8月のCloud Native Daysでやります
• でもぶっちゃけ難しくない?
なぜMesosでKubernetesか
なぜMesosでKubernetesか
• そこにMesosがあるから
なぜMesosでKubernetesか
• そこにMesosがあるから
• Mesosは分散システムをうまいこと実行管理するためのもので
• Kubernetesは分散システムだから
• このセッションが終わるころにはなにかが見えてくるかも?
Kubernetes on Mesosの過去と
現在
かつて、kube-mesos-frameworkというものが
あったそうじゃ
• いちおうKubernetes公
式だった
• IBMが中心になって開
発していた
• 2016年公開
• 2017年、諸般の事情
によりアルファのま
ま糸冬 了
旧kube-mesos-frameworkが目指していた
もの
• ノードレベルのオートス
ケーリング
• ネットワークレイヤーの
分離
• コンテナサービスとビッ
グデータサービスのリソ
ースシェアリング
• Myriad(YARN on Mesos)っ
てありましたね
Kubernetes on Mesos: Not Just Another Mesos Framework - Klaus Ma, IBM
MesosCon Asia 2016
Mesosphereが本気を出したようだ
• 2017年9月、DC/OSでK8sをサポ
ートすると発表
• 2018年3月、DC/OS 1.11で
KubernetesパッケージがGA
• CNCFのCertified Kubernetes
Installer
というわけで
• ここから先はDC/OS 1.11のUniverseカタログになっている
Kubernetesフレームワークの実装をベースに話をします。
• ちゃんとMesosのフレームワークになってます。
どうデプロイされるか
そもそもKubernetesって
API server
etcd
Scheduler
Controller
Kubelet
Docker
Pod
Kube-Proxy
kubectl API User
ありがちな構成 (kubeadmとか)
API server
etcd
Scheduler
Controller
Kubelet
Docker
Pod
Kube-Proxy
kubectl API User
Master Node Worker Node
ありがちなHA (kubeadmとか)
API server
etcd
Scheduler
Controller Kubelet
Docker
Kube-Proxy
Master Node Worker Node
API server
etcd
Scheduler
Controller
Master Node
API server
etcd
Scheduler
Controller
Master Node
Kubelet
Docker
Kube-Proxy
Worker Node
LB LB
要するに、Kubernetes自体が分散サービ
スです。
ここにMesosのクラスタがあるじゃろ?
(Masterはややこしいので割愛)
Docker
Mesos Slave
Docker
Mesos Slave
Docker
Mesos Slave
Docker
Mesos Slave
Docker
Mesos Slave
そこにKubernetesを
Docker
Mesos Slave
Docker
Mesos Slave
Docker
Mesos Slave
Docker
Mesos Slave
Docker
Mesos Slave
API server
etcd
Scheduler
Controller
Kubelet
Kube-Proxy
こうして
Docker
Mesos Slave
Docker
Mesos Slave
Docker
Mesos Slave
Docker
Mesos Slave
Docker
Mesos Slave
API server
etcd
Controller
API server API server
Scheduler Scheduler Scheduler
Controller Controller
etcd etcd
Kubelet
Kube-Proxy
CoreDNS
Kubelet
Kube-Proxy
CoreDNS
Kubelet
Kube-Proxy
CoreDNS
こうじゃ!
Docker
Mesos Slave
Docker
Mesos Slave
Docker
Mesos Slave
Docker
Mesos Slave
Docker
Mesos Slave
API server
etcd
Controller
API server API serverScheduler
Scheduler
Scheduler
Controller
Controller
etcd etcd
Kubelet
Kube-Proxy
CoreDNS
Kubelet
Kube-Proxy
CoreDNS
Kubelet
Kube-Proxy
CoreDNS
Kubernetesパッケージのインストール
Deploy Plan
$ dcos kubernetes plan status deploy
deploy (serial strategy) (IN_PROGRESS)
├─ etcd (serial strategy) (COMPLETE)
│ ├─ etcd-0:[peer] (COMPLETE)
│ ├─ etcd-1:[peer] (COMPLETE)
│ └─ etcd-2:[peer] (COMPLETE)
├─ apiserver (parallel strategy) (STARTING)
│ ├─ kube-apiserver-0:[instance] (STARTING)
│ ├─ kube-apiserver-1:[instance] (STARTING)
│ └─ kube-apiserver-2:[instance] (STARTING)
├─ mandatory-addons (serial strategy) (PENDING)
│ ├─ mandatory-addons-0:[additional-cluster-role-bindings] (PENDING)
│ ├─ mandatory-addons-0:[kube-dns] (PENDING)
│ ├─ mandatory-addons-0:[metrics-server] (PENDING)
│ ├─ mandatory-addons-0:[dashboard] (PENDING)
│ └─ mandatory-addons-0:[ark] (PENDING)
├─ kubernetes-api-proxy (parallel strategy) (PENDING)
│ └─ kubernetes-api-proxy-0:[install] (PENDING)
├─ controller-manager (parallel strategy) (PENDING)
│ ├─ kube-controller-manager-0:[instance] (PENDING)
│ ├─ kube-controller-manager-1:[instance] (PENDING)
│ └─ kube-controller-manager-2:[instance] (PENDING)
├─ scheduler (parallel strategy) (PENDING)
│ ├─ kube-scheduler-0:[instance] (PENDING)
│ ├─ kube-scheduler-1:[instance] (PENDING)
│ └─ kube-scheduler-2:[instance] (PENDING)
├─ node (parallel strategy) (PENDING)
│ ├─ kube-node-0:[kube-proxy, coredns, kubelet] (PENDING)
│ ├─ kube-node-1:[kube-proxy, coredns, kubelet] (PENDING)
│ └─ kube-node-2:[kube-proxy, coredns, kubelet] (PENDING)
└─ public-node (parallel strategy) (COMPLETE)
セキュリティ
TLS
(コンポーネント間の認証と通信の暗号化)
• etcdクラスタのピア間
• 暗号化は有効。相互認証は無効。
• etcdの証明書検証はホスト名ではなくIPアドレスで行われるため
• etcd⇔kube-apiserver
• 暗号化、相互認証ともに有効。
• その他
ユーザー管理、RBAC
• Kubernetesパッケージをデプロイする際にauthentication modeを
指定
• AlwaysAllow (デフォルト)
• RBAC
• DC/OSのユーザーとKubernetesのRBACは統合されない
• DC/OS側で用意するアカウントはKubernetesのサービスアカウントのみ
• Kubernetes APIの”User” は、Kubernetes側で管理
ネットワーク
オーバーレイネットワーク
• デフォルトのdcosネットワーク
• CNIのサポート
• CalicoはDC/OSパッケージとしても用意されているので導入
しやすい
• ただしPolicy Enforcementを行うためにはDC/OS Enterpriseの認証機能と統合
する必要あり
• その他、FlannelやWeaveなども使えるはず
クラスタ外からKube-APIへのアクセス
• Public Network側にAPI
を晒すにはPublic Agent
でHAProxyを立てれば
よい
• ただし当然セキュリテ
ィの考慮は必要
• ふつうのKubernetesと
いうこと。
Public Agent Private Agent Private Agent
API server
クラスタ内ネットワークからはMesos DNS名でアクセスできる
apiserver.kubernetes.l4lb.thisdcos.directory:6443 てきな
HA Proxy
クラスタ外からPodへのアクセス
• Kubernetes上でIngress
Controllerを作成し、
Public Agent上にLBが展開
されるようにする
• 各種Ingress Controllerが
利用可能
• Traefik
• NGINX
• HAProxy
• Envoy
• Istio
• ALB
• ふつうのKubernetesとい
うこと。
Public Agent Private Agent Private Agent
Ingress-LB
Pod
現時点での制約
現時点での制約
(DC/OS Kubernetes 1.1.1-1.10.4)
• 100ノードまで
• ひとつのDC/OSクラスタ上にデプロイできるk8sクラスタはひと
つだけ
• Mesosの”role”とk8sのRBACを紐づけできない
• 他のDC/OSやMesosのタスクからは、同じノードのkube-proxyに
しかアクセスできない
• 外部etcdクラスタは使えない
• Cloud-providerはAWSだけ
• GPUは非サポート
ハマったこと
• 時刻同期すげー大事
• zookeeperに加えてetcdが動くので一瞬でも時刻がずれるとおかしなこ
とになります。ローカルでピアを張りましょう
• 社内Proxyすげー邪魔
• いろんなひとがインターネットにアクセスしに行くので、Proxyとか
NoProxyとか設定が大変です。中間Transparent Proxyを立てましょう
どんな人におすすめか
どんな人におすすめか
• 既にDC/OSを使っていてk8sも使ってみたい
• k8sのデプロイとクラスタ管理がだるい。ちゃんとHAでサポー
トされるk8sがほしい
• k8s以外の分散ワークロードも動かしたいが個別にクラスタ管理
は大変
• k8sで動かすアプリケーションのバックエンドサービスとして
cassandraとかHDFSとかkafkaとかsparkとか使いたい
Marathonはどうなる
Marathonはどうなる
• そもそもMarathonはコンテナだけのためのものではない
• Mesosネイティブな汎用タスクスケジューラー/エグゼキュータ
ー
• DC/OSの汎用フレームワークとしてたぶん今後も使われ続ける
• コンテナ用途でも単純にスケールさせるだけならk8sよりお手軽
• ただし今後はどちらかというとDC/OSの機能のひとつとしてメ
ンテナンスされていくようなので、コンテナオーケストレーシ
ョンのエコシステムとしてはk8sのほうがより発展していくと思
われます
あざっした

Kubernetes on Mesos Deep Dive [Japanese]

Editor's Notes