Slide 1

Slide 1 text

OTSUKA, Motohiro / Yuanying NEC Solution Innovators, Ltd Japan Container Days v18.04 を利用した Kubernetes as a Service の実現

Slide 2

Slide 2 text

この資料について 掲載内容は私自身の見解であり、 必ずしも所属する企業や組織の立場、戦略、意見 を代表するものではありません。

Slide 3

Slide 3 text

Agenda 1. 私 2. Motivation 3. Kubernetes 4. Helm 5. Kubernetes as a Service 6. Kubernetes as a Service 実現案 7. デモ 8. まとめ

Slide 4

Slide 4 text

Slide 5

Slide 5 text

Who am I ? ● OTSUKA, Motohiro / Yuanying ○ NEC ソリューションイノベータ ■ OSS コミュニティ対応チーム所属 ○ OpenStack コミュニティ ■ OpenStack Magnum 元コアレビューア ● (2014/12/31-2017/03/31) ○ 言語 ■ Ruby (2007 - ) ■ Python (2014 - ) ■ Go (2017 - ) ○ 趣味 ■ ロードバイク (2009 - ) ■ トライアスロン (2010 - )

Slide 6

Slide 6 text

Currently I’m interested in... お家 Kubernetes クラスター ● Master Node ○ HW: MinnowBoard Turbot x 3 ○ Component ■ etcd, kube-api, kube-controller-manager, kube-scheduler ● Worker / Storage Node ○ HW: ECS Liva Z x 3 ○ Component ■ CoreDNS, Flannel ■ Gluster

Slide 7

Slide 7 text

Motivation

Slide 8

Slide 8 text

なぜパブリッククラウドのそれを使わずに、 Kubernetes as a Service (KaaS) を実現する必要がある のか。 社内のプライベートクラウドで自由に Kubernetes クラスターが欲しい、け どそれを管理したくない。 パブリッククラウドを運営してます、けどまだ KaaS はラインナップしていません。 OpenStack Magnum の開発者でした、け どうちの会社の人が使ってくれません、リベ ンジしたい。

Slide 9

Slide 9 text

Kubernetes

Slide 10

Slide 10 text

What is Kubernetes? ● コンテナオーケストレーションツール ○ Google の内部システム Borg にインスパイアされている。 ○ 2014 年にオープンソース化。 ○ クラウドネイティブアプリケーションのための運用・管理基盤 。 ■ アプリケーションのデプロイ、アップデート、プロセス監視、自動復旧、ロードバランシングなど の機能がデフォルトで組み込まれている。 アプリケーションのデプロイという意味で は、どちらかというと Ansible, Chef, Puppet が競合ソフトウェア?

Slide 11

Slide 11 text

例えば、 ロードバランシング

Slide 12

Slide 12 text

Services ● Pod へのロードバランシング ● サービスディスカバリ ○ ex: DNS record, frontend.svc.default.cluster.local Services selector: app: frontend Pod frontend app Pod frontend app 8080

Slide 13

Slide 13 text

例えば、 ローリングアップデート

Slide 14

Slide 14 text

Deployments ● ReplicaSets の世代管理 ○ ローリングアップデート ○ ロールバック Deployment replicas: 2 selector: app: nginx ReplicaSet Template ReplicaSet v1 Pod nginx v1.12 Pod nginx 1.12 ReplicaSet v2 Pod nginx v1.13 Pod nginx 1.13

Slide 15

Slide 15 text

Manifest apiVersion: apps/v1beta2 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.7.9 ports: - containerPort: 80 v 上記の管理リソースは全 て `manifest` によって宣 言的に定義される。

Slide 16

Slide 16 text

What is Kubernetes? クラウドアプリケーションを構築するための一番最適な方法!

Slide 17

Slide 17 text

Architecture 制御系 ● etcd ● kube-apiserver ● kube-controller-manager ● kube-scheduler 実行系 ● kubelet ● kube-proxy ● network plugin (CNI)

Slide 18

Slide 18 text

No content

Slide 19

Slide 19 text

Helm とは? Kubernetes における パッケージマネージャ apt, yum… helm!

Slide 20

Slide 20 text

Before Helm apiVersion: apps/v1beta2 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: ... apiVersion: apps/v1beta2 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: ... apiVersion: apps/v1beta2 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: ... apiVersion: apps/v1beta2 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: ... gitlab manifests apiVersion: apps/v1beta2 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: ... apiVersion: apps/v1beta2 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: ... apiVersion: apps/v1beta2 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: ... apiVersion: apps/v1beta2 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: ... redmine manifests apiVersion: apps/v1beta2 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: ... apiVersion: apps/v1beta2 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: ... apiVersion: apps/v1beta2 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: ... apiVersion: apps/v1beta2 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: ... mysql manifests Write manifests... And deploy

Slide 21

Slide 21 text

After Helm Gitlab Chart Redmine Chart MySQL Chart helm create

Slide 22

Slide 22 text

https://kubeapps.com ● drupal ● etcd ● gilab ● grafana ● hadoop ● jenkins ● mariadb ● mediawiki ● mysql ● owncloud ● postgresql ● redis ● selenium ● wordples ● ...

Slide 23

Slide 23 text

Helm とは? Helm でパッケージ化することで、 Kubernetes に簡単にアプリケーションをデプロイ、共有することができる!

Slide 24

Slide 24 text

Kubernetes as a Service

Slide 25

Slide 25 text

What is Kubernetes as a Service? (1) ● Kubernetes クラスターをクラウドのユーザ個々に提供する仕組み。 Kubernetes クラスター共有モデル Kubernetes as a Service モデル オススメ!!

Slide 26

Slide 26 text

どんな感じで Kubernetes クラスターはユーザに提供されるの?

Slide 27

Slide 27 text

Master kube-apiserver kube-cm etcd kube-scheduler Master kube-apiserver kube-cm etcd kube-scheduler Master kube-apiserver kube-cm etcd kube-scheduler Node kubelet Node kubelet Node kubelet Node kubelet Node kubelet Node kubelet Node kubelet Node kubelet コントロールプレーン ノード

Slide 28

Slide 28 text

Node kubelet Node kubelet Node kubelet Node kubelet Node kubelet Node kubelet Node kubelet Node kubelet コントロールプレーン ノード KaaS により 提供

Slide 29

Slide 29 text

What is Kubernetes as a Service? (2) マスタコンポーネント (コントロールプレー ン) はクラウドが用意し、 ノード はユーザが用意する。

Slide 30

Slide 30 text

パブリッククラウド比較 (2018/03時点) GKE AKS EKS k8s version 1.9 1.8 (latest) アップグレード 自動 自動 自動 可用性 Zone/Regional - Regional ワーカノードの スケーラビリティ 異種ノード混在 オートスケール 同一ノードのみ 異種ノード混在 ストレージ Block Block/Filesystem ? 追加機能 GPUサポート ネットワークポリシー GPUサポート サービスカタログ ? 価格 コントロールプレーンの管 理費は含まれない コントロールプレーンの管 理費は含まれない ?

Slide 31

Slide 31 text

パブリッククラウドに対抗する、 Kubernetes as a Service を実現するには? ムリ

Slide 32

Slide 32 text

とにかく KaaS を実現する際の課題 ● コントロールプレーンのデプロイを自動化する手段が必要。 ● リソース利用効率の向上が必要。 ○ ユーザごとにコントロールプレーンを用意するにも関わらず、主要なパブリッククラウドではコントロー ルプレーンの管理費は無料。 ○ 可用性を確保するためにはコントロールプレーンは 3 冗長欲しい。 ○ ユーザに提供するコントロールプレーン 1 系ごとに VM を用意するのは効率が悪い。 ● 管理、運用の自動化が必要。 ○ コントロールプレーンの管理はクラウドプロバイダ側でやる必要がある。 ■ アップグレード、監視、障害復旧。

Slide 33

Slide 33 text

Kubernetes as a Service 実現案

Slide 34

Slide 34 text

とにかく KaaS を実現する際の課題 (主にコントロールプレーン) ● コントロールプレーンのデプロイを自動化する手段が必要。 ● リソース利用効率の向上が必要。 ○ ユーザごとにコントロールプレーンを用意するにも関わらず、主要なパブリッククラウドではコントロー ルプレーンの管理費は無料。 ○ 可用性を確保するためにはコントロールプレーンは 3 冗長欲しい。 ○ ユーザに提供するコントロールプレーン 1 系ごとに VM を用意するのは効率が悪い。 ● 管理、運用の自動化が必要。 ○ コントロールプレーンの管理はクラウドプロバイダ側でやる必要がある。 ■ アップグレード、監視、障害復旧。 デプロイ自動化? リソース利用効率の向上、、、 コンテナ? アップグレード、監視、自動復旧、 ???

Slide 35

Slide 35 text

これらの機能を持つミドルウェアをどこかで見たような…。

Slide 36

Slide 36 text

Kubernetes で Helm を使って、 Kubernetes をデプロイすれば良いのでは?? Deploy ● ローリングアップグレード、ロールバック ● スケーリング管理 ● 設定管理 ● ロードバランシング

Slide 37

Slide 37 text

etcd etcd Node kubelet Node kubelet Node kubelet Node kubelet KaaS 用 k8s cluster namespace: tenantA kube-apiserver kube-scheduler kube-apiserver kube-cm Node kubelet Node kubelet tenant A namespace: tenantB kube-apiserver kube-scheduler kube-apiserver kube-cm Node kubelet Node kubelet tenant B フルマネージド ユーザに提供する Kubernetes のコントロールプ レーンをコンテナ化、KaaS 用 k8s cluster で管理 セルフサービス ユーザは自ら用意した VM/Node をクラウドサービス が用意したコントロールプレー ンに繋げることにより、 Kubernetes クラスターを構 成。

Slide 38

Slide 38 text

デモ

Slide 39

Slide 39 text

青い端末 テナントA 赤い端末 クラウドプロバイダ側

Slide 40

Slide 40 text

デモ手順 1. KaaS 用 Kubernetes 確認 2. テナント用 Kubernetesコ ントロールプレーン作成 3. テナントVMをコントロール プレーンに接続、確認 4. テナント Kubernetes に nginx をデプロイ

Slide 41

Slide 41 text

デモ手順 1. KaaS 用 Kubernetes 確認 2. テナント用 Kubernetesコ ントロールプレーン作成 3. テナントVMをコントロール プレーンに接続、確認 4. テナント Kubernetes に nginx をデプロイ

Slide 42

Slide 42 text

Node kubelet Node kubelet tenant A ユーザは kubelet / kubeadm がインストールされた VM を起 動しているが、Kubernetes ク ラスターとしてまだ動作していな い状態。 Node kubelet Node kubelet Node kubelet Node kubelet KaaS 用 k8s cluster Node kubelet Node kubelet サービスプロバイダ用の Kubernetes はすでに構築さ れているものとする。

Slide 43

Slide 43 text

デモ手順 1. KaaS 用 Kubernetes 確認 2. テナント用 Kubernetesコ ントロールプレーン作成 3. テナントVMをコントロール プレーンに接続、確認 4. テナント Kubernetes に nginx をデプロイ

Slide 44

Slide 44 text

etcd namespace: tenantA kube-apiserver kube-scheduler kube-apiserver kube-cm Node kubelet Node kubelet tenant A Helm によりネームスペース上 に Kubernetes コントロールプ レーンがデプロイされる。 Node kubelet Node kubelet Node kubelet Node kubelet KaaS 用 k8s cluster Node kubelet Node kubelet

Slide 45

Slide 45 text

デモ手順 1. KaaS 用 Kubernetes 確認 2. テナント用 Kubernetesコ ントロールプレーン作成 3. テナントVMをコントロール プレーンに接続、確認 4. テナント Kubernetes に nginx をデプロイ

Slide 46

Slide 46 text

etcd namespace: tenantA kube-apiserver kube-scheduler kube-apiserver kube-cm Node kubelet Node kubelet tenant A Kubernetes クラスターを構成 するためには、ノードをコント ロールプレーンに接続する必要 がある。 Node kubelet Node kubelet Node kubelet Node kubelet KaaS 用 k8s cluster Node kubelet Node kubelet

Slide 47

Slide 47 text

デモ手順 1. KaaS 用 Kubernetes 確認 2. テナント用 Kubernetesコ ントロールプレーン作成 3. テナントVMをコントロール プレーンに接続、確認 4. テナント Kubernetes に nginx をデプロイ

Slide 48

Slide 48 text

etcd namespace: tenantA kube-apiserver kube-scheduler kube-apiserver kube-cm Node kubelet Node kubelet tenant A nginx 提供されたコントロールプレーンの API に対してリクエス トを送ることで、ノード上にコンテナが作成することを確認 する。 Node kubelet Node kubelet Node kubelet Node kubelet KaaS 用 k8s cluster Node kubelet Node kubelet

Slide 49

Slide 49 text

まとめ

Slide 50

Slide 50 text

Kubernetes as a Service ● プライベートクラウドでも KaaS を実現できます。 ● ただし! ○ このセッションでは全く課題について触れてません … 。 ○ 興味ある方は以下に! ○ https://github.com/yuanying/kubernetes-chart

Slide 51

Slide 51 text

ご静聴ありがとうございました。

Slide 52

Slide 52 text

おまけ

Slide 53

Slide 53 text

デモ手順 0. KaaS 用 Kubernetes 確認 1. テナント用ネームスペース 作成 2. テナント用 Kubernetesコ ントロールプレーン作成 3. テナントVMをコントロール プレーンに接続、確認 4. テナント Kubernetes に nginx をデプロイ

Slide 54

Slide 54 text

namespace: tenantA Node kubelet Node kubelet tenant A ネームスペース作成 Node kubelet Node kubelet Node kubelet Node kubelet KaaS 用 k8s cluster Node kubelet Node kubelet

Slide 55

Slide 55 text

What is Kubernetes as a Service? (2) フルマネージド 各種マスターコンポーネントはクラウドにより管理されてお り、ユーザは kubernetes の API のみが提供される。 マスターコンポーネントが動作するマシンにはユーザは触 れることができない。 ex) マスターのアップグレードはクラウド側の責務 セルフサービス クラスタを構成するノードはユーザの管理下となる (最近 では一部例外あり)。 ユーザが自分で用意した VM をクラスタに組み込むことが 可能なサービスもある。 ex) ノードのアップグレードはユーザ側の責務、ただしクラ ウドによるサポートがある

Slide 56

Slide 56 text

この資料の取り扱いについては、 以下の URL を参照してください。 https://個人の見解.jp

Slide 57

Slide 57 text

この資料の取り扱いについては、 以下の URL を参照してください。 https://個人の見解.jp

Slide 58

Slide 58 text

この資料の取り扱いについては、 以下の URL を参照してください。 https://個人の見解.jp