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

Kubernetes 入門 #2/kubernetes-hands-on-apps-for-k8ssa

Kubernetes 入門 #2/kubernetes-hands-on-apps-for-k8ssa

Hiroki Matsumoto

November 21, 2018
Tweet

More Decks by Hiroki Matsumoto

Other Decks in Technology

Transcript

  1. Kubernetes Sapporo for Beginners Kubernetes 入門 #2 ~ ハンズオン:アプリケーションを動かすぞ!~

  2. Kubernetes Sapporo for Beginners Kubernetes Sapporo for Beginners 札幌でKubernetesに興味があるけど、学ぶ機会、話し合える機会がない。 無ければつくる!!!!

  3. Kubernetes Sapporo for Beginners 自己紹介 松本 宏紀 ( まつもと ひろき

    ) • Kubernetes Sapporo for Beginners主催者。 • システム・アーキテクト。Dev → (松本) → Ops。 • Java、Cassandra、ElasticSearch、Kafka周りを使うプラットフォーム開発。 • 社内用Slack Bot開発とかもやる。適当にツール作る。 • Kubernetesは2017年2月くらいに初めて触った。dockerは昔々・・・。 Twitter:@hirokimatsumo13
  4. Kubernetes Sapporo for Beginners 今日のゴール • 簡単なアプリケーションを、Kubernetesで動かす事ができる • Pod、Container、そしてワークロードについて理解する •

    上記を深く理解するための方法を理解する。
  5. Kubernetes Sapporo for Beginners 今日のゴール つまづきを与えるハンズオン! 苦手意識をなくすハンズオン!

  6. Kubernetes Sapporo for Beginners 今日のゴール 50分で・・・?

  7. Kubernetes Sapporo for Beginners 事前準備 準備してくれたかな・・・? https://kubernetes-sapporo-for-beginners.github.io/hands-on/Step1-Application Deployment/#事前準備

  8. Kubernetes Sapporo for Beginners ヘルプ! 助けてほしい時は手を挙げてください。 助けに Hirose さんがいきます。 (

    早い者勝ち! )
  9. Kubernetes Sapporo for Beginners アプリケーション動かす! STEP.1 下記コマンドを実行します。 注意事項! コマンドは hands-onリポジトリをcloneした場所をカレントディレクトリとして記載しています。

    kubectl config get-contexts コマンドを実行して、操作対象のクラスタが正しい事を確認しましょう。 $ kubectl apply -f Step1-ApplicationDeployment/deployments service "greet" created persistentvolumeclaim "greet-pv-claim" configured deployment.apps "greet" created $
  10. Kubernetes Sapporo for Beginners アプリケーション動かす! STEP.2 http://localhost:30000/hello にアクセスしてみましょう! 下記のように表示されれば成功です! $

    curl -X GET localhost:30000/hello { "Message": "Hello" } $ クラウド環境を利用している方は、 kubectl get svcを実行して、EXTERNAL-IPに表示されたIPアド レスにアクセスしてください。 ※以降も所々localhostの記述がありますが適宜読み替えてください。
  11. Kubernetes Sapporo for Beginners アプリケーション動かす! STEP.3 マニフェストファイルに何が書いてあるか見てみましょう! 010-service.yaml 020-deployments.yaml もっと詳しく!

    もっと詳しく! PersistentVolumeClaim もっと詳しく!
  12. Kubernetes Sapporo for Beginners アプリケーション動かす! STEP.4 動作状況を監視してみましょう! $ kubectl get

    pod,pv,pvc,service # not kubectl get all $ kubectl describe pod {pod-name} $ kubectl describe deployment greet $ kubectl logs -f --tail=5 {pod-name} -c dummy もっと詳しく!
  13. Kubernetes Sapporo for Beginners アプリケーション動かす! STEP.5 コンテナとストレージの関係性をちょっと見てみましょう。 $ curl -X

    GET “http://localhost:30000/hello?id=matsumoto” $ kubectl exec -it greet-5688c48849-4hkc6 -c greet -- /bin/sh $ kubectl exec -it greet-5688c48849-4hkc6 -c dummy -- ls -l /share/ 同一のpod内では、マウントした Volumeを共有できます。 Ex. ) fluentd、filebeatを別コンテナとして起動してログ情報出力、外部送信。 管理用の裏口用意 ( 動的ロード系の設定等の更新 )
  14. Kubernetes Sapporo for Beginners アプリケーションをスケールアウト! STEP.1 下記コマンドでpodを2つにscaleしてみましょう。 $ kubectl scale

    deployments greet --replicas=2 deployment.extensions "greet" scaled $ お願い! これから行う作業は、 terminalをもう1つ起動しておいてください。そして下記コマンドを実行したままにしてくだ さい。 Watchコマンドが使える環境 :watch -n 1 "kubectl get pod 上記以外の環境 :kubectl get pod -w
  15. Kubernetes Sapporo for Beginners アプリケーションをスケールアウト! 起動できた人、起動できなかった人がいると思います。 複数のpod (node) で、同一 PVをマウントしようとするためです。

    PVを使う場合は、どの Provisionerを使うかを確認しましょう。 • https://kubernetes.io/docs/concepts/storage/storage-classes/#provisioner • https://kubernetes.io/docs/concepts/storage/volumes/#types-of-volumes (これは、ただのVolume。Persistent Volumeではない。 ) 事前準備で、 StroageClass = “Standard”で統一させましたが、 StorageClassのProvisionerは実は環境毎に違います。 AWS: provisioner: kubernetes.io/aws-ebs Azure: provisioner: kubernetes.io/azure-disk GCP: (デフォルト) provisioner: kubernetes.io/gcp-pd Pod name:greet-xxxxx Container Name:greet Port: 8080 Container name: dummy Volume Name: greet-storage Pod name:greet-xxxxx Container Name:greet Port: 8080 Container name: dummy Volume Name: greet-storage
  16. Kubernetes Sapporo for Beginners アプリケーションをスケールアウト! STEP.2 下記のように変更してみましょう。 $ kubectl scale

    deployments greet --replicas=1 deployment.extensions "greet" scaled $ vi Step1-ApplicationDeployment/deployments/020-deployments.yaml $ kubectl scale deployments greet --replicas=2 volumes: - name: greet-storage persistentVolumeClaim: claimName: greet-pv-claim volumes: - name: greet-storage emptyDir: {}
  17. Kubernetes Sapporo for Beginners アプリケーションを変更する! replicas: 1 ↓2に変更 replicas: 2

    image: k8ssa/hands-on-greeting-api:1.0.0 ↓ 1.0.0を1.0.1に変更 image: k8ssa/hands-on-greeting-api:1.0.1 STEP.1 020-deployments.yamlの下記部分をテキストファイルで変更してください。
  18. Kubernetes Sapporo for Beginners アプリケーションを変更する! $ kubectl apply -f Step1-ApplicationDeployment\deployments

    service "greet" unchanged persistentvolumeclaim "greet-pv-claim" unchanged deployment.apps "greet" configured c:\Users\30146.BL\go\hands-on STEP.2 下記のコマンドで反映します。 STEP.3 http://localhost:30000/hello にアクセスしてみましょう! $ curl -X GET localhost:30000/hello { "Message": "Hello world!" } $
  19. Kubernetes Sapporo for Beginners アプリケーションを変更する! STEP.4 kubectl get pod -wでは下記のように表示されたと思います。

    $ kubectl get pod -w NAME READY STATUS RESTARTS AGE greet-568b5ff7f4-hzlkd 2/2 Running 0 39m greet-5688c48849-4hkc6 0/2 Pending 0 0s greet-5688c48849-4hkc6 0/2 Pending 0 0s greet-5688c48849-4hkc6 0/2 ContainerCreating 0 0s greet-5688c48849-4hkc6 1/2 Running 0 9s greet-5688c48849-4hkc6 2/2 Running 0 13s greet-568b5ff7f4-hzlkd 2/2 Terminating 0 40m greet-568b5ff7f4-hzlkd 0/2 Terminating 0 41m greet-568b5ff7f4-hzlkd 0/2 Terminating 0 41m greet-568b5ff7f4-hzlkd 0/2 Terminating 0 41m $ 最初からいたpod 新しいバージョンの podが起動 古いpodが停止 もっと詳 しく!
  20. Kubernetes Sapporo for Beginners アプリケーションを変更する! STEP.5 下記部分を変更して、 applyしてみましょう。 readinessProbe: failureThreshold:

    5 httpGet: path: /health ←ここを path: /read に変えてみる $ kubectl apply -f Step1-ApplicationDeployment/deployments STEP.6 “kubectl get pod -w”では、READYが1/2でとまり、正常に起動しないのが分かります。 greet-d97cdd54c-jhjts 0/2 Pending 0 0s greet-d97cdd54c-jhjts 0/2 Pending 0 0s greet-d97cdd54c-jhjts 0/2 ContainerCreating 0 0s greet-d97cdd54c-jhjts 1/2 Running 0 3s
  21. Kubernetes Sapporo for Beginners アプリケーションを変更する! STEP.7 describeでeventを確認しましょう。 $ kubectl describe

    pod greet-d97cdd54c-jhjts ~省略~ Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning Unhealthy 20s (x120 over 10m) kubelet, docker-for-desktop Readiness probe failed: HTTP probe failed with statuscode: 404 STEP.8 readinessProbeではなく、livenessProbeのパスを変更してみましょう。
  22. Kubernetes Sapporo for Beginners アプリケーションを変更する! STEP.9 “kubectl get pod ”では下記のようにRESTART回数が確認できます

    $ kubectl get pod NAME READY   STATUS RESTARTS AGE greet-66544fbd7f-7vmjz 1/2 Running 6 4m $
  23. Kubernetes Sapporo for Beginners アプリケーションを変更する! • マニフェストファイル変更する →applyでアプリケーションに変更を反映。 maxSurge、maxUnavailableで新しく作る数、古いのを残す数を指定できる。 •

    readinessProbe :トラフィックを受け付けれるか監視。 ( 振り分けられなくなる ) • livenessProbe :死活監視。死んだら再起動させる。 • とりあえず 困ったら、kubectl getでリソース状態を確認して kubectl describe する。 ※説明してないですが、 node関連だと kubectl get ev使う事もある。
  24. Kubernetes Sapporo for Beginners その他:よく使いそうなコマンド等 # 定義情報更新 $ kubectl apply

    -f {manifest.yaml} $ kubectl set xxxxx # 状態監視 $ kubectl rollout status deployment greet # 更新履歴 $ kubectl rollout history deployment greet # ロールバック $ kubectl rollout undo deployment greet $ kubectl rollout history deployment greet --revision=2 全て、下記に記載されてます。 https://kubernetes.io/docs/concepts/workloads/controllers/deployment/
  25. Kubernetes Sapporo for Beginners 一旦お掃除 $ kubectl delete -f Step1-ApplicationDeployment/deployments

    service "greet" deleted persistentvolumeclaim "greet-pv-claim" deleted deployment.apps "greet" deleted $ kubectl get svc,pv,pvc,po,deploy NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 73d $
  26. Kubernetes Sapporo for Beginners StatefulSetsを試してみよう! STEP.1 下記コマンドを実行します。 $ kubectl apply

    -f Step1-ApplicationDeployment/statefulsets service "greet" created statefulset.apps "greet" created # 起動を確認 $ kubectl get pod -w STEP.2 http://localhost:30000/hello?id=dummy にアクセスしてみましょう! $ curl -X GET localhost:30000/hello?id=dummy { "Message": "Hello" } $
  27. Kubernetes Sapporo for Beginners StatefulSetsを試してみよう! 先ほど動かしたアプリケーションとほぼ同じ内容です。 010-service.yaml 020-statefulsets.yaml もっと詳しく! もっと詳しく!

    volumeClaimTemplates:
  28. Kubernetes Sapporo for Beginners StatefulSetsを試してみよう! STEP.3 バージョンアップしてみましょう。 020-statefulsets.yamlを書き換えてください。 image: k8ssa/hands-on-greeting-api:1.0.0

    ↓ 1.0.0を1.0.1に変更 image: k8ssa/hands-on-greeting-api:1.0.1 STEP.4 下記のコマンドで反映します。 $ kubectl apply -f Step1-ApplicationDeployment/statefulsets service "greet" unchanged statefulset.apps "greet" configured $
  29. Kubernetes Sapporo for Beginners StatefulSetsを試してみよう! • 順序付けされたPodを管理 • バージョンアップは、 1つずつ更新。

    ※partitionを使えば、ある番号以降を更新対象として条件付けする事も可能。 • pod毎に割り当てるPersistent Volumeを管理(Template)する事ができる。 ※もちろん共有用の PVを指定する事も
  30. Kubernetes Sapporo for Beginners まとめ • Kubernetesの公式のドキュメントはしっかりしてる。 • Podは、複数コンテナのまとまり。ストレージ、ネットワークは共有される。 ※抽象化された1インスタンスの、それぞれのプロセスと考えると

    …わかりやすいかも。 • Deploymentsを使えば、アプリケーションの起動、バージョンアップ管理できる。 無停止でバージョンアップが容易に、柔軟にできる。 • 永続化ボリュームを使いたい場合は・・・ ◦ 事前に用意されたVolumeを使いたい: Volume + Deployments。 ◦ Podと対になる形で管理したい: Persistent Volume + StatefulSets。 ◦ Persistent Volumeは、Privisionerによって生成管理されるけど、内容は Provisioner次第。 ◦ Provisionerの選択は、StorageClassを指定する。 • Deploymentsは、ローリングアップデートを細かく管理、ロールバックが可能。 • StatefulSetsは、順番にローリングアップデートされる。
  31. Kubernetes Sapporo for Beginners 入り口に到達したら・・・ • Kubernetes完全ガイド 周りの評判が良いです。 (自分もいつか買います。) •

    Kubernetesの公式サイト やっぱりここだと思います。 でも、CustomResourceDefine周りは難しい。。。
  32. Kubernetes Sapporo for Beginners 補足 • hostpathはVolumeなのに、なぜPersistent Volumeとして扱えるの? https://kubernetes.io/docs/tasks/configure-pod-container/configure-persistent-volume-storage/ In

    this exercise, you create a hostPath PersistentVolume. Kubernetes supports hostPath for development and testing on a single-node cluster. A hostPath PersistentVolume uses a file or directory on the Node to emulate network-attached storage. ※ちらみした感じだと、あんまりこの話は本に書いてないです。これのおかげで、Docker for Mac等でもPVCの動きを感じ る事ができます。 • クラウド環境で使うなら何がおすすめ? GCP、Azure、AWSと触りましたが、無料枠があるGCP、もしくは会社でMSDNサブスクリプションをお持ちの方は、Azureがオ ススメです。AWSはハマりました。そして・・・一番試すだけにお金かかりましたorz
  33. Kubernetes Sapporo for Beginners 補足 • ぶっちゃけKubernetesきつい? Kubernetesではなく、マイクロサービスがきつい。 組織と体制という手が届きにくい部分が多々ある。それに色々な文化の壁がある。 全拠点で一枚岩のルール、品質保証、リリース、工程毎で人を分けちゃうような組織はほんと【変革】という意識を持たな

    いと無理。 ※私はインフラエンジニアではないです。システム・アーキテクトよりです。 • Kubernetesあると幸せになれる? 使おうとした背景次第。 ランニングコストが、数百万/年程度で着地するような企画なら、やめておいた方が良いと思う。 PaaSとか選ぼうよ。
  34. Kubernetes Sapporo for Beginners 補足 • Kubernetesでデータベースを動かすのは現実的なの? 正直わかりません。 個人の所感として1つ言えるのはkernelパラメータを操作できるのは一部でありまだαです。( と思ったらβだった

    ) よくあるswap無効はGKE環境だとデフォルトで無効なので問題は無いですが…。 私のようにCassandraを主軸としている人は現実的なのかなと思います。 RDBMSなら自分ならマネージド使います。Vitess…? 何より、システムをスケールしたいからKubernetesを使うというよりも、サービス・チームを分断して構築したいから使う… という方が適切なのかと思います。
  35. Kubernetes Sapporo for Beginners 補足 • どのクラウド環境使うべき? ベンダーロックインされないために、私たちは使ってます。 なので、何でも良いと思います。むしろ、それ以外の部分で評価すべきです。 ◦

    GCP :業務で使ってる ◦ AWS :自分自身は、数年前に、1プロジェクトでIaaS+RDS使ったレベル ◦ Azure :MSDNサブスクリプションで使えたからちょっと使ったレベル ◦ IBM Cloud :同じ部署の人が使って、何かメールが飛んでくるのをスルーしているレベル  ※いつか自分も使いたい ◦ その他:色々あるんだなぁーと思ってるレベル このレベルの私だと、GCP、Azureが使いやすいです。直観的に、そして操作する導線が分かりやすい。 コマンドも雰囲気わかりやすい。