Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Kubernetesに入門したい

Hiroaki ONO
December 17, 2017

 Kubernetesに入門したい

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

Hiroaki ONO

December 17, 2017
Tweet

More Decks by Hiroaki ONO

Other Decks in Technology

Transcript

  1. コンテナ )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. • デプロイ時間が遅い • 無駄なリソースが必要 • スケールしづらい • 複雑な仕組み • 無駄なリソースが必要 • 環境依存問題 • プロセスでのデプロイ • ファイルシステム化 • 少リソースで実⾏行行
  2. Docker Linuxカーネルのコンテナ技術を⽤用いた w w w w w w w w

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

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

    • Mesos+marathon • Mesos上で動く⻑⾧長期実⾏行行⽤用フレームワーク • Kubernetes(k8s) • コンテナに特化したオーケストレーションツール
  5. Service kubelet Docker kube-proxy :80 :8080 :10025 :25 SPMF" SPMF#

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

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

    Docker kubelet kube-proxy SPMF" :8080 :80 :25 :10025 Cluster内からService:Bへアクセス
  10. 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へアクセス
  11. 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へアクセス
  12. 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へアクセス
  13. 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へアクセス
  14. Volume • 外部ストレージをコンテナにマウント • emptyDir Volume • Node上に領域を確保。Podが削除されると廃棄 • hostPath

    Volume • Node上に領域を確保。Nodeが削除されると廃棄 • Persistent Volume • ネットワークストレージ上に領域を確保。
  15. 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
  16. デプロイパターン • Deployment : ⽔水平スケーリングパターン • DaemonSet : 各Node配置パターン •

    StatefuleSet : ステート管理理パターン • Job : タスク実⾏行行⽤用パターン • CronJob : 定期タスク実⾏行行⽤用パターン
  17. ReplicaSet • 複数Podの並列列起動、世代管理理 • Podの管理理 • template : Podの定義 •

    replicas : Podの個数 • リソースが空いてるNodeに配置する
  18. 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
  19. 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
  20. 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
  21. 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
  22. 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
  23. 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
  24. 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
  25. StatefulSet kubelet Docker kube-proxy Docker kubelet kube-proxy StatefulSet name :

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

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

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

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

    並列列実⾏行行ポリシー • Allow : 並列列実⾏行行許可 • Forbid : 現在分が残ってる場合、次回分をスキップ • Replace : 現在分が残ってる場合、新Jobに置き換え
  30. 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
  31. 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
  32. 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
  33. 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.
  34. 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"}
  35. 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が⽴立ち上がった
  36. 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
  37. 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" }
  38. 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アプリが⽴立ち上がった
  39. 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
  40. 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
  41. 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
  42. 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 $ ここからコンテナ内部 ここでコンテナから抜ける
  43. 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が⽴立ち上がった
  44. 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>
  45. 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
  46. 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
  47. 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
  48. 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
  49. k8sクラスタ外にアプリの公開 ## app=v1のPodを表示 $ kubectl get pods -l app=v1 NAME

    READY STATUS RESTARTS AGE kubernetes-bootcamp-6db74b9f76-4t8fc 1/1 Running 0 33m
  50. 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
  51. アプリのスケールアップ ## デプロイされたアプリの⼀一覧表示 $ 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個にスケールアップ
  52. アプリのスケールアップ ## 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
  53. アプリのスケールアップ ## デプロイされたアプリの詳細表示 $ 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
  54. アプリのスケールアップ ## スケールダウン $ 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個にスケールダウン
  55. アプリのスケールアップ ## 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に
  56. アプリのスケールアップ ## 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のみに
  57. ローリングアップデート ## デプロイされたアプリの⼀一覧表示 $ 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
  58. ローリングアップデート ## 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
  59. ローリングアップデート ## サービスを作成 $ 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>
  60. ローリングアップデート ## アプリを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
  61. ローリングアップデート ## 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コンテナ切り替わり 旧アプリの削除
  62. ローリングアップデート ## 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>
  63. 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になっていることが確認できる
  64. ローリングアップデート ## 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になっている
  65. ローリングアップデート ## アプリを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
  66. ローリングアップデート ## ローリングアップデートの中⽌止 $ 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 # ロールバックに成功している
  67. 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
  68. Master • kube-controller-manager • 各種リソースのコントローラを起動する • Node Controller • Replication

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

    ローカルファイル • HTTPエンドポイント • HTTPサーバー https://kubernetes.io/docs/reference/generated/kubelet/