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

Kubernetes_Hands-on.pdf

koda
September 07, 2019

 Kubernetes_Hands-on.pdf

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

koda

September 07, 2019
Tweet

More Decks by koda

Other Decks in Technology

Transcript

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

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

    クラウド時代におけるモダンな開発・運用について、ふんわり理解し、 担当する各自が調査&試行できる知識を習得する あぁ、、あれね。 試したことあるよ(ドヤッ)
  3. 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
  4. Kubernetes ✘ k8s = kubernetes ✘ Dockerコンテナをいい感じで運用できるようにしてくれるツール ✘ コンテナのオーケストレーションツール ✘

    日本語読みだと「クーバネティス」と発音することが多い ◦ いろいろな読み方の人がいたけど統一されてきた感じ ✘ Google発で、現在は Cloud Native Computing Foundation(CNCF) 16
  5. 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
  6. k8sの利用の流れ – クラスタ準備 ✘ Kubernetesクラスタを用意する ◦ Masterと1つ以上のNodeで構成する ◦ Docker Desktopだと

    Single-node clusterは自動でセッ トアップ ◦ GoogleのCloudだとGKEでクラスタを用意
  7. Podとは ✘ 複数のコンテナを1つのアトミックな単位にまとめるためのもの ✘ Pod単位に以下がある ◦ 実行環境上で動くコンテナ(複数可能) ◦ 共有ストレージ(ボリューム) ◦

    ネットワーキング(クラスタに固有のIPアドレス) ✘ といっても、1つのPodにいろいろ入れない方がわかりやすいと思 う ✘ 「このコンテナは、それぞれ違うマシンに配置されても正常に動 作するかどうか」と考えてみて ◦ 「動作しない」なら同一Podで良い場合が多い ◦ 「動作する」なら、Podを分ける方が良い場合が多い
  8. k8sの利用の流れ - 負荷に応じてスケールする ✘ kubectlを使い「Deployment」を作る際に、実行するレプリカの 数を指定する(=ActiveなPodの数) ✘ 指定した数のPodが起動している事を保証してくれる ◦ ReplicaSet

    Controllerが処理する ◦ 何らかの原因で停まってしまった場合も、どこかのNodeで規 定数のPodが起動するように自動復旧 ▪ 例えば物理的なNodeがクラッシュしても、別のNodeで起動 して、ネットワーク関連もうまいこと処理してくれる ✘ レプリカの数は変更可能で、トラフィックが増加した際にスケー リングが可能
  9. 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"}
  10. 一般的な操作 ✘ kubectl get - リソースの一覧を表示 ✘ kubectl describe -

    単一リソースに関する詳細情報を表示 ✘ kubectl logs - 単一Pod上の単一コンテナ内のログを表示 ✘ kubectl exec - 単一Pod上の単一コンテナ内でコマンドを実行
  11. 初期状態の確認 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無し)
  12. 使ってみる ✘ 小さい単位を試す(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も用意される
  13. 使ってみる 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
  14. 試してみる ✘ 試しに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 ができて起動している
  15. クリーンアップ 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も消える
  16. 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
  17. 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
  18. クリーンアップ 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
  19. 52 Kubernetes Engine(GKE) ▷ Docker コンテナを実行するための強力なクラスタ管理およびオーケストレー ション システム ▷ Google

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

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

    フィック監視など、より高度な機能が提供されているのが特徴 ▷ Blue/Greenやカナリアで、20%のアクセスをベータバージョンのアプリに割り 当てるといった事が簡単にできる
  22. 57 Blue/Green デプロイ ▷ ブルーグリーンデプロイメントは、既存のシステム(ブルー)を稼働させながら、次のバージョンとなる「新しい システム」(グリーン)を準備して、短時間(もしくは無停止)で切り替える手法 ▷ ビジネスインパクトの大きいシステムは「停止できない」ためにバージョンアップが出来ないというジレンマに 陥り、システムの継続的な改善が困難になり、結果的に製品価値を下げてしまう カナリヤデプロイ

    ▷ プロダクトやサービスの新機能を一部ユーザーのみが利用できるようにリリースし、新機能に問題がないこ とを確認しながら段階的に全体に向けて展開していくデプロイ手法のこと(カナリアリリースとも書かれること も多い) ▷ 本番環境の全体に展開するのではなく、並行して一部ユーザー向けに小規模にリリースし、負荷などの問 題が発生したら現行のバージョンに戻すことができる利点がある(ロールバック可能)
  23. 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を通してインストールできる
  24. 60 Prometheus ▷ モニタリングツール ✔ アラート、デバッグ、トレンド調査など ▷ 動的な環境での監視が得意 ✔ コンテナ、クラウドに最適

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

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