Share
Embed
Transcript
136 slides
-
kubernetes • オーケストレーションツール • プロビジョニング • オートスケーリング • 死活監視 •
サービスディスカバリ コンテナに特化!! -
コンテナ )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. • デプロイ時間が遅い • 無駄なリソースが必要 • スケールしづらい • 複雑な仕組み • 無駄なリソースが必要 • 環境依存問題 • プロセスでのデプロイ • ファイルシステム化 • 少リソースで実⾏行行 -
コンテナの問題点 • そもそもコンテナってどうやってたてるの? • コンテナをどこのホストにどう配備するの? • 今稼働しているコンテナをどう管理理するの? • コンテナ間の依存関係の解決はどうするの? •
死活監視はどうするの? Docker オーケストレーションツール -
Docker Linuxカーネルのコンテナ技術を⽤用いた w w w w w w w w
w w w w w w w w w w w w アプリケーションを ・開発 ・搬送 ・実⾏行行 するためのプラットフォーム -
Docker • Dockerイメージ • イメージ・レイヤの積み重ね(読み込み専⽤用) • Dockerコンテナ • イメージ・レイヤを 1つのファイルシステムとみなす
• 読み書き可能なイメージ・レイヤを持つ https://docs.docker.com/engine/userguide/storagedriver/ imagesandcontainers/#container-and-layers -
オーケストレーションツール • Docker Swarm • Dockerのネイティブオーケストレーションツール • Nomad • ジョブスケジューリング管理理ツール
• Mesos+marathon • Mesos上で動く⻑⾧長期実⾏行行⽤用フレームワーク • Kubernetes(k8s) • コンテナに特化したオーケストレーションツール -
Node/Cluster • Node:コンテナをデプロイ先VMもしくは物理理サー バ • Cluster:Nodeの集合体 kubelet Docker kube-proxy Node
Cluster kubelet Docker kube-proxy Node -
Node/Cluster Node • コンテナのデプロイ先 VMもしくは物理理サーバ • 元の名前はMinion kubelet Docker kube-proxy
Node Cluster kubelet Docker kube-proxy Node Cluster • Nodeの集合体 -
Pod Pod • デプロイの最⼩小単位 • 1個以上の コンテナの集合体 Pod内部のコンテナ →IPやポートを共有 kubelet
Docker kube-proxy Volume Container Pod Pod Pod -
Label Label • リソースに付与する 任意の⽂文字列列 • {名前:値}のKey-Value • リソースのグルーピングに使⽤用 kubelet
Docker kube-proxy FOWQSP SPMFBQJ FOWQSP SPMF%# -
Service Service • ClusterIP : 複数のPodを紐付ける クラスタ内仮想IP • NodePort :
ClusterIPをNode上の 静的なポートで公開 -
Service kubelet Docker kube-proxy :80 :8080 :10025 :25 SPMF" SPMF#
Service : A • ClusterIP : 8080 • NodePort : 80 Service : B • ClusterIP : 10025 • NodePort : 25 -
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へアクセス -
Service(Cluster内通信) kubelet Docker kube-proxy :80 :8080 :10025 :25 SPMF" SPMF#
Docker kubelet kube-proxy SPMF" :8080 :80 :25 :10025 Cluster内からService:Bへアクセス -
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によって実現) -
Service(Cluster内通信) kubelet Docker kube-proxy :80 :8080 :10025 :25 SPMF" SPMF#
Docker kubelet kube-proxy SPMF" :8080 :80 :25 :10025 Cluster内からService:Bへアクセス -
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へアクセス -
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へアクセス -
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へアクセス -
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へアクセス -
Volume • 外部ストレージをコンテナにマウント • emptyDir Volume • Node上に領域を確保。Podが削除されると廃棄 • hostPath
Volume • Node上に領域を確保。Nodeが削除されると廃棄 • Persistent Volume • ネットワークストレージ上に領域を確保。 -
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 -
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 -
デプロイパターン • Deployment : ⽔水平スケーリングパターン • DaemonSet : 各Node配置パターン •
StatefuleSet : ステート管理理パターン • Job : タスク実⾏行行⽤用パターン • CronJob : 定期タスク実⾏行行⽤用パターン -
ReplicaSet • 複数Podの並列列起動、世代管理理 • Podの管理理 • template : Podの定義 •
replicas : Podの個数 • リソースが空いてるNodeに配置する -
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 -
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 -
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 -
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 -
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 -
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 -
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 -
DaemonSet kubelet Docker kube-proxy Docker kubelet kube-proxy TFSWJDFYYY DaemonSet name
: service1 TFSWJDFZZZ -
StatefulSet kubelet Docker kube-proxy Docker kubelet kube-proxy StatefulSet name :
service1 replica : 3 TFSWJDF -
StatefulSet kubelet Docker kube-proxy Docker kubelet kube-proxy StatefulSet name :
service1 replica : 3 TFSWJDF TFSWJDF -
StatefulSet kubelet Docker kube-proxy Docker kubelet kube-proxy StatefulSet name :
service1 replica : 3 TFSWJDF TFSWJDF TFSWJDF -
Job • Podが正しく起動、終了了、停⽌止まで保証 • parallelism : 同時起動するPodの数 • completions :
Jobを成功とみなすのに 必要なPodの終了了数 • 完了了後も完了了ステータスでリソースは残る -
Job kubelet Docker kube-proxy Docker kubelet kube-proxy Job parallelism :
3 completions : 2 TFSWJDFYYY TFSWJDF[[[ TFSWJDFZZZ -
Job kubelet Docker kube-proxy Docker kubelet kube-proxy Job parallelism :
3 completions : 2 TFSWJDFYYY TFSWJDF[[[ TFSWJDFZZZ ̋ ̋ × Jobから作成されたPodは Jobに結果を通知する -
CronJob • 定期的にJobを実⾏行行 • schedule : crontab同様のスケージュル定義 • concurrencyPolicy :
並列列実⾏行行ポリシー • Allow : 並列列実⾏行行許可 • Forbid : 現在分が残ってる場合、次回分をスキップ • Replace : 現在分が残ってる場合、新Jobに置き換え -
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 -
Version • Docker for Mac : 17.09.1-ce • minikube :
0.24.1 • k8s : 1.8.0 -
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 -
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 -
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 -
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. -
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"} -
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が⽴立ち上がった -
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 -
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" } -
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アプリが⽴立ち上がった -
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 -
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 -
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 -
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 $ ここからコンテナ内部 ここでコンテナから抜ける -
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が⽴立ち上がった -
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> -
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 -
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 -
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 -
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 -
k8sクラスタ外にアプリの公開 ## app=v1のPodを表示 $ kubectl get pods -l app=v1 NAME
READY STATUS RESTARTS AGE kubernetes-bootcamp-6db74b9f76-4t8fc 1/1 Running 0 33m -
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 -
アプリのスケールアップ ## デプロイされたアプリの⼀一覧表示 $ 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個にスケールアップ -
アプリのスケールアップ ## 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 -
アプリのスケールアップ ## デプロイされたアプリの詳細表示 $ 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 -
アプリのスケールアップ ## スケールダウン $ 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個にスケールダウン -
アプリのスケールアップ ## 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に -
アプリのスケールアップ ## 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のみに -
ローリングアップデート ## デプロイされたアプリの⼀一覧表示 $ 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 -
ローリングアップデート ## 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 -
ローリングアップデート ## サービスを作成 $ 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> -
ローリングアップデート ## アプリを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 -
ローリングアップデート ## 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コンテナ切り替わり 旧アプリの削除 -
ローリングアップデート ## 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> -
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になっていることが確認できる -
k8sクラスタ外にアプリの公開 ## ローリングアップデートの状態確認 $ kubectl rollout status deployments/kubernetes-bootcamp deployment "kubernetes-bootcamp"
successfully rolled out # ローリングアップデート成功 -
ローリングアップデート ## 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になっている -
ローリングアップデート ## アプリを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 -
ローリングアップデート ## ローリングアップデートの中⽌止 $ 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 # ロールバックに成功している -
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 -
Master • kube-apiserver • Kubernetesのリソース情報の管理理を⾏行行う • リソース情報のCRUD処理理担当 • etcdへのアクセスを管理理している •
複数台建てることが可能な設計 https://kubernetes.io/docs/reference/generated/kube-apiserver/ -
Master • kube-scheduler • 新しく作られたPodにNodeを割り当てる • Kubernetes API越しにPod, Nodeの リソースを監視
https://kubernetes.io/docs/reference/generated/kube-scheduler/ -
Master • kube-controller-manager • 各種リソースのコントローラを起動する • Node Controller • Replication
Controller • Endpoints Controller • Service Account & Token Controllers https://kubernetes.io/docs/reference/generated/kube-controller-manager/ -
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 -
Node • kubelet • Podの起動・管理理を⾏行行う • Podの情報は以下の⽅方法で受け取る • apiserver •
ローカルファイル • HTTPエンドポイント • HTTPサーバー https://kubernetes.io/docs/reference/generated/kubelet/