kubernetes ときどき serverless -- cndjp第1回勉強会

Post on 21-Jan-2018

886 Views

Category:

Technology

3 Downloads

Preview:

Click to see full reader

TRANSCRIPT

#cndjp1

ごあいさつ

自己紹介

• 早川 博(はやかわ ひろし)

• 日本オラクル所属• Pre-Sales Engineer / Tech Evangelist (new!)

• Java SE/EE, Microservices/DevOps

@hhiroshell

この勉強会について

•cndjp - Cloud Native Developers JP

• Cloud NativeなOSSスタックを対象とした勉強会シリーズ

• オープンソース中心

• 楽しく学ぶ、深く学ぶ

CNCFが出しているCloud Native Landscapeに載っているソフトウェア(→次ページ)

cndjp #1-#3

cndjp #4~

Kubernetes ときどき Serverless#cndjp1

前半戦Kubernetes基礎

前半戦のメニュー

1. Kubernetesってなんですか

2. Kubernetesの全体像を理解する

3. Kubernetesクラスター大解剖

1. Kubernetesってなんですか

こういうことがしたい

大きなリソースのプール

こういうことがしたい

動け!

こういうことがしたい

コンテナ化されたアプリ

はい!

こういうことがしたい

コンテナ化されたアプリ

はい!

こういうことがしたい

利用者からのリクエスト

わー!

こういうことがしたい

がんばれ!

こういうことがしたい

はい!

こういうことがしたい

アップグレード!

こういうことがしたい

はい!

勝手にローリングアップデート

こういうことがしたい

こういうことがしたい

こういうことがしたい

わー!

コンテナが落ちたら自動で新たに立ち上げる

こういうことができる

• リソースの抽象化• どこにデプロイするか意識しな

くてよい

• いいように分散して配置してくれる

• 外部アクセスのマネージ• アプリケーションの公開

• ルーティング/ロードバランシング

• スケーリング• 手動/自動

• 障害時のコンテナの再立上げ

• 複数コンテナをまとめて制御

2. Kubernetesの全体像を理解する

Kubernetesの全体像

k8sクラスター

>_

kubectl (CLI)

マシンとネットワーク

kubectl

• Kubernetesクラスターの管理操作を行うためのコマンドラインインターフェース

• Kubernetesクラスターと戯れるときの最も基本的な手段

• コマンドをKubernetesのREST API呼び出しに変換している

• (REST APIを直接呼び出すことも可能です)

kubectl

• 複数のクラスターもいける

>_

Kubernetesクラスター

• クラスター本体です(あたりまえ)

• 次章で詳しく解説

3. Kubernetesクラスター大解剖

Kubernetesの全体像

k8sクラスター

>_

kubectl (CLI)

マシンとネットワーク

Kubernetesクラスターの構成

k8sクラスター

k8s Objects

・k8sの機能の構成要素- Node, Pod, Service…

k8s Control Plane

・k8s Objectsを実現する実装- マシン上で稼働するプロセス群

- k8sの要件に沿って構成されたネットワーク

Kubernetesクラスターの構成

k8sクラスター

Kubernetes Control Plane

・k8s Objectsを実現する実装- マシン上で稼働するプロセス群

- k8sの要件に沿って構成されたネットワーク

k8s Objects

・k8sの機能の構成要素- Node, Pod, Service…

Kubernetes Objects

• Node

• Pod

• Service

• Label/Label Selector

• Deployment

• ReplicaSet

• DaemonSet

…他にもありますが、まずはこの辺から。

Node

• クラスターに属するマシンを表すオブジェクト

• クラスターの管理を担当するマスターノードと、アプリケーションを稼働させるメンバーノードがある

メンバーノード

マスターノード

Pod

• Node内で稼働するコンテナのセット

• 生成/スケールアウト/破棄等のライフサイクルの単位

• 内包する複数のコンテナは、必ず同じノード上で稼働

• 1つのPodに1つのクラスタ内IPが割り当てられる

ポッド

コンテナ

Service

• PodへのTCP/UDPアクセスの制御を行うオブジェクト

• Podへのルーティング、ロードバランシングの役割を持つ

• クラスター外部への公開、クラスター内の通信など、用途に応じて複数のタイプから選択可能

サービス

クラスター外からのリクエスト

Label/Label Selector

• k8sオブジェクトを管理し易いようにグルーピングする仕組み

• Label: • k8sオブジェクトにアタッチで

きるkey/valueペアのセット

• Label Selector:• Labelの設定値の条件を指定す

る情報。条件に該当するものをグループとして識別する

"labels": {"tier" : "frontend","partition" : "customerA"

}

"labels": {"tier" : “backend","partition" : "customerA"

}

"labels": {"tier" : "frontend","partition" : "customerB"

}

Label

Label

partition = customerA

Label Selector

Label/Label Selector

• Serviceがルーティングの対象を識別するためにも利用される

サービス

partition = customerA

クラスター外からのリクエスト

Label/Label Selector

• Serviceがルーティングの対象を識別するためにも利用される

サービス

partition = customerA

クラスター外からのリクエスト

Deployment

• Podのライフサイクル(生成/更新/破棄)を制御するオブジェクト

• Podを起動したり、スケールさせたりするときに、対応するDeploymentに対して操作を行う

デプロイメント

D

DaemonSet

• 全てのメンバーノードで共通のPodを稼働させる仕組み

• ノードが追加されると自動で所定のPodが起動

• ノード共通の機能を乗せたいときに利用• ログ収集(fluentd, logstach)• ノードの監視用のエージェ

ント(Prometheus, collectd)

DaemonSet

Kubernetes Objects

・k8sの機能の構成要素- Node, Pod, Service…

Kubernetesクラスターの構成

k8sクラスター

k8s Control Plane

・k8s Objectsを実現する実装- マシン上で稼働するプロセス群

- k8sの要件に沿って構成されたネットワーク

Kubernetes Control Plane

• マシン上で稼働するプロセス群

• k8sの要件に沿って構成されたネットワーク• e.g. コンテナ同士の通信がNATなしで疎通すること

• マスターノード• kube-apiserver

• etcd

• kube-controller-manager

• kube-scheduler

• メンバーノード• kubelet

• kube-proxy

• Docker

Control Planeで稼働するプロセス群(主要なもの)

REST API呼び出し

API Server

kube-proxy

cotrollers

kube-controller-managerkubelet

マスターノードメンバーノード

Docker

メンバーノードへの指示

メンバーノードで稼働するプロセス

• kubelet• メンバーノードとしての基本

機能を実現する

• Podの生成/更新/破棄などのコントロール

• 各種ステータスのレポート

• kube-proxy• ネットワーク周りのルールを

制御

• Docker• いわずもがなのコンテナ本体

kube-proxy

kubelet

Docker

マスターノードで稼働するプロセス

• kube-apiserver• Kubernetesクラスターのフロント

エンド。APIを提供

• kube-controller-manager• クラスターの制御を行う各種

controllerを動作させる

• controllers• Node Controller• Replication Controller• Endpoints Controller• Service Account & Token

Controllers

API Server

cotrollers

kube-controller-manager

More Advanced…

• Control Planeの構成要素をきっちり把握するには、カスタムクラスターのインストールマニュアルを読むのがおすすめ

• Creating a Custom Cluster from Scratch• https://kubernetes.io/docs/getting-started-guides/scratch/

ハンズオン (1)ローカルPCにKubernetesクラスターを構築してみよう

後半戦Kubernetes実践 ときどき Serverless

後半戦のメニュー

1. kubectlをもう少し

2. アプリケーションを公開するには

3. Kubernetes meets Serverless

kubectlをもう少し

kubectlの設定情報

• kubectlの設定情報の表示

• 設定情報の実態は ~/.kube/config

• 設定の追加/上書き(の一例)

> kubectl config view

> kubectl config set-cluster [OPTIONS]

k8sオブジェクトの情報を取得する(1)

• Human Readableな形式で取得するとき -> get, describe

• オブジェクトの一覧

> kubectl get [オブジェクトの種類]

• オブジェクトの詳細情報

> kubectl describe [オブジェクトの種類] [オブジェクトの名前]

k8sオブジェクトの情報を取得する(2)

• Machine Friendlyな形式で取得するとき -> getと-oオプション

• オブジェクトの詳細情報> kubectl get [オブジェクトの種類] [オブジェクトの名前] –o json

k8sオブジェクトを操作する(1)

• コマンド方式• オブジェクトに反映したい状態を、コマンドとそのオプションで指定

• オブジェクトの作成の例:

• 構成ファイルを指定してオブジェクトを操作する方式• 命令的/宣言的

• オブジェクトに反映したい状態を、構成ファイルで指定• .yaml または .json

• ソースコード管理との親和性が良い

> kubectl run nginx --image nginx

構成ファイルによるオブジェクトの操作

• 命令的方式• コマンド(create, delete, replace…)と構成ファイルを指定• 指定した内容にオブジェクトの状態が変わる

• オブジェクトを作成する例:

• 宣言的方式• 適切なコマンド(操作)をkubectlが自動で検出• オブジェクトの状態を上書き。構成ファイルに明記しなかった部分は既存の

状態が維持される

• オブジェクトを作成する例:

> kubectl create –f nginx.yaml

> kubectl apply –f configs/

アプリケーションを公開するには

コンテナのデプロイ

• コンテナレジストリから取得するのが基本

• プライベートのレジストリを使うことも可能

k8sクラスター

>_

kubectl (CLI)

コンテナレジストリ

> kubectl run …

公開方法のバリエーション

• APIサーバー経由でのアクセス

• ServiceのNodePortタイプ

• ServiceのLoadBarancerタイプ

• Ingress (beta)

APIサーバー経由でのアクセス

• kubectlをproxyとして稼働させて、認証なしのAPIエンドポイントへの経路を構成

• 所定のAPIエンドポイントにリクエストを投げるとコンテナに届く

• お試し用。k8sクラスター

kubectl

> kubectl proxy …

>_

APIサーバー

リクエスト

ServiceのNodePortタイプ

• 対象のPodにルーティングされる口を、各Node上に構成する

• ポート番号は、各ノードで共通

クラスター外からのリクエスト

172.17.8.104

172.17.8.103

172.17.8.102

172.17.8.104:30159

172.17.8.102:30159

172.17.8.103:30159

ServiceのLoadBalancerタイプ

• GCP, AWS, Azure上のロードバランサーを自動構成

• クラスター内にはNodePortまたはClusterIPタイプのServiceを構成

クラスター外からのリクエスト

LB

Ingress

• API Server上にLoadBalancerを構成して、クラスター内にリクエストをルーティング

• ロードバランシング、SSL/TLS終端等の機能を提供

• Kubernetes 1.1から利用できるが、まだBeta…

ハンズオン (2)アプリケーションを公開してみよう

その前に…

Kubernetes meets Serverless

Fn Project

• http://fnproject.io/

→サーバーレス・アプリケーションを作るためのフレームワーク

Open & Easy

• Open• Open Source (Apache 2.0)

• マルチ言語サポート• JS, Java, Ruby, Python, Go

• どこでも動く• ラップトップ、サーバー、クラウド

• Easy• 全ての操作はシンプルなCLI

• 考え抜かれた開発者エクスペリエンス

構成

• Fn Server上にFunctionがのるDinD(Docker in Docker)構成

• トリガーがキックされる度に対応するFunctionのコンテナを立ち上げる

• コンテナ群の管理はCLIが隠蔽

Function 1

Function

Function 2

Function

Fn Serverfn-app/hello-node

fn-app/hello-java

Fn Flow

• 複数のファンクションの連結を手続き的記述で実現

Flowは現在Javaのみ対応。随時対応言語を増やしていくとのこと

Fn Flow

• 並列・非同期処理

Fn Flow

• エラーハンドリング

Fn Flow

• 複数のファンクションの連結を手続き的記述で実現

• なにがいいの?テストしやすい

デバッグしやすい

読んで理解しやすい

エラー処理で死なない

たぶん…。

ハンズオン (2)アプリケーションを公開してみよう

次回予告

次回コンテンツ 案(1)

• 「Kubernetes Network Deep Dive!」

• コンテンツ• 今回取り上げられなかった、k8sネットワーク周りを深掘り

• サービス・メッシュでk8s上にインテリジェントなネットワークを

次回コンテンツ 案(2)

• 「Kubernetes in プロダクション!」

• コンテンツ• 実運用を想定したk8sの使い方を学びます。例えば…。

ロードバランサーの構成方法

管理ノードの冗長化構成はどう作る?

永続化層はどうすれば?

コンテナのアップデート

オートスケーリング

お知らせ

• アンケートにご協力ください

http://bit.ly/cndjp1-survey

• Slackチャネルにもぜひご参加ください

http://bit.ly/cndjp-slack

お疲れ様でした!#cndjp1

top related