Kubernetesに入門したい

F2e4745f5f04a43b08d5419315b68e3c?s=47 Hiroaki ONO
December 17, 2017

 Kubernetesに入門したい

Kubernetesを使いはじめてみた際に知っておきたい用語をまとめてみた

F2e4745f5f04a43b08d5419315b68e3c?s=128

Hiroaki ONO

December 17, 2017
Tweet

Transcript

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

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

  3. 最近、
 Kubernetes 触り始めました

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

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

  6. 僕には難しい

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

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

  9. # Kubernetesとは

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

  11. kubernetes • オーケストレーションツール • プロビジョニング • オートスケーリング • 死活監視 •

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

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

  14. コンテナ )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. • デプロイ時間が遅い • 無駄なリソースが必要 • スケールしづらい • 複雑な仕組み • 無駄なリソースが必要 • 環境依存問題 • プロセスでのデプロイ • ファイルシステム化 • 少リソースで実⾏行行
  15. コンテナの問題点 • そもそもコンテナってどうやってたてるの? • コンテナをどこのホストにどう配備するの? • 今稼働しているコンテナをどう管理理するの? • コンテナ間の依存関係の解決はどうするの? •

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

    死活監視はどうするの? Docker オーケストレーションツール
  17. Docker Linuxカーネルのコンテナ技術を⽤用いた w w w w w w w w

    w w w w w w w w w w w w アプリケーションを ・開発 ・搬送 ・実⾏行行 するためのプラットフォーム
  18. Docker • Dockerイメージ • イメージ・レイヤの積み重ね(読み込み専⽤用) • Dockerコンテナ • イメージ・レイヤを
 1つのファイルシステムとみなす

    • 読み書き可能なイメージ・レイヤを持つ https://docs.docker.com/engine/userguide/storagedriver/ imagesandcontainers/#container-and-layers
  19. オーケストレーションツール • Docker Swarm • Dockerのネイティブオーケストレーションツール • Nomad • ジョブスケジューリング管理理ツール

    • Mesos+marathon • Mesos上で動く⻑⾧長期実⾏行行⽤用フレームワーク • Kubernetes(k8s) • コンテナに特化したオーケストレーションツール
  20. # Kubernetesのコンセプト

  21. # Kubernetesのコンセプト k8s

  22. # k8sのコンセプト

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

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

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

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

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

    Docker kube-proxy Volume Container Pod Pod Pod
  28. k8s⽤用語 • コンテナ実⾏行行環境 • 複数コンテナの取扱 • 外部からのアクセス • データの取扱 •

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

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

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

    デプロイパターン
  32. Label Label • リソースに付与する
 任意の⽂文字列列 • {名前:値}のKey-Value • リソースのグルーピングに使⽤用 kubelet

    Docker kube-proxy FOWQSP SPMFBQJ FOWQSP SPMF%#
  33. Service Service • サービスディスカバリ • Podへのアクセス⼿手段を提供 • 仮想IP(Cluster IP)を付与

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

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

  36. Service Service • ClusterIP : 複数のPodを紐付ける
 クラスタ内仮想IP • NodePort :

    ClusterIPをNode上の
 静的なポートで公開
  37. Service kubelet Docker kube-proxy :80 :8080 :10025 :25 SPMF" SPMF#

    Service : A • ClusterIP : 8080 • NodePort : 80 Service : B • ClusterIP : 10025 • NodePort : 25
  38. 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へアクセス
  39. Service(Cluster内通信) kubelet Docker kube-proxy :80 :8080 :10025 :25 SPMF" SPMF#

    Docker kubelet kube-proxy SPMF" :8080 :80 :25 :10025 Cluster内からService:Bへアクセス
  40. 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によって実現)
  41. Service(Cluster内通信) kubelet Docker kube-proxy :80 :8080 :10025 :25 SPMF" SPMF#

    Docker kubelet kube-proxy SPMF" :8080 :80 :25 :10025 Cluster内からService:Bへアクセス
  42. 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へアクセス
  43. 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へアクセス
  44. 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へアクセス
  45. 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へアクセス
  46. Ingress • 通信内容をServiceにプロキシする • HTTPロードバランサに特化した実装 • L7バランサ

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

    デプロイパターン
  48. Volume • 外部ストレージをコンテナにマウント • emptyDir Volume • Node上に領域を確保。Podが削除されると廃棄 • hostPath

    Volume • Node上に領域を確保。Nodeが削除されると廃棄 • Persistent Volume • ネットワークストレージ上に領域を確保。
  49. Configmap • 設定をコンテナイメージ外に登録 • {名前:値}のKey-Value • プレーンテキストで格納

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

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

  52. 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
  53. 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
  54. k8s⽤用語 • コンテナ実⾏行行環境 • 複数Podの取扱 • 外部からのアクセス • データの取扱 •

    デプロイパターン
  55. デプロイパターン • Deployment : ⽔水平スケーリングパターン • DaemonSet : 各Node配置パターン •

    StatefuleSet : ステート管理理パターン • Job : タスク実⾏行行⽤用パターン • CronJob : 定期タスク実⾏行行⽤用パターン
  56. Deployment • 複数Podの並列列起動、世代管理理 • ReplicaSetの世代管理理 • ローリングアップデート • ロールバック

  57. ReplicaSet • 複数Podの並列列起動、世代管理理 • Podの管理理 • template : Podの定義 •

    replicas : Podの個数 • リソースが空いてるNodeに配置する
  58. 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
  59. 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
  60. 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
  61. 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
  62. 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
  63. 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
  64. 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
  65. DaemonSet • 各Nodeに必ず1つだけPodを起動 • 監視ツール • ログ収集 • メトリクス収集

  66. DaemonSet kubelet Docker kube-proxy Docker kubelet kube-proxy TFSWJDFYYY DaemonSet name

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

  68. StatefulSet kubelet Docker kube-proxy Docker kubelet kube-proxy StatefulSet name :

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

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

    service1 replica : 3 TFSWJDF TFSWJDF TFSWJDF
  71. Job • Podが正しく起動、終了了、停⽌止まで保証 • parallelism : 同時起動するPodの数 • completions :

    Jobを成功とみなすのに
 必要なPodの終了了数 • 完了了後も完了了ステータスでリソースは残る
  72. Job kubelet Docker kube-proxy Docker kubelet kube-proxy Job parallelism :

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

    3 completions : 2 TFSWJDFYYY TFSWJDF[[[ TFSWJDFZZZ ̋ ̋ × Jobから作成されたPodは Jobに結果を通知する
  74. CronJob • 定期的にJobを実⾏行行 • schedule : crontab同様のスケージュル定義 • concurrencyPolicy :

    並列列実⾏行行ポリシー • Allow : 並列列実⾏行行許可 • Forbid : 現在分が残ってる場合、次回分をスキップ • Replace : 現在分が残ってる場合、新Jobに置き換え
  75. # ざっくりなまとめ

  76. 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
  77. # k8s使ってみる

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

  79. Version • Docker for Mac : 17.09.1-ce • minikube :

    0.24.1 • k8s : 1.8.0
  80. 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
  81. 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
  82. 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
  83. やること • k8sの公式チュートリアル • https://kubernetes.io/docs/tutorials/ kubernetes-basics • ⾜足りない⽅方はコチラも • https://kubernetes.io/docs/tutorials

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

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

    ローリングアップデート
  86. 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.
  87. 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"}
  88. 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 <none> 6d v1.8.0 # minikube って名前のnodeが⽴立ち上がった
  89. チュートリアル 1. k8sクラスタ作成 2. k8sクラスタにアプリをデプロイ 3. k8sクラスタ外にアプリの公開 4. アプリのスケールアップ 5.

    ローリングアップデート
  90. 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
  91. 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" }
  92. 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アプリが⽴立ち上がった
  93. 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
  94. 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
  95. 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
  96. 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 $ ここからコンテナ内部 ここでコンテナから抜ける
  97. チュートリアル 1. k8sクラスタ作成 2. k8sクラスタにアプリをデプロイ 3. k8sクラスタ外にアプリの公開 4. アプリのスケールアップ 5.

    ローリングアップデート
  98. k8sクラスタ外にアプリの公開 ## Serviceの⼀一覧表示 $ kubectl get services NAME TYPE CLUSTER-IP

    EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 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 <none> 443/TCP 6d kubernetes-bootcamp NodePort 10.108.145.126 <none> 8080:32593/TCP 6s # kubernetes-bootcamp⽤用のServiceが⽴立ち上がった
  99. k8sクラスタ外にアプリの公開 ## Serviceの詳細表示 $ kubectl describe services/kubernetes-bootcamp Name: kubernetes-bootcamp Namespace:

    default Labels: run=kubernetes-bootcamp Annotations: <none> Selector: run=kubernetes-bootcamp Type: NodePort IP: 10.108.145.126 Port: <unset> 8080/TCP TargetPort: 8080/TCP NodePort: <unset> 32593/TCP Endpoints: 172.17.0.4:8080 Session Affinity: None External Traffic Policy: Cluster Events: <none>
  100. 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
  101. 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 <none> 8080:32593/TCP 17m
  102. 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
  103. 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
  104. k8sクラスタ外にアプリの公開 ## app=v1のPodを表示 $ kubectl get pods -l app=v1 NAME

    READY STATUS RESTARTS AGE kubernetes-bootcamp-6db74b9f76-4t8fc 1/1 Running 0 33m
  105. 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 <none> 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
  106. チュートリアル 1. k8sクラスタ作成 2. k8sクラスタにアプリをデプロイ 3. k8sクラスタ外にアプリの公開 4. アプリのスケールアップ 5.

    ローリングアップデート
  107. アプリのスケールアップ ## デプロイされたアプリの⼀一覧表示 $ 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個にスケールアップ
  108. アプリのスケールアップ ## 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
  109. アプリのスケールアップ ## デプロイされたアプリの詳細表示 $ 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: <none> 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
  110. アプリのスケールアップ ## スケールダウン $ 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個にスケールダウン
  111. アプリのスケールアップ ## 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に
  112. アプリのスケールアップ ## 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のみに
  113. チュートリアル 1. k8sクラスタ作成 2. k8sクラスタにアプリをデプロイ 3. k8sクラスタ外にアプリの公開 4. アプリのスケールアップ 5.

    ローリングアップデート
  114. ローリングアップデート ## デプロイされたアプリの⼀一覧表示 $ 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
  115. ローリングアップデート ## 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
  116. ローリングアップデート ## サービスを作成 $ 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: <none> Selector: run=kubernetes-bootcamp Type: NodePort IP: 10.107.5.238 Port: <unset> 8080/TCP TargetPort: 8080/TCP NodePort: <unset> 32430/TCP Endpoints: 172.17.0.4:8080,172.17.0.7:8080 Session Affinity: None External Traffic Policy: Cluster Events: <none>
  117. ローリングアップデート ## アプリを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
  118. ローリングアップデート ## 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コンテナ切り替わり 旧アプリの削除
  119. ローリングアップデート ## Serviceの詳細表示 $ kubectl describe services/kubernetes-bootcamp Name: kubernetes-bootcamp Namespace:

    default Labels: run=kubernetes-bootcamp Annotations: <none> Selector: run=kubernetes-bootcamp Type: NodePort IP: 10.107.5.238 Port: <unset> 8080/TCP TargetPort: 8080/TCP NodePort: <unset> 32430/TCP Endpoints: 172.17.0.5:8080,172.17.0.6:8080 Session Affinity: None External Traffic Policy: Cluster Events: <none>
  120. 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になっていることが確認できる
  121. k8sクラスタ外にアプリの公開 ## ローリングアップデートの状態確認 $ kubectl rollout status deployments/kubernetes-bootcamp deployment "kubernetes-bootcamp"

    successfully rolled out # ローリングアップデート成功
  122. ローリングアップデート ## 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になっている
  123. ローリングアップデート ## アプリを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
  124. ローリングアップデート ## ローリングアップデートの中⽌止 $ 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 # ロールバックに成功している
  125. # まとめ

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

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

  128. 今回はここまで

  129. # appendix

  130. 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
  131. Master • kube-apiserver • Kubernetesのリソース情報の管理理を⾏行行う • リソース情報のCRUD処理理担当 • etcdへのアクセスを管理理している •

    複数台建てることが可能な設計 https://kubernetes.io/docs/reference/generated/kube-apiserver/
  132. Master • kube-scheduler • 新しく作られたPodにNodeを割り当てる • Kubernetes API越しにPod, Nodeの
 リソースを監視

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

    Controller • Endpoints Controller • Service Account & Token Controllers https://kubernetes.io/docs/reference/generated/kube-controller-manager/
  134. 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
  135. Node • kubelet • Podの起動・管理理を⾏行行う • Podの情報は以下の⽅方法で受け取る • apiserver •

    ローカルファイル • HTTPエンドポイント • HTTPサーバー https://kubernetes.io/docs/reference/generated/kubelet/
  136. Node • kube-proxy • Serviceが持つClusterIPを転送する • ロードバランスはラウンドロビン https://kubernetes.io/docs/reference/generated/kube-proxy/