Pro Yearly is on sale from $80 to $50! »

Kubernetes_Hands-on.pdf

2a3710646ca647dccd379703f2713682?s=47 koda
September 07, 2019

 Kubernetes_Hands-on.pdf

K8sハンズオン用コンテンツ https://gdg-shinshu.connpass.com/event/143112/

2a3710646ca647dccd379703f2713682?s=128

koda

September 07, 2019
Tweet

Transcript

  1. Kubernetes Hands-on Koda 2019-09-07 クラウド時代のモダンな開発・運用

  2. hello! • 「Web」とか「Cloud」とか「DevOps」な技術者 • 某メーカーの中でアプリなどを開発中 • チームビルディングも(SCRUM.inc 認定スクラムマスター & IPA

    プロジェクトマネージャー) • プログラミングと温泉、家族を愛するナイス・ガイ • Google系を中心にクラウド系の技術コミュニティに参加 2 KODA (@koda3t)
  3. “ 3 本日のゴール ▷ クラウド時代に必要な技術の説明を聞く ▷ はじめにデモでイメージをつける ▷ ハンズオンでデモと同じ技術を試してみる ▷

    クラウド時代におけるモダンな開発・運用について、ふんわり理解し、 担当する各自が調査&試行できる知識を習得する あぁ、、あれね。 試したことあるよ(ドヤッ)
  4. 4 CloudNative

  5. 5 ✔ ご存知の通り「クラウド」という言葉はあたり前になった ✔ 疎結合された小型で独立したサービスの集合を組み合わせ、ユーザーか らのフィードバックを継続的改善に速やかに取り入れる、クラウドを前 提とした「クラウドネイティブ」という考え方も台頭してきている ✔ キーワードは「アジリティ」と「スケーラビリティ」

  6. “ 6 アジリティ もともと機敏さ、素早さ、敏しょう性といった意味ですが、ビジネス用語としては、目 まぐるしい環境変化に即応するために欠かせない、経営や組織運営のあり方における機 敏性を表します。 スケーラビリティ 利用者や処理負荷の増大に適応できる特性。急なスパイクなどでも、透過的にシステム のリソースが大規模なものへと規模拡張できる能力。

  7. 7 Agenda 1. デモ 2. Kubernetesとは ◦ ミニハンズオン(ローカルで使ってみる) 3. モダンな開発・運用のための周辺技術紹介

    ◦ Skaffold, Istio, Spinnaker, Helm, Prometheus, Grafana 4. ハンズオン 5. まとめ
  8. 8 1. デモ

  9. “ 9 デモ ✔ モダナイズされたアプリケーションの開発、運用

  10. 10 Code Code コードを編集 自動ビルド 自動デプロイ ローカルPC Cloud Source Repositories

    Push(Tag) Cloud Build Container Registry 自動ビルド イメージ登録 動作確認 Skaffold Kubernetes Kubernetes Engine Canary Production Canaryで確認 Productionにデプロイ承認 一般ユーザ アーリーアダプタ トラフィック制御 自動デプロイ モニタリング Istio Prometheus Grafana - 構成 - 動作確認 Spinnaker
  11. 11 2. Kubernetesとは

  12. 12 Docker ▷ コンテナ型の仮想ツール ▷ 「Immutable Infrastructure(※次のページで説明) 」な運用をするために、 デファクトになっている ▷

    開発に使っても超便利 https://speakerdeck.com/koda/docker-hands-on - 前回のハンズオン -
  13. 13 Immutable Infrastructure ▷ 一度Deployをしたインスタンスやコンテナには二度と手を加えず、新 たにDeployを行う場合はインスタンスやコンテナを作り直すという考 え方(環境は使い捨て) ▷ ハイパーバイザ型のVMだと、構築するのが大変(時間がかかる)ので そのVMに対しいろいろ手動でメンテナンスしていき、「秘伝のタレ」

    な運用になってしまい技術的負債に繋がる事が多い ▷ コンテナは常に作り直すので、常にどの環境でも同じように動く
  14. 14 Docker-Compose ▷ 複数のコンテナを組み合わせたアプリケーションを管理するツール

  15. k8s(kubernetes) コンテナ化したアプリケーションのデプロイ、スケーリング などを行うコンテナオーケストレーションツール 15 本日のメイン

  16. Kubernetes ✘ k8s = kubernetes ✘ Dockerコンテナをいい感じで運用できるようにしてくれるツール ✘ コンテナのオーケストレーションツール ✘

    日本語読みだと「クーバネティス」と発音することが多い ◦ いろいろな読み方の人がいたけど統一されてきた感じ ✘ Google発で、現在は Cloud Native Computing Foundation(CNCF) 16
  17. なにがうれしいの? ✘ (オート)スケール ✘ ロードバランス ✘ 自動修復 17 コンテナを「いい感じ」に使える

  18. “ Kubernetesの構成要素 18

  19. Node k8s 構成をざっくりと Master : : Node いい感じに 管理してく れるところ

  20. 構成 • Master ◦ k8sクラスタを管理するマスターサービス ◦ クラスタ内のコンテナを操作・制御する ▪ いい感じにしているナイスなやつ ◦

    Kubectlコマンドを受け付けて処理を行う
  21. 構成 • Node ◦ Dockerコンテナを動作させる ◦ 複数のNodeでK8sクラスタを構成する ◦ Nodeの中にPodというサービスを構成する最小単位のコ ンテナ郡をまとめたものがあって、その単位で動く

    もう少し詳細な構成を見てみる
  22. Node kubelet container-ru ntime Pod Master k8s構成 Client (kubectl) api

    server etcd controller-m anager scheduler Node : : kubelet container-ru ntime Pod k8sへの操作 環境の構成情報を永続化 操作を受付て処理を実行 各種コントローラー PodのNode割当 Podを管理するエージェント Deployment Controller ReplicaSet Controller Pod Pod
  23. 急に複雑になったので、各構成要素の理解を進 めます

  24. k8sの利用の流れ – クラスタ準備 ✘ Kubernetesクラスタを用意する ◦ Masterと1つ以上のNodeで構成する ◦ Docker Desktopだと

    Single-node clusterは自動でセッ トアップ ◦ GoogleのCloudだとGKEでクラスタを用意
  25. k8sの利用の流れ - アプリケーションをデプロイする ✘ kubectlを使い、k8sクラスタにAppをデプロイする ✘ Masterに「Deployment」が作られて、実行するNodeが決まりPod を作って起動するという流れ ◦ Deployment

    Controllerが処理する ◦ コンテナイメージを指定すると、そのコンテナがPodの上で起 動する
  26. Podとは ✘ 複数のコンテナを1つのアトミックな単位にまとめるためのもの ✘ Pod単位に以下がある ◦ 実行環境上で動くコンテナ(複数可能) ◦ 共有ストレージ(ボリューム) ◦

    ネットワーキング(クラスタに固有のIPアドレス) ✘ といっても、1つのPodにいろいろ入れない方がわかりやすいと思 う ✘ 「このコンテナは、それぞれ違うマシンに配置されても正常に動 作するかどうか」と考えてみて ◦ 「動作しない」なら同一Podで良い場合が多い ◦ 「動作する」なら、Podを分ける方が良い場合が多い
  27. 出展: https://kubernetes.io/

  28. k8sの利用の流れ - サービスを外部に公開する ✘ 外部からアクセスできるように、Serviceを定義する ◦ Serviceをセットすることで、外部からアクセスする再のIPア ドレスが生成される ✘ 公開するタイプを「LoadBalancer」にすれば、複数のPodを起動

    してロードバランシングもできる ◦ Podの数/動いているNodeは変化する ◦ IPアドレスは変化していくがうまいこと処理してくれる
  29. 出展: https://kubernetes.io/

  30. k8sの利用の流れ - 負荷に応じてスケールする ✘ kubectlを使い「Deployment」を作る際に、実行するレプリカの 数を指定する(=ActiveなPodの数) ✘ 指定した数のPodが起動している事を保証してくれる ◦ ReplicaSet

    Controllerが処理する ◦ 何らかの原因で停まってしまった場合も、どこかのNodeで規 定数のPodが起動するように自動復旧 ▪ 例えば物理的なNodeがクラッシュしても、別のNodeで起動 して、ネットワーク関連もうまいこと処理してくれる ✘ レプリカの数は変更可能で、トラフィックが増加した際にスケー リングが可能
  31. ミニハンズオン 実際にK8sを試してPodや Serviceがどう動くか理解する

  32. GitLab.comに Sign up

  33. ハンズオン用のプロジェクトをFork https://gitlab.com/koda3t/devops-test

  34. doc/01.use-k8s-on-local.md ハンズオン第一章の動作確認を試してみる

  35. k8s有効化 https://kubernetes.io/ja/docs/setup/minikube/ ★ Docker Desktop(Windows,Mac)なら、GUIでポチッと(超簡単) ★ Linuxだったら、Minikubeが簡単 どちらもシングルノードのk8sクラスタを起動する

  36. kubectlが動くことを確認 k8s:~$ kubectl version Client Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.11", GitCommit:"637c7e288581ee40ab4ca210618a89a555b6e7e9",

    GitTreeState:"clean", BuildDate:"2018-11-26T14:38:32Z", GoVersion:"go1.9.3", Compiler:"gc", Platform:"darwin/amd64"} Server Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.11", GitCommit:"637c7e288581ee40ab4ca210618a89a555b6e7e9", GitTreeState:"clean", BuildDate:"2018-11-26T14:25:46Z", GoVersion:"go1.9.3", Compiler:"gc", Platform:"linux/amd64"}
  37. 一般的な操作 ✘ kubectl get - リソースの一覧を表示 ✘ kubectl describe -

    単一リソースに関する詳細情報を表示 ✘ kubectl logs - 単一Pod上の単一コンテナ内のログを表示 ✘ kubectl exec - 単一Pod上の単一コンテナ内でコマンドを実行
  38. 初期状態の確認 k8s:~$ kubectl get nodes NAME STATUS ROLES AGE VERSION

    docker-for-desktop Ready master 21m v1.10.11 k8s:~$ kubectl get pods No resources found. k8s:~$ kubectl get replicasets No resources found. k8s:~$ kubectl get deployments No resources found. k8s:~$ kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 24m → 何も動いていない(Pod無し)
  39. 使ってみる ✘ 小さい単位を試す(deployment.yml/service.yml無し) k8s:~$ kubectl run nginx --image=nginx deployment.apps "nginx"

    created k8s:~$ kubectl get pods NAME READY STATUS RESTARTS AGE nginx-65899c769f-7hv7g 1/1 Running 0 52s k8s:~$ kubectl get deployments NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE nginx 1 1 1 1 3m k8s:~$ kubectl get replicasets NAME DESIRED CURRENT READY AGE nginx-65899c769f 1 1 1 5m → Nginxが動くPodが作られる。それに合わせて、 replicasetsやdeploymentsも用意される
  40. 使ってみる k8s:~$ kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)

    AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 37m → Serviceを定義してアクセスできるようにしてみる → Nginxが動くPodはServiceの定義が無いのでアクセスできない k8s:~$ kubectl expose deployment nginx --port=8080 --target-port=80 --type=LoadBalancer service "nginx" exposed k8s:~$ kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 41m nginx LoadBalancer 10.102.163.88 localhost 8080:31003/TCP 1m
  41. 使ってみる ✘ アクセスできる

  42. 試してみる ✘ 試しにPodを削除してみる(自動で復旧される) k8s:~$ kubectl get pods NAME READY STATUS

    RESTARTS AGE nginx-65899c769f-7hv7g 1/1 Running 0 16m k8s:~$ kubectl delete pod nginx-65899c769f-7hv7g pod "nginx-65899c769f-7hv7g" deleted koda:~$ kubectl get pods NAME READY STATUS RESTARTS AGE nginx-65899c769f-9hx9x 1/1 Running 0 37s → 新しいPod ができて起動している
  43. 試してみる 不慮の事故でPodが停止してもアプリは自動復旧してアクセスできる

  44. クリーンアップ k8s:~$ kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)

    AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 50m nginx LoadBalancer 10.102.163.88 localhost 8080:31003/TCP 10m k8s:~$ kubectl delete services nginx service "nginx" deleted k8s:~$ kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 51m k8s:~$ kubectl get deployments NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE nginx 1 1 1 1 23m k8s:~$ kubectl delete deployments nginx deployment.extensions "nginx" deleted k8s:~$ kubectl get deployments No resources found. k8s:~$ kubectl get replicasets No resources found. k8s:~$ kubectl get pods No resources found. deploymentsを削除すると、replicasetsやpodsも消える
  45. 設定ファイルを使ったデプロイ ✘ GitHubに公式サンプルがあるので、それをデプロイしてみる ◦ https://github.com/kubernetes/examples/tree/master/guestbook ✘ 実行手順 ◦ https://kubernetes.io/docs/tutorials/stateless-application/guestbook/

  46. 設定ファイルの簡単な説明 ✘ xxxx-deployment.yaml ◦ deploymentを作る設定 ◦ どのコンテナで構成されたPodをいくつ起動するか ✘ xxxx-service.yaml ◦

    serviceを作る設定
  47. k8s:guestbook$ kubectl apply -f redis-master-deployment.yaml deployment.apps "redis-master" created k8s:guestbook$ kubectl

    get pods NAME READY STATUS RESTARTS AGE redis-master-55db5f7567-n5xhx 0/1 ContainerCreating 0 5s k8s:guestbook$ kubectl apply -f redis-master-service.yaml service "redis-master" created k8s:guestbook$ kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 1h redis-master ClusterIP 10.97.14.102 <none> 6379/TCP 10s k8s:guestbook$ kubectl apply -f redis-slave-deployment.yaml deployment.apps "redis-slave" created k8s:guestbook$ kubectl apply -f redis-slave-service.yaml service "redis-slave" created k8s:guestbook$ kubectl apply -f frontend-deployment.yaml deployment.apps "frontend" created k8s:guestbook$ kubectl apply -f frontend-service.yaml service "frontend" created
  48. koda:guestbook$ kubectl get pods NAME READY STATUS RESTARTS AGE frontend-5c548f4769-2gbs5

    1/1 Running 0 1m frontend-5c548f4769-2np2g 1/1 Running 0 1m frontend-5c548f4769-4z9kg 1/1 Running 0 1m redis-master-55db5f7567-n5xhx 1/1 Running 0 11m redis-slave-584c66c5b5-9qz74 1/1 Running 0 2m redis-slave-584c66c5b5-rznxx 1/1 Running 0 2m koda:guestbook$ kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE frontend NodePort 10.97.42.26 <none> 80:31228/TCP 1m kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 1h redis-master ClusterIP 10.97.14.102 <none> 6379/TCP 3m redis-slave ClusterIP 10.111.169.19 <none> 6379/TCP 2m
  49. None
  50. クリーンアップ k8s:guestbook$ kubectl delete deployment frontend deployment.extensions "frontend" deleted k8s:guestbook$

    kubectl delete deployment redis-master deployment.extensions "redis-master" deleted k8s:guestbook$ kubectl delete deployment redis-slave deployment.extensions "redis-slave" deleted k8s:guestbook$ kubectl delete service -l app=redis service "redis-master" deleted service "redis-slave" deleted k8s:guestbook$ kubectl delete service -l app=guestbook service "frontend" deleted k8s:guestbook$ kubectl get pods No resources found. k8s:guestbook$ kubectl get deployments No resources found. k8s:guestbook$ kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 1h
  51. 51 3. モダンな開発・運用のための周辺技術紹介

  52. 52 Kubernetes Engine(GKE) ▷ Docker コンテナを実行するための強力なクラスタ管理およびオーケストレー ション システム ▷ Google

    Container Engine が名前が変わった ◦ Google Container Engine の時も略称は GKE だった ▷ Amazon AWS / Microsoft Azure にも類似の Dockerコンテナをホストするサー ビスがある ◦ ベンダロックインにならないので、積極的に使っていける! ◦ 各ベンダーの共通のプラットフォームがDockerやKubernetesになってき ている ▷ 現状、コンテナ系のサービスでは一番クセが無く「お安い」と思う
  53. 53 Skaffold ▷ k8sを使った環境の開発を便利にするツール ▷ コンテナ化したアプリでは、変更のたびに、ビルドしてimageを作り、deploymentを更 新してデプロイしなければならない ▷ localの開発ではdocker-composeを使うと、VolumeMountできるので、開発中のコードを毎回マウントすれば良いけど K8sだとそうもいかないので自動化する

    ▷ このへんが、開発ではdocker-composeの方が楽では?という気持ちになる原因であるが、、、、 ▷ それでも、本番環境がk8sであれば、ローカルの開発でもk8sを使った方が良い(両方の コンフィグをメンテするのは大変)ので、その場合にSkaffoldで自動化して開発を行う
  54. 54 Istio ▷ サービスメッシュ(※次ページで説明) のツール ▷ Kubernetes同様CNCFが管理 ▷ k8sにもサービスメッシュの基本的な機能があるが、Istioではより高度な ルーティング機能を提供し、さらにクラスタ外からのトラフィックの管理やトラ

    フィック監視など、より高度な機能が提供されているのが特徴 ▷ Blue/Greenやカナリアで、20%のアクセスをベータバージョンのアプリに割り 当てるといった事が簡単にできる
  55. 55 サービスメッシュ ▷ コンテナベースの運用を手に入れた組織では、開発の柔軟性を向上するためマイク ロサービス化(※次ページで説明)が進む ▷ k8sを使った運用の場合、実行するコンテナのIPなどは事前に知ることはできない制 約があり、実行後にネットワーク制御が必要になる ▷ さらに、負荷分散を行うためのロードバランシングや、外部からのリクエストのルー

    ティングといった処理が必要にもなる ▷ その上、Blue/Green デプロイや カナリヤデプロイなどといった形で、高度にマイクロ サービスの通信を制御する必要もでてきている ▷ これらを管理するソフトウェアレイヤーがサービスメッシュと呼ばれる
  56. 56 マイクロサービス・アーキテクチャ ▷ マイクロサービスとは、ソフトウェア開発の技法の1つであり、1つのアプリケーション を、ビジネス機能に沿った複数の小さいサービスの疎に結合された集合体として構 成するサービス指向アーキテクチャである ▷ アプリケーションを異なる小さなサービスに分割することの利点は、モジュラリティが 高くなることであり、これによって、アプリケーションの理解、 開発、テストがより簡単に行えるようになる

    ▷ 疎結合になっているため、各マイクロサービス単位に、柔軟にアプリケーションの構 成変更/リファクタリングが実行できる ▷ マイクロサービスベースのアーキテクチャでは、継続的デリバリーと継続的 デプロイが可能になる
  57. 57 Blue/Green デプロイ ▷ ブルーグリーンデプロイメントは、既存のシステム(ブルー)を稼働させながら、次のバージョンとなる「新しい システム」(グリーン)を準備して、短時間(もしくは無停止)で切り替える手法 ▷ ビジネスインパクトの大きいシステムは「停止できない」ためにバージョンアップが出来ないというジレンマに 陥り、システムの継続的な改善が困難になり、結果的に製品価値を下げてしまう カナリヤデプロイ

    ▷ プロダクトやサービスの新機能を一部ユーザーのみが利用できるようにリリースし、新機能に問題がないこ とを確認しながら段階的に全体に向けて展開していくデプロイ手法のこと(カナリアリリースとも書かれること も多い) ▷ 本番環境の全体に展開するのではなく、並行して一部ユーザー向けに小規模にリリースし、負荷などの問 題が発生したら現行のバージョンに戻すことができる利点がある(ロールバック可能)
  58. 58 Spinnaker ▷ マルチクラウドに対応した継続デリバリのプラットフォーム ▷ Blue/Greenデプロイや、カナリアデプロイにも対応 サービスメッシュ(Istio)は、 Blue/Greenでデプロイされたコンテナへの通信トラフィックを制御 ▷ Spinnakerは、コンテナのデプロイそのもの管理

    ▷ Netflix によってOSS化 ▷ クラウド各社(GCP、Azure)が対応している ▷ 自前でCDを制御する事もできるけど、 Spinnakerに対応しておけば、モビリティが向上する
  59. 59 Helm ▷ The package manager for Kubernetes ▷ k8s用のnpm,

    Maven(Gradle), Gem, apt, brewのようなもの ▷ 1つのアプリケーション(業務システム)としての動作を行う為に必要な Kubernetesの様々な種類のリソース(Deployment, Service, Ingress, Secret, ConfigMap, PersistentVolume, … など) ▷ ひとまとめにして管理する仕組みと、そのためのツールセットを提供する ▷ SpinnakerやIstioもHelmを通してインストールできる
  60. 60 Prometheus ▷ モニタリングツール ✔ アラート、デバッグ、トレンド調査など ▷ 動的な環境での監視が得意 ✔ コンテナ、クラウドに最適

    ✔ Zabbixなんかは、オートスケールなどでインスタンスが増減するような環境は不得意らしい ▷ Istioをセットアップすると自動的についてくる ▷ Cloud Native Computing Foundation(CNCF) 支援の元で開発
  61. 61 Grafana ▷ ログ・データ可視化のためのツール ▷ Prometheusはモニタリングツールとしては優秀だが、可視化の部分は弱い ので、Grafanaを使って可視化する ✔ kibanaのようなもの ✔

    Elasticsearch + kibana という鉄板構成が、ネットワークのモニタリングでは、 Prometheus + Grafanaになる(kibanaはデータソースがElasticsearchのみ)
  62. 62 4. ハンズオン

  63. doc/02.local-development.md ハンズオン第二章 ★ ローカルで開発を効率的に行えるようにSkaffoldを使ってみる ★ スケールアップ・スケールダウン・ローリングアップデートを試してみる ローリングアップデートとは、同じ機能を持った複数のコンピュータで構成している場合のシステムをアップデートする 手法の一つです。 システムの稼動状態を維持しながら、1台ずつ順番にアップデートを行っていきます。

  64. doc/03.signup-to-GCP.md ハンズオン第三章 ★ 3章以降はGCPで実施するのでGCPを使えるようにする

  65. ! 今回のハンズオンはクラウドを 使うので、費用がかかります。 数百円程度です。 費用のかからない、無料枠の小さな クラスタで試したところ、Istioとか Spinnakerとかのデプロイができませんでし た。(リソース不足) このため多少費用がかかってしまいますが、 ちゃんと動かしてみます。

    このハンズオンの資料を作るためにGCPをそれなりに 使っていて来た請求
  66. Google Cloud にサインアップして支払いを有効にする 有効にしないと、GKEが使えないので有効化する(ク レジットカード登録します) 「予算とアラート」を設定しておくと安心

  67. Google Cloud の表示言語を日本語にする

  68. Cloud Shellを有効にする クラウドのシェル環境。ハンズオンの各種コマンドはCloud Shellで実行していきます。

  69. doc/04.deploy-to-GKE.md ハンズオン第四章 ★ GKEにアプリをデプロイしてみる

  70. doc/05.service-mesh-by-Istio.md ハンズオン第五章 ★ Istioを使いトラフィックを制御してみる ★ Prometheus と Grafanaでネットワークをモニタリングする

  71. doc/06.CD-by-Spinnaker.md ハンズオン第六章 ★ Spinnaker を使った継続的デリバリ (CD) ★ CDでデプロイしたカナリア環境でアプリをチェックし本番に反映する流れを試す

  72. 72 5. まとめ

  73. 73 「きこりのジレンマ」 になっていないか確認しよう

  74. 74 同じ1日の作業でも・・・ 12時間/日 6時間/日 余った時間でさらなる効率化

  75. None
  76. None
  77. None
  78. None
  79. None
  80. これまでのハンズオンで青い丸の部分の知識をゲット

  81. None
  82. None
  83. 83 使ってみよう! ✔ 使ってみると、意外と大した事ない 逆に「これがないとつらい」になる(例: Git & GitLab / GitHub)

  84. 84 簡単にするために新しい技術を使う ☞ 新しい技術を試す時間を確保する(リーダ/マネージャ)

  85. Have Fun k8sを使ってみよう! 85

  86. thanks! Any questions? You can find me at @koda3t 86