Slide 1

Slide 1 text

Kubernetesに ⼊入⾨門したい v1.0 @hihihiroro

Slide 2

Slide 2 text

個⼈人的な話になりますが、

Slide 3

Slide 3 text

最近、
 Kubernetes 触り始めました

Slide 4

Slide 4 text

Kubernetesって 難しくないですか?

Slide 5

Slide 5 text

コンセプトとか コンポーネントの繋がりとか

Slide 6

Slide 6 text

僕には難しい

Slide 7

Slide 7 text

難しいからなんとなく 整理理してみる

Slide 8

Slide 8 text

• Kubernetesとは • Kubernetesのコンセプト • Kubernetes使ってみる

Slide 9

Slide 9 text

# Kubernetesとは

Slide 10

Slide 10 text

kubernetes • オーケストレーションツール • アプリケーション、ミドルウェア、
 ストレージなどで構成されるシステムを
 構築、設定、運⽤用を⾃自動化する

Slide 11

Slide 11 text

kubernetes • オーケストレーションツール • プロビジョニング • オートスケーリング • 死活監視 • サービスディスカバリ

Slide 12

Slide 12 text

kubernetes • オーケストレーションツール • プロビジョニング • オートスケーリング • 死活監視 • サービスディスカバリ コンテナに特化!!

Slide 13

Slide 13 text

kubernetesをまとめると • Googleの内部で使われている
 コンテナオーケストレーター(Borg)のOSS • マシンではなくアプリケーションを管理理 • ⻑⾧長いのでk8sってよく省略略される

Slide 14

Slide 14 text

コンテナ )BSEXBSF -JOVY,FSOFM CJO-JCT CJO-JCT BQQ BQQ )BSEXBSF )ZQFSWJTPS CJO-JCT CJO-JCT 04 04 BQQ BQQ )BSEXBSF 04 CJO-JCT BQQ BQQ DPOUBJOFS
 DPOUBJOFS
 7. 仮想化 コンテナ 物理理 7. • デプロイ時間が遅い • 無駄なリソースが必要 • スケールしづらい • 複雑な仕組み • 無駄なリソースが必要 • 環境依存問題 • プロセスでのデプロイ • ファイルシステム化 • 少リソースで実⾏行行

Slide 15

Slide 15 text

コンテナの問題点 • そもそもコンテナってどうやってたてるの? • コンテナをどこのホストにどう配備するの? • 今稼働しているコンテナをどう管理理するの? • コンテナ間の依存関係の解決はどうするの? • 死活監視はどうするの?

Slide 16

Slide 16 text

コンテナの問題点 • そもそもコンテナってどうやってたてるの? • コンテナをどこのホストにどう配備するの? • 今稼働しているコンテナをどう管理理するの? • コンテナ間の依存関係の解決はどうするの? • 死活監視はどうするの? Docker オーケストレーションツール

Slide 17

Slide 17 text

Docker Linuxカーネルのコンテナ技術を⽤用いた w w w w w w w w w w w w w w w w w w w w アプリケーションを ・開発 ・搬送 ・実⾏行行 するためのプラットフォーム

Slide 18

Slide 18 text

Docker • Dockerイメージ • イメージ・レイヤの積み重ね(読み込み専⽤用) • Dockerコンテナ • イメージ・レイヤを
 1つのファイルシステムとみなす • 読み書き可能なイメージ・レイヤを持つ https://docs.docker.com/engine/userguide/storagedriver/ imagesandcontainers/#container-and-layers

Slide 19

Slide 19 text

オーケストレーションツール • Docker Swarm • Dockerのネイティブオーケストレーションツール • Nomad • ジョブスケジューリング管理理ツール • Mesos+marathon • Mesos上で動く⻑⾧長期実⾏行行⽤用フレームワーク • Kubernetes(k8s) • コンテナに特化したオーケストレーションツール

Slide 20

Slide 20 text

# Kubernetesのコンセプト

Slide 21

Slide 21 text

# Kubernetesのコンセプト k8s

Slide 22

Slide 22 text

# k8sのコンセプト

Slide 23

Slide 23 text

k8s⽤用語 • コンテナ実⾏行行環境 • 複数コンテナの取扱 • 外部からのアクセス • データの取扱 • デプロイパターン

Slide 24

Slide 24 text

k8s⽤用語 • コンテナ実⾏行行環境 • 複数コンテナの取扱 • 外部からのアクセス • データの取扱 • デプロイパターン

Slide 25

Slide 25 text

Node/Cluster • Node:コンテナをデプロイ先VMもしくは物理理サー バ • Cluster:Nodeの集合体 kubelet Docker kube-proxy Node Cluster kubelet Docker kube-proxy Node

Slide 26

Slide 26 text

Node/Cluster Node • コンテナのデプロイ先 VMもしくは物理理サーバ • 元の名前はMinion kubelet Docker kube-proxy Node Cluster kubelet Docker kube-proxy Node Cluster • Nodeの集合体

Slide 27

Slide 27 text

Pod Pod • デプロイの最⼩小単位 • 1個以上の
 コンテナの集合体 Pod内部のコンテナ
 →IPやポートを共有 kubelet Docker kube-proxy Volume Container Pod Pod Pod

Slide 28

Slide 28 text

k8s⽤用語 • コンテナ実⾏行行環境 • 複数コンテナの取扱 • 外部からのアクセス • データの取扱 • デプロイパターン

Slide 29

Slide 29 text

k8s⽤用語 • コンテナ実⾏行行環境 • 複数コンテナの取扱 • 外部からのアクセス • データの取扱 • デプロイパターン

Slide 30

Slide 30 text

k8s⽤用語 • コンテナ実⾏行行環境 • 複数コンテナの取扱 • 外部からのアクセス • データの取扱 • デプロイパターン Pod

Slide 31

Slide 31 text

k8s⽤用語 • コンテナ実⾏行行環境 • 複数Podの取扱 • 外部からのアクセス • データの取扱 • デプロイパターン

Slide 32

Slide 32 text

Label Label • リソースに付与する
 任意の⽂文字列列 • {名前:値}のKey-Value • リソースのグルーピングに使⽤用 kubelet Docker kube-proxy FOWQSP SPMFBQJ FOWQSP SPMF%#

Slide 33

Slide 33 text

Service Service • サービスディスカバリ • Podへのアクセス⼿手段を提供 • 仮想IP(Cluster IP)を付与

Slide 34

Slide 34 text

k8s⽤用語 • コンテナ実⾏行行環境 • 複数Podの取扱 • 外部からのアクセス • データの取扱 • デプロイパターン

Slide 35

Slide 35 text

Service Service • サービスディスカバリ • Podへのアクセス⼿手段を提供 • Node上に静的なポート番号を公開

Slide 36

Slide 36 text

Service Service • ClusterIP : 複数のPodを紐付ける
 クラスタ内仮想IP • NodePort : ClusterIPをNode上の
 静的なポートで公開

Slide 37

Slide 37 text

Service kubelet Docker kube-proxy :80 :8080 :10025 :25 SPMF" SPMF# Service : A • ClusterIP : 8080 • NodePort : 80 Service : B • ClusterIP : 10025 • NodePort : 25

Slide 38

Slide 38 text

Service(Cluster内通信) kubelet Docker kube-proxy :80 :8080 :10025 :25 SPMF" SPMF# Docker kubelet kube-proxy SPMF" :8080 :80 :25 :10025 Cluster内からService:Bへアクセス port:10025へアクセス

Slide 39

Slide 39 text

Service(Cluster内通信) kubelet Docker kube-proxy :80 :8080 :10025 :25 SPMF" SPMF# Docker kubelet kube-proxy SPMF" :8080 :80 :25 :10025 Cluster内からService:Bへアクセス

Slide 40

Slide 40 text

Service(Cluster内通信) kubelet Docker kube-proxy :80 :8080 :10025 :25 SPMF" SPMF# Docker kubelet kube-proxy SPMF" :8080 :80 :25 :10025 Cluster内からService:Bへアクセス kube-proxy • Service→Podへのルーティング (iptablesによって実現)

Slide 41

Slide 41 text

Service(Cluster内通信) kubelet Docker kube-proxy :80 :8080 :10025 :25 SPMF" SPMF# Docker kubelet kube-proxy SPMF" :8080 :80 :25 :10025 Cluster内からService:Bへアクセス

Slide 42

Slide 42 text

Service(Cluster外通信) kubelet Docker kube-proxy :80 :8080 :10025 :25 SPMF" SPMF# Docker kubelet kube-proxy SPMF" :8080 :80 :25 :10025 SLB Cluster外のサーバからService:Bへアクセス

Slide 43

Slide 43 text

Service(Cluster外通信) kubelet Docker kube-proxy :80 :8080 :10025 :25 SPMF" SPMF# Docker kubelet kube-proxy SPMF" :8080 :80 :25 :10025 SLB Cluster外のサーバからService:Bへアクセス port:25へアクセス

Slide 44

Slide 44 text

Service(Cluster外通信) kubelet Docker kube-proxy :80 :8080 :10025 :25 SPMF" SPMF# Docker kubelet kube-proxy SPMF" :8080 :80 :25 :10025 SLB Cluster外のサーバからService:Bへアクセス

Slide 45

Slide 45 text

Service(Cluster外通信) kubelet Docker kube-proxy :80 :8080 :10025 :25 SPMF" SPMF# Docker kubelet kube-proxy SPMF" :8080 :80 :25 :10025 SLB Cluster外のサーバからService:Bへアクセス

Slide 46

Slide 46 text

Ingress • 通信内容をServiceにプロキシする • HTTPロードバランサに特化した実装 • L7バランサ

Slide 47

Slide 47 text

k8s⽤用語 • コンテナ実⾏行行環境 • 複数Podの取扱 • 外部からのアクセス • データの取扱 • デプロイパターン

Slide 48

Slide 48 text

Volume • 外部ストレージをコンテナにマウント • emptyDir Volume • Node上に領域を確保。Podが削除されると廃棄 • hostPath Volume • Node上に領域を確保。Nodeが削除されると廃棄 • Persistent Volume • ネットワークストレージ上に領域を確保。

Slide 49

Slide 49 text

Configmap • 設定をコンテナイメージ外に登録 • {名前:値}のKey-Value • プレーンテキストで格納

Slide 50

Slide 50 text

Secret • 設定をコンテナイメージ外に登録 • {名前:値}のKey-Value • base64エンコードして格納

Slide 51

Slide 51 text

ConfigMap/Secret • Podへの渡し⽅方 • Volumeとしてマウント • 環境変数に設定

Slide 52

Slide 52 text

ConfigMap/Secret(マウント) ConfigMap PROP.1: hoge PROP.2: piyo Secret PASS.1: cGFzcw== kubelet Docker kube-proxy /etc/config /etc/secret /etc/config/PROP.1 : hoge /etc/config/PROP.2 : piyo /etc/secret/PASS.1 : pass volum e volum e

Slide 53

Slide 53 text

ConfigMap/Secret(環境変数) kubelet Docker kube-proxy PROP.1=hoge PROP.2=piyo PASS.1=pass ConfigMap PROP.1: hoge PROP.2: piyo Secret PASS.1: cGFzcw== envFrom envFrom

Slide 54

Slide 54 text

k8s⽤用語 • コンテナ実⾏行行環境 • 複数Podの取扱 • 外部からのアクセス • データの取扱 • デプロイパターン

Slide 55

Slide 55 text

デプロイパターン • Deployment : ⽔水平スケーリングパターン • DaemonSet : 各Node配置パターン • StatefuleSet : ステート管理理パターン • Job : タスク実⾏行行⽤用パターン • CronJob : 定期タスク実⾏行行⽤用パターン

Slide 56

Slide 56 text

Deployment • 複数Podの並列列起動、世代管理理 • ReplicaSetの世代管理理 • ローリングアップデート • ロールバック

Slide 57

Slide 57 text

ReplicaSet • 複数Podの並列列起動、世代管理理 • Podの管理理 • template : Podの定義 • replicas : Podの個数 • リソースが空いてるNodeに配置する

Slide 58

Slide 58 text

Deployment/ReplicaSet kubelet Docker kube-proxy Docker kubelet kube-proxy service1-xxx version : 1 Deployment name : service1 ReplicaSet replicas : 2 version : 1 service1-yyy version : 1

Slide 59

Slide 59 text

Deployment/ReplicaSet kubelet Docker kube-proxy Docker kubelet kube-proxy service1-xxx version : 1 Deployment name : service1 ReplicaSet replicas : 2 version : 1 service1-yyy version : 1 ReplicaSet replicas : 2 version : 2

Slide 60

Slide 60 text

Deployment/ReplicaSet kubelet Docker kube-proxy Docker kubelet kube-proxy service1-xxx version : 1 Deployment name : service1 ReplicaSet replicas : 2 version : 1 service1-yyy version : 1 ReplicaSet replicas : 2 version : 2 service1-aaa version : 2

Slide 61

Slide 61 text

Deployment/ReplicaSet kubelet Docker kube-proxy Docker kubelet kube-proxy Deployment name : service1 ReplicaSet replicas : 2 version : 1 service1-yyy version : 1 ReplicaSet replicas : 2 version : 2 service1-aaa version : 2

Slide 62

Slide 62 text

Deployment/ReplicaSet kubelet Docker kube-proxy Docker kubelet kube-proxy Deployment name : service1 ReplicaSet replicas : 2 version : 1 service1-yyy version : 1 ReplicaSet replicas : 2 version : 2 service1-zzz version : 2 service1-aaa version : 2

Slide 63

Slide 63 text

Deployment/ReplicaSet kubelet Docker kube-proxy Docker kubelet kube-proxy Deployment name : service1 ReplicaSet replicas : 2 version : 1 ReplicaSet replicas : 2 version : 2 service1-zzz version : 2 service1-aaa version : 2

Slide 64

Slide 64 text

Deployment/ReplicaSet kubelet Docker kube-proxy Docker kubelet kube-proxy Deployment name : service1 ReplicaSet replicas : 2 version : 1 ReplicaSet replicas : 2 version : 2 service1-zzz version : 2 service1-aaa version : 2

Slide 65

Slide 65 text

DaemonSet • 各Nodeに必ず1つだけPodを起動 • 監視ツール • ログ収集 • メトリクス収集

Slide 66

Slide 66 text

DaemonSet kubelet Docker kube-proxy Docker kubelet kube-proxy TFSWJDFYYY DaemonSet name : service1 TFSWJDFZZZ

Slide 67

Slide 67 text

StatefulSet • 通し番号付きのPodを作成、番号順に起動 • Podが削除された場合同じ名前で起動される • 同じPersistent Volumeが使われる • mysql(master)、mysql(slave)、mysql(slave)

Slide 68

Slide 68 text

StatefulSet kubelet Docker kube-proxy Docker kubelet kube-proxy StatefulSet name : service1 replica : 3 TFSWJDF

Slide 69

Slide 69 text

StatefulSet kubelet Docker kube-proxy Docker kubelet kube-proxy StatefulSet name : service1 replica : 3 TFSWJDF TFSWJDF

Slide 70

Slide 70 text

StatefulSet kubelet Docker kube-proxy Docker kubelet kube-proxy StatefulSet name : service1 replica : 3 TFSWJDF TFSWJDF TFSWJDF

Slide 71

Slide 71 text

Job • Podが正しく起動、終了了、停⽌止まで保証 • parallelism : 同時起動するPodの数 • completions : Jobを成功とみなすのに
 必要なPodの終了了数 • 完了了後も完了了ステータスでリソースは残る

Slide 72

Slide 72 text

Job kubelet Docker kube-proxy Docker kubelet kube-proxy Job parallelism : 3 completions : 2 TFSWJDFYYY TFSWJDF[[[ TFSWJDFZZZ

Slide 73

Slide 73 text

Job kubelet Docker kube-proxy Docker kubelet kube-proxy Job parallelism : 3 completions : 2 TFSWJDFYYY TFSWJDF[[[ TFSWJDFZZZ ̋ ̋ × Jobから作成されたPodは Jobに結果を通知する

Slide 74

Slide 74 text

CronJob • 定期的にJobを実⾏行行 • schedule : crontab同様のスケージュル定義 • concurrencyPolicy : 並列列実⾏行行ポリシー • Allow : 並列列実⾏行行許可 • Forbid : 現在分が残ってる場合、次回分をスキップ • Replace : 現在分が残ってる場合、新Jobに置き換え

Slide 75

Slide 75 text

# ざっくりなまとめ

Slide 76

Slide 76 text

kube-apiserver kube-
 controller-manager etcd kube-scheduler ConfigMap Secret … kubelet Docker kube-proxy :80 :8080 :10025 :25 SPMF" Docker kubelet kube-proxy SPMF# :8080 :80 :25 :10025 Service Pod Label Node Deployment ReplicaSet DaemonSet Job … Cluster Master

Slide 77

Slide 77 text

# k8s使ってみる

Slide 78

Slide 78 text

使うもの • Docker for Mac • minikube • k8s

Slide 79

Slide 79 text

Version • Docker for Mac : 17.09.1-ce • minikube : 0.24.1 • k8s : 1.8.0

Slide 80

Slide 80 text

Install⼿手順(Docker for Mac) # manual https://docs.docker.com/docker-for-mac/install/#download-docker-for- mac # homebrew brew cask install docker https://www.docker.com/docker-mac

Slide 81

Slide 81 text

Install⼿手順(kubectl) # manual curl -LO https://storage.googleapis.com/kubernetes-release/release/ `curl -s https://storage.googleapis.com/kubernetes-release/release/ stable.txt`/bin/darwin/amd64/kubectl && chmod +x ./kubectl && sudo mv ./kubectl /usr/local/bin/kubectl # homebrew brew install kubectl https://kubernetes.io/docs/tasks/tools/install-kubectl

Slide 82

Slide 82 text

Install⼿手順(minikube) # manual curl -Lo minikube https://storage.googleapis.com/minikube/releases/ v0.23.0/minikube-darwin-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/ # homebrew brew cask install minikube https://github.com/kubernetes/minikube/releases https://github.com/kubernetes/minikube

Slide 83

Slide 83 text

やること • k8sの公式チュートリアル • https://kubernetes.io/docs/tutorials/ kubernetes-basics • ⾜足りない⽅方はコチラも • https://kubernetes.io/docs/tutorials

Slide 84

Slide 84 text

チュートリアル 1. k8sクラスタ作成 2. k8sクラスタにアプリデプロイ 3. k8sクラスタ外にアプリの公開 4. アプリのスケールアップ 5. ローリングアップデート

Slide 85

Slide 85 text

チュートリアル 1. k8sクラスタ作成 2. k8sクラスタにアプリをデプロイ 3. k8sクラスタ外にアプリの公開 4. アプリのスケールアップ 5. ローリングアップデート

Slide 86

Slide 86 text

k8sクラスタ作成 ## minikubeのversion確認 $ minikube version minikube version: v0.24.1 ## minikube起動 $ minikube start Starting local Kubernetes v1.8.0 cluster... Starting VM... Getting VM IP address... Moving files into cluster... Setting up certs... Connecting to cluster... Setting up kubeconfig... Starting cluster components... Kubectl is now configured to use the cluster. Loading cached images from config file.

Slide 87

Slide 87 text

k8sクラスタ作成 ## kubectlのヴァージョン確認 $ kubectl version Client Version: version.Info{Major:"1", Minor:"8", GitVersion:"v1.8.5", GitCommit:"cce11c6a185279d037023e02ac5249e14daa22bf", GitTreeState:"clean", BuildDate:"2017-12-07T18:09:07Z", GoVersion:"go1.9.2", Compiler:"gc", Platform:"darwin/amd64"} Server Version: version.Info{Major:"1", Minor:"8", GitVersion:"v1.8.0", GitCommit:"0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4", GitTreeState:"clean", BuildDate:"2017-11-29T22:43:34Z", GoVersion:"go1.9.1", Compiler:"gc", Platform:"linux/amd64"}

Slide 88

Slide 88 text

k8sクラスタ作成 ## Cluster情報表示 $ kubectl cluster-info Kubernetes master is running at https://192.168.99.100:8443 To further debug and diagnose cluster problems, use 'kubectl cluster- info dump’. ## Nodeの⼀一覧表示 $ kubectl get nodes NAME STATUS ROLES AGE VERSION minikube Ready 6d v1.8.0 # minikube って名前のnodeが⽴立ち上がった

Slide 89

Slide 89 text

チュートリアル 1. k8sクラスタ作成 2. k8sクラスタにアプリをデプロイ 3. k8sクラスタ外にアプリの公開 4. アプリのスケールアップ 5. ローリングアップデート

Slide 90

Slide 90 text

k8sクラスタにアプリをデプロイ ## kubernetes-bootcampをデプロイ $ kubectl run kubernetes-bootcamp --image=docker.io/jocatalin/ kubernetes-bootcamp:v1 --port=8080 deployment "kubernetes-bootcamp" created ## デプロイされたアプリの⼀一覧表示 $ kubectl get deployments NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE kubernetes-bootcamp 1 1 1 1 18s

Slide 91

Slide 91 text

k8sクラスタにアプリをデプロイ ## k8sクラストにアクセスするためproxyを起動 $ kubectl proxy Starting to serve on 127.0.0.1:8001 ## k8sクラスタにアクセスできるか確認 $ curl http://localhost:8001/version { "major": "1", "minor": "8", "gitVersion": "v1.8.0", "gitCommit": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4", "gitTreeState": "clean", "buildDate": "2017-11-29T22:43:34Z", "goVersion": "go1.9.1", "compiler": "gc", "platform": "linux/amd64" }

Slide 92

Slide 92 text

k8sクラスタにアプリをデプロイ ## Podの名前を取得 $ export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}') $ echo Name of the Pod: $POD_NAME Name of the Pod: kubernetes-bootcamp-6db74b9f76-4t8fc ## アプリにアクセス $ curl http://localhost:8001/api/v1/proxy/namespaces/default/pods/ $POD_NAME/ Hello Kubernetes bootcamp! | Running on: kubernetes- bootcamp-6db74b9f76-4t8fc | v=1 # kubernetes-bootcampアプリが⽴立ち上がった

Slide 93

Slide 93 text

k8sクラスタにアプリをデプロイ ## Podの⼀一覧表示 $ kubectl get pods NAME READY STATUS RESTARTS AGE kubernetes-bootcamp-6db74b9f76-4t8fc 1/1 Running 0 1m ## Podのログ表示 $ kubectl logs $POD_NAME Kubernetes Bootcamp App Started At: 2017-12-17T08:47:21.490Z | Running On: kubernetes-bootcamp-6db74b9f76-4t8fc Running On: kubernetes-bootcamp-6db74b9f76-4t8fc | Total Requests: 1 | App Uptime: 82.315 seconds | Log Time: 2017-12-17T08:48:43.805Z

Slide 94

Slide 94 text

k8sクラスタにアプリをデプロイ ## Podの詳細表示 $ kubectl describe pods Name: kubernetes-bootcamp-6db74b9f76-4t8fc Namespace: default Node: minikube/192.168.99.100 Start Time: Sun, 17 Dec 2017 17:47:20 +0900 Labels: pod-template-hash=2863065932 run=kubernetes-bootcamp             ・             ・             ・ Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 2m default-scheduler Successfully assigned kubernetes- bootcamp-6db74b9f76-4t8fc to minikube Normal SuccessfulMountVolume 2m kubelet, minikube MountVolume.SetUp succeeded for volume "default-token-2mz8l" Normal Pulled 2m kubelet, minikube Container image "docker.io/jocatalin/ kubernetes-bootcamp:v1" already present on machine Normal Created 2m kubelet, minikube Created container Normal Started 2m kubelet, minikube Started container

Slide 95

Slide 95 text

k8sクラスタにアプリをデプロイ ## Podでコマンド実⾏行行(envコマンド) $ kubectl exec $POD_NAME env PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin HOSTNAME=kubernetes-bootcamp-6db74b9f76-4t8fc KUBERNETES_PORT=tcp://10.96.0.1:443 KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443 KUBERNETES_PORT_443_TCP_PROTO=tcp KUBERNETES_PORT_443_TCP_PORT=443 KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1 KUBERNETES_SERVICE_HOST=10.96.0.1 KUBERNETES_SERVICE_PORT=443 KUBERNETES_SERVICE_PORT_HTTPS=443 NPM_CONFIG_LOGLEVEL=info NODE_VERSION=6.3.1 HOME=/root

Slide 96

Slide 96 text

k8sクラスタにアプリをデプロイ ## Pod内でbash実⾏行行 $ kubectl exec -ti $POD_NAME bash root@kubernetes-bootcamp-6db74b9f76-4t8fc:/# env NODE_VERSION=6.3.1 HOSTNAME=kubernetes-bootcamp-6db74b9f76-4t8fc KUBERNETES_PORT_443_TCP_PORT=443 KUBERNETES_PORT=tcp://10.96.0.1:443 TERM=xterm KUBERNETES_SERVICE_PORT=443 KUBERNETES_SERVICE_HOST=10.96.0.1 NPM_CONFIG_LOGLEVEL=info PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin PWD=/ SHLVL=1 HOME=/root KUBERNETES_PORT_443_TCP_PROTO=tcp KUBERNETES_SERVICE_PORT_HTTPS=443 KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1 KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443 _=/usr/bin/env root@kubernetes-bootcamp-6db74b9f76-4t8fc:/# exit exit $ ここからコンテナ内部 ここでコンテナから抜ける

Slide 97

Slide 97 text

チュートリアル 1. k8sクラスタ作成 2. k8sクラスタにアプリをデプロイ 3. k8sクラスタ外にアプリの公開 4. アプリのスケールアップ 5. ローリングアップデート

Slide 98

Slide 98 text

k8sクラスタ外にアプリの公開 ## Serviceの⼀一覧表示 $ kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 443/TCP 6d ## kubernetes-bootcampを公開 $ kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080 service "kubernetes-bootcamp" exposed ## Serviceの⼀一覧表示 $ kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 443/TCP 6d kubernetes-bootcamp NodePort 10.108.145.126 8080:32593/TCP 6s # kubernetes-bootcamp⽤用のServiceが⽴立ち上がった

Slide 99

Slide 99 text

k8sクラスタ外にアプリの公開 ## Serviceの詳細表示 $ kubectl describe services/kubernetes-bootcamp Name: kubernetes-bootcamp Namespace: default Labels: run=kubernetes-bootcamp Annotations: Selector: run=kubernetes-bootcamp Type: NodePort IP: 10.108.145.126 Port: 8080/TCP TargetPort: 8080/TCP NodePort: 32593/TCP Endpoints: 172.17.0.4:8080 Session Affinity: None External Traffic Policy: Cluster Events:

Slide 100

Slide 100 text

k8sクラスタ外にアプリの公開 ## NodePortの取得 $ export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go- template='{{(index .spec.ports 0).nodePort}}’) $ echo $NODE_PORT 32593 ## NodeのIPを取得 $ export NODE_IP=$(minikube ip) $ echo $NODE_IP 192.168.99.100 ## Nodeに直接アクセス $ curl http://$NODE_IP:$NODE_PORT Hello Kubernetes bootcamp! | Running on: kubernetes- bootcamp-6db74b9f76-4t8fc | v=1

Slide 101

Slide 101 text

k8sクラスタ外にアプリの公開 ## kubernetes-bootcampが動いているPodを表示 $ kubectl get pods -l run=kubernetes-bootcamp NAME READY STATUS RESTARTS AGE kubernetes-bootcamp-6db74b9f76-4t8fc 1/1 Running 0 22m ## kubernetes-bootcampのServiceを表示 $ kubectl get services -l run=kubernetes-bootcamp NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes-bootcamp NodePort 10.108.145.126 8080:32593/TCP 17m

Slide 102

Slide 102 text

k8sクラスタ外にアプリの公開 ## Podの名前を取得 $ export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}') $ echo Name of ths Pod : $POD_NAME Name of ths Pod : kubernetes-bootcamp-6db74b9f76-4t8fc ## app=v1というラベルを付与 $ kubectl label pod $POD_NAME app=v1 pod "kubernetes-bootcamp-6db74b9f76-4t8fc" labeled

Slide 103

Slide 103 text

k8sクラスタ外にアプリの公開 ## Podの詳細表示 $ kubectl describe pods/$POD_NAME Name: kubernetes-bootcamp-6db74b9f76-4t8fc Namespace: default Node: minikube/192.168.99.100 Start Time: Sun, 17 Dec 2017 17:47:20 +0900 Labels: app=v1 pod-template-hash=2863065932 run=kubernetes-bootcamp             ・             ・             ・ Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 28m default-scheduler Successfully assigned kubernetes- bootcamp-6db74b9f76-4t8fc to minikube Normal SuccessfulMountVolume 28m kubelet, minikube MountVolume.SetUp succeeded for volume "default-token-2mz8l" Normal Pulled 28m kubelet, minikube Container image "docker.io/jocatalin/ kubernetes-bootcamp:v1" already present on machine Normal Created 28m kubelet, minikube Created container Normal Started 28m kubelet, minikube Started container

Slide 104

Slide 104 text

k8sクラスタ外にアプリの公開 ## app=v1のPodを表示 $ kubectl get pods -l app=v1 NAME READY STATUS RESTARTS AGE kubernetes-bootcamp-6db74b9f76-4t8fc 1/1 Running 0 33m

Slide 105

Slide 105 text

k8sクラスタ外にアプリの公開 ## Serviceの削除 $ kubectl delete services -l run=kubernetes-bootcamp service "kubernetes-bootcamp" deleted ## Serviceの⼀一覧表示 $ kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 443/TCP 6d ## Nodeに直接アクセスできないことの確認 $ curl http://$NODE_IP:$NODE_PORT curl: (7) Failed to connect to 192.168.99.100 port 32593: Connection refused ## アプリが⽣生きていることの確認 $ kubectl exec -ti $POD_NAME curl localhost:8080 Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-6db74b9f76-4t8fc | v=1

Slide 106

Slide 106 text

チュートリアル 1. k8sクラスタ作成 2. k8sクラスタにアプリをデプロイ 3. k8sクラスタ外にアプリの公開 4. アプリのスケールアップ 5. ローリングアップデート

Slide 107

Slide 107 text

アプリのスケールアップ ## デプロイされたアプリの⼀一覧表示 $ kubectl get deployments NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE kubernetes-bootcamp 1 1 1 1 49m # 1個のアプリケーションが起動中 ## スケールアップ $ kubectl scale deployments/kubernetes-bootcamp --replicas=4 deployment "kubernetes-bootcamp" scaled ## デプロイされたアプリの⼀一覧表示 $ kubectl get deployments NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE kubernetes-bootcamp 4 4 4 4 51m # アプリが4個にスケールアップ

Slide 108

Slide 108 text

アプリのスケールアップ ## Podの⼀一覧表示 $ kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE kubernetes-bootcamp-6db74b9f76-2wkqp 1/1 Running 0 3m 172.17.0.6 minikube kubernetes-bootcamp-6db74b9f76-4t8fc 1/1 Running 0 55m 172.17.0.4 minikube kubernetes-bootcamp-6db74b9f76-fs8c9 1/1 Running 0 3m 172.17.0.7 minikube kubernetes-bootcamp-6db74b9f76-lkx8h 1/1 Running 0 3m 172.17.0.5 minikube

Slide 109

Slide 109 text

アプリのスケールアップ ## デプロイされたアプリの詳細表示 $ kubectl describe deployments/kubernetes-bootcamp Name: kubernetes-bootcamp Namespace: default CreationTimestamp: Sun, 17 Dec 2017 17:47:20 +0900 Labels: run=kubernetes-bootcamp Annotations: deployment.kubernetes.io/revision=1 Selector: run=kubernetes-bootcamp Replicas: 4 desired | 4 updated | 4 total | 4 available | 0 unavailable StrategyType: RollingUpdate MinReadySeconds: 0 ・ ・ ・ OldReplicaSets: NewReplicaSet: kubernetes-bootcamp-6db74b9f76 (4/4 replicas created) Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal ScalingReplicaSet 55m deployment-controller Scaled up replica set kubernetes- bootcamp-6db74b9f76 to 1 Normal ScalingReplicaSet 4m deployment-controller Scaled up replica set kubernetes- bootcamp-6db74b9f76 to 4

Slide 110

Slide 110 text

アプリのスケールアップ ## スケールダウン $ kubectl scale deployments/kubernetes-bootcamp --replicas=2 deployment "kubernetes-bootcamp" scaled ## デプロイされたアプリの⼀一覧表示 $ kubectl get deployments NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE kubernetes-bootcamp 2 2 2 2 1h # アプリが2個にスケールダウン

Slide 111

Slide 111 text

アプリのスケールアップ ## Podの⼀一覧表示 $ kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE kubernetes-bootcamp-6db74b9f76-2wkqp 1/1 Terminating 0 10m 172.17.0.6 minikube kubernetes-bootcamp-6db74b9f76-4t8fc 1/1 Running 0 1h 172.17.0.4 minikube kubernetes-bootcamp-6db74b9f76-fs8c9 1/1 Running 0 10m 172.17.0.7 minikube kubernetes-bootcamp-6db74b9f76-lkx8h 1/1 Terminating 0 10m 172.17.0.5 minikube # 2個のPodがTerminatingに

Slide 112

Slide 112 text

アプリのスケールアップ ## Podの⼀一覧表示 $ kubectl get pods NAME READY STATUS RESTARTS AGE kubernetes-bootcamp-6db74b9f76-4t8fc 1/1 Running 0 1h kubernetes-bootcamp-6db74b9f76-fs8c9 1/1 Running 0 12m # しばらくするとRunningのみに

Slide 113

Slide 113 text

チュートリアル 1. k8sクラスタ作成 2. k8sクラスタにアプリをデプロイ 3. k8sクラスタ外にアプリの公開 4. アプリのスケールアップ 5. ローリングアップデート

Slide 114

Slide 114 text

ローリングアップデート ## デプロイされたアプリの⼀一覧表示 $ kubectl get deployments NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE kubernetes-bootcamp 2 2 2 2 1h ## Podの⼀一覧表示 $ kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE kubernetes-bootcamp-6db74b9f76-4t8fc 1/1 Running 0 1h 172.17.0.4 minikube kubernetes-bootcamp-6db74b9f76-fs8c9 1/1 Running 0 19m 172.17.0.7 minikube

Slide 115

Slide 115 text

ローリングアップデート ## Podの詳細表示 $ kubectl describe pods Name: kubernetes-bootcamp-6db74b9f76-4t8fc Namespace: default Node: minikube/192.168.99.100 Start Time: Sun, 17 Dec 2017 17:47:20 +0900 Labels: app=v1 pod-template-hash=2863065932 run=kubernetes-bootcamp ・ ・ ・ Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 19m default-scheduler Successfully assigned kubernetes- bootcamp-6db74b9f76-fs8c9 to minikube Normal SuccessfulMountVolume 19m kubelet, minikube MountVolume.SetUp succeeded for volume "default-token-2mz8l" Normal Pulled 19m kubelet, minikube Container image "docker.io/jocatalin/ kubernetes-bootcamp:v1" already present on machine Normal Created 19m kubelet, minikube Created container Normal Started 19m kubelet, minikube Started container

Slide 116

Slide 116 text

ローリングアップデート ## サービスを作成 $ kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080 service "kubernetes-bootcamp" exposed ## Serviceの詳細表示 $ kubectl describe services/kubernetes-bootcamp Name: kubernetes-bootcamp Namespace: default Labels: run=kubernetes-bootcamp Annotations: Selector: run=kubernetes-bootcamp Type: NodePort IP: 10.107.5.238 Port: 8080/TCP TargetPort: 8080/TCP NodePort: 32430/TCP Endpoints: 172.17.0.4:8080,172.17.0.7:8080 Session Affinity: None External Traffic Policy: Cluster Events:

Slide 117

Slide 117 text

ローリングアップデート ## アプリをv2にバージョンアップ $ kubectl set image deployments/kubernetes-bootcamp kubernetes- bootcamp=jocatalin/kubernetes-bootcamp:v2 ## Podの⼀一覧表示 $ kubectl get pods NAME READY STATUS RESTARTS AGE kubernetes-bootcamp-6566f8f9db-5m2z4 0/1 ContainerCreating 0 1s kubernetes-bootcamp-6566f8f9db-xznsk 0/1 ContainerCreating 0 1s kubernetes-bootcamp-6db74b9f76-4t8fc 1/1 Running 0 1h kubernetes-bootcamp-6db74b9f76-fs8c9 1/1 Terminating 0 25m

Slide 118

Slide 118 text

ローリングアップデート ## Podの推移 $ kubectl get pods NAME READY STATUS RESTARTS AGE kubernetes-bootcamp-6566f8f9db-5m2z4 0/1 ContainerCreating 0 1s kubernetes-bootcamp-6566f8f9db-xznsk 0/1 ContainerCreating 0 1s kubernetes-bootcamp-6db74b9f76-4t8fc 1/1 Running 0 1h kubernetes-bootcamp-6db74b9f76-fs8c9 1/1 Terminating 0 25m $ kubectl get pods NAME READY STATUS RESTARTS AGE kubernetes-bootcamp-6566f8f9db-5m2z4 1/1 Running 0 5s kubernetes-bootcamp-6566f8f9db-xznsk 0/1 ContainerCreating 0 5s kubernetes-bootcamp-6db74b9f76-4t8fc 1/1 Terminating 0 1h kubernetes-bootcamp-6db74b9f76-fs8c9 1/1 Terminating 0 25m $ kubectl get pods NAME READY STATUS RESTARTS AGE kubernetes-bootcamp-6566f8f9db-5m2z4 1/1 Running 0 16s kubernetes-bootcamp-6566f8f9db-xznsk 1/1 Running 0 16s kubernetes-bootcamp-6db74b9f76-4t8fc 1/1 Terminating 0 1h kubernetes-bootcamp-6db74b9f76-fs8c9 1/1 Terminating 0 25m $ kubectl get pods NAME READY STATUS RESTARTS AGE kubernetes-bootcamp-6566f8f9db-5m2z4 1/1 Running 0 1m kubernetes-bootcamp-6566f8f9db-xznsk 1/1 Running 0 1m 新アプリの起動 1コンテナ切り替わり 2コンテナ切り替わり 旧アプリの削除

Slide 119

Slide 119 text

ローリングアップデート ## Serviceの詳細表示 $ kubectl describe services/kubernetes-bootcamp Name: kubernetes-bootcamp Namespace: default Labels: run=kubernetes-bootcamp Annotations: Selector: run=kubernetes-bootcamp Type: NodePort IP: 10.107.5.238 Port: 8080/TCP TargetPort: 8080/TCP NodePort: 32430/TCP Endpoints: 172.17.0.5:8080,172.17.0.6:8080 Session Affinity: None External Traffic Policy: Cluster Events:

Slide 120

Slide 120 text

k8sクラスタ外にアプリの公開 ## NodePortの取得 $ export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go- template='{{(index .spec.ports 0).nodePort}}') $ echo $NODE_PORT 32430 ## NodeのIPを取得 $ export NODE_IP=$(minikube ip) $ echo $NODE_IP 192.168.99.100 ## Nodeに直接アクセス $ curl http://$NODE_IP:$NODE_PORT Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-6566f8f9db-5m2z4 | v=2 # アプリがv2になっていることが確認できる

Slide 121

Slide 121 text

k8sクラスタ外にアプリの公開 ## ローリングアップデートの状態確認 $ kubectl rollout status deployments/kubernetes-bootcamp deployment "kubernetes-bootcamp" successfully rolled out # ローリングアップデート成功

Slide 122

Slide 122 text

ローリングアップデート ## Podの詳細表示 $ kubectl describe pods Name: kubernetes-bootcamp-6566f8f9db-5m2z4 Namespace: default Node: minikube/192.168.99.100 Start Time: Sun, 17 Dec 2017 19:03:57 +0900 Labels: pod-template-hash=2122949586 run=kubernetes-bootcamp Annotations: kubernetes.io/created-by={"kind":"SerializedReference","apiVersion":"v1","reference": {"kind":"ReplicaSet","namespace":"default","name":"kubernetes-bootcamp-6566f8f9db","uid":"98ce05ec-e311-11e7-a398-0... Status: Running IP: 172.17.0.5 Created By: ReplicaSet/kubernetes-bootcamp-6566f8f9db Controlled By: ReplicaSet/kubernetes-bootcamp-6566f8f9db Containers: kubernetes-bootcamp: Container ID: docker://ea0f360269c505075bde352bc00f916c79ff46c2eb22075161333b5eb181d76b Image: jocatalin/kubernetes-bootcamp:v2 ・ ・ Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 10m default-scheduler Successfully assigned kubernetes-bootcamp-6566f8f9db-xznsk to minikube Normal SuccessfulMountVolume 10m kubelet, minikube MountVolume.SetUp succeeded for volume "default-token-2mz8l" Normal Pulling 10m kubelet, minikube pulling image "jocatalin/kubernetes-bootcamp:v2" Normal Pulled 10m kubelet, minikube Successfully pulled image "jocatalin/kubernetes-bootcamp:v2" Normal Created 10m kubelet, minikube Created container Normal Started 10m kubelet, minikube Started container imageがv2になっている

Slide 123

Slide 123 text

ローリングアップデート ## アプリをv10にバージョンアップ # v10は存在しないタグの為ローリングアップーデートが失敗する $ kubectl set image deployments/kubernetes-bootcamp kubernetes- bootcamp=jocatalin/kubernetes-bootcamp:v10 deployment "kubernetes-bootcamp" image updated ## Podの⼀一覧表示 $ kubectl get pods NAME READY STATUS RESTARTS AGE kubernetes-bootcamp-5466c44897-hqjdw 0/1 ErrImagePull 0 14s kubernetes-bootcamp-5466c44897-jxmlw 0/1 ErrImagePull 0 13s kubernetes-bootcamp-6566f8f9db-5m2z4 1/1 Running 0 16m kubernetes-bootcamp-6566f8f9db-xznsk 1/1 Terminating 0 16m ## デプロイされたアプリの⼀一覧表示 $ kubectl get deployments NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE kubernetes-bootcamp 2 3 2 1 1h

Slide 124

Slide 124 text

ローリングアップデート ## ローリングアップデートの中⽌止 $ kubectl rollout undo deployments/kubernetes-bootcamp deployment "kubernetes-bootcamp" rolled back ## Podの⼀一覧表示 $ kubectl get pods NAME READY STATUS RESTARTS AGE kubernetes-bootcamp-6566f8f9db-5m2z4 1/1 Running 0 21m kubernetes-bootcamp-6566f8f9db-tsjrt 1/1 Running 0 36s ## デプロイされたアプリの⼀一覧表示 $ kubectl get deployments NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE kubernetes-bootcamp 2 2 2 2 1h # ロールバックに成功している

Slide 125

Slide 125 text

# まとめ

Slide 126

Slide 126 text

まとめ • k8sの重要そうな⽤用語をまとめてみた • 詳しくは書いてないのでざっくりベース • 公式チュートリアルを試してみた • ファイルから読み込むなど他にもできそう

Slide 127

Slide 127 text

# もっと勉勉強しないと!

Slide 128

Slide 128 text

今回はここまで

Slide 129

Slide 129 text

# appendix

Slide 130

Slide 130 text

kube-apiserver kube-
 controller-manager etcd kube-scheduler ConfigMap Secret … kubelet Docker kube-proxy :80 :8080 :10025 :25 SPMF" Docker kubelet kube-proxy SPMF# :8080 :80 :25 :10025 Service Pod Label Node Deployment ReplicaSet DaemonSet Job … Cluster Master

Slide 131

Slide 131 text

Master • kube-apiserver • Kubernetesのリソース情報の管理理を⾏行行う • リソース情報のCRUD処理理担当 • etcdへのアクセスを管理理している • 複数台建てることが可能な設計 https://kubernetes.io/docs/reference/generated/kube-apiserver/

Slide 132

Slide 132 text

Master • kube-scheduler • 新しく作られたPodにNodeを割り当てる • Kubernetes API越しにPod, Nodeの
 リソースを監視 https://kubernetes.io/docs/reference/generated/kube-scheduler/

Slide 133

Slide 133 text

Master • kube-controller-manager • 各種リソースのコントローラを起動する • Node Controller • Replication Controller • Endpoints Controller • Service Account & Token Controllers https://kubernetes.io/docs/reference/generated/kube-controller-manager/

Slide 134

Slide 134 text

kube-apiserver kube-
 controller-manager etcd kube-scheduler ConfigMap Secret … kubelet Docker kube-proxy :80 :8080 :10025 :25 SPMF" Docker kubelet kube-proxy SPMF# :8080 :80 :25 :10025 Service Pod Label Node Deployment ReplicaSet DaemonSet Job … Cluster Master

Slide 135

Slide 135 text

Node • kubelet • Podの起動・管理理を⾏行行う • Podの情報は以下の⽅方法で受け取る • apiserver • ローカルファイル • HTTPエンドポイント • HTTPサーバー https://kubernetes.io/docs/reference/generated/kubelet/

Slide 136

Slide 136 text

Node • kube-proxy • Serviceが持つClusterIPを転送する • ロードバランスはラウンドロビン https://kubernetes.io/docs/reference/generated/kube-proxy/