Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

Kubernetes Sapporo for Beginners 自己紹介 松本 宏紀 ( まつもと ひろき ) ● Kubernetes Sapporo for Beginners主催者。 ● システム・アーキテクト。Dev → (松本) → Ops。 ● Java、Cassandra、ElasticSearch、Kafka周りを使うプラットフォーム開発。 ● 社内用Slack Bot開発とかもやる。適当にツール作る。 ● Kubernetesは2017年2月くらいに初めて触った。dockerは昔々・・・。 Twitter:@hirokimatsumo13

Slide 4

Slide 4 text

Kubernetes Sapporo for Beginners 今日のゴール ● 簡単なアプリケーションを、Kubernetesで動かす事ができる ● Pod、Container、そしてワークロードについて理解する ● 上記を深く理解するための方法を理解する。

Slide 5

Slide 5 text

Kubernetes Sapporo for Beginners 今日のゴール つまづきを与えるハンズオン! 苦手意識をなくすハンズオン!

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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 $

Slide 10

Slide 10 text

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の記述がありますが適宜読み替えてください。

Slide 11

Slide 11 text

Kubernetes Sapporo for Beginners アプリケーション動かす! STEP.3 マニフェストファイルに何が書いてあるか見てみましょう! 010-service.yaml 020-deployments.yaml もっと詳しく! もっと詳しく! PersistentVolumeClaim もっと詳しく!

Slide 12

Slide 12 text

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 もっと詳しく!

Slide 13

Slide 13 text

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を別コンテナとして起動してログ情報出力、外部送信。 管理用の裏口用意 ( 動的ロード系の設定等の更新 )

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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: {}

Slide 17

Slide 17 text

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の下記部分をテキストファイルで変更してください。

Slide 18

Slide 18 text

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!" } $

Slide 19

Slide 19 text

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が停止 もっと詳 しく!

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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のパスを変更してみましょう。

Slide 22

Slide 22 text

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 $

Slide 23

Slide 23 text

Kubernetes Sapporo for Beginners アプリケーションを変更する! ● マニフェストファイル変更する →applyでアプリケーションに変更を反映。 maxSurge、maxUnavailableで新しく作る数、古いのを残す数を指定できる。 ● readinessProbe :トラフィックを受け付けれるか監視。 ( 振り分けられなくなる ) ● livenessProbe :死活監視。死んだら再起動させる。 ● とりあえず 困ったら、kubectl getでリソース状態を確認して kubectl describe する。 ※説明してないですが、 node関連だと kubectl get ev使う事もある。

Slide 24

Slide 24 text

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/

Slide 25

Slide 25 text

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 443/TCP 73d $

Slide 26

Slide 26 text

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" } $

Slide 27

Slide 27 text

Kubernetes Sapporo for Beginners StatefulSetsを試してみよう! 先ほど動かしたアプリケーションとほぼ同じ内容です。 010-service.yaml 020-statefulsets.yaml もっと詳しく! もっと詳しく! volumeClaimTemplates:

Slide 28

Slide 28 text

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 $

Slide 29

Slide 29 text

Kubernetes Sapporo for Beginners StatefulSetsを試してみよう! ● 順序付けされたPodを管理 ● バージョンアップは、 1つずつ更新。 ※partitionを使えば、ある番号以降を更新対象として条件付けする事も可能。 ● pod毎に割り当てるPersistent Volumeを管理(Template)する事ができる。 ※もちろん共有用の PVを指定する事も

Slide 30

Slide 30 text

Kubernetes Sapporo for Beginners まとめ ● Kubernetesの公式のドキュメントはしっかりしてる。 ● Podは、複数コンテナのまとまり。ストレージ、ネットワークは共有される。 ※抽象化された1インスタンスの、それぞれのプロセスと考えると …わかりやすいかも。 ● Deploymentsを使えば、アプリケーションの起動、バージョンアップ管理できる。 無停止でバージョンアップが容易に、柔軟にできる。 ● 永続化ボリュームを使いたい場合は・・・ ○ 事前に用意されたVolumeを使いたい: Volume + Deployments。 ○ Podと対になる形で管理したい: Persistent Volume + StatefulSets。 ○ Persistent Volumeは、Privisionerによって生成管理されるけど、内容は Provisioner次第。 ○ Provisionerの選択は、StorageClassを指定する。 ● Deploymentsは、ローリングアップデートを細かく管理、ロールバックが可能。 ● StatefulSetsは、順番にローリングアップデートされる。

Slide 31

Slide 31 text

Kubernetes Sapporo for Beginners 入り口に到達したら・・・ ● Kubernetes完全ガイド 周りの評判が良いです。 (自分もいつか買います。) ● Kubernetesの公式サイト やっぱりここだと思います。 でも、CustomResourceDefine周りは難しい。。。

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

Kubernetes Sapporo for Beginners 補足 ● ぶっちゃけKubernetesきつい? Kubernetesではなく、マイクロサービスがきつい。 組織と体制という手が届きにくい部分が多々ある。それに色々な文化の壁がある。 全拠点で一枚岩のルール、品質保証、リリース、工程毎で人を分けちゃうような組織はほんと【変革】という意識を持たな いと無理。 ※私はインフラエンジニアではないです。システム・アーキテクトよりです。 ● Kubernetesあると幸せになれる? 使おうとした背景次第。 ランニングコストが、数百万/年程度で着地するような企画なら、やめておいた方が良いと思う。 PaaSとか選ぼうよ。

Slide 34

Slide 34 text

Kubernetes Sapporo for Beginners 補足 ● Kubernetesでデータベースを動かすのは現実的なの? 正直わかりません。 個人の所感として1つ言えるのはkernelパラメータを操作できるのは一部でありまだαです。( と思ったらβだった ) よくあるswap無効はGKE環境だとデフォルトで無効なので問題は無いですが…。 私のようにCassandraを主軸としている人は現実的なのかなと思います。 RDBMSなら自分ならマネージド使います。Vitess…? 何より、システムをスケールしたいからKubernetesを使うというよりも、サービス・チームを分断して構築したいから使う… という方が適切なのかと思います。

Slide 35

Slide 35 text

Kubernetes Sapporo for Beginners 補足 ● どのクラウド環境使うべき? ベンダーロックインされないために、私たちは使ってます。 なので、何でも良いと思います。むしろ、それ以外の部分で評価すべきです。 ○ GCP :業務で使ってる ○ AWS :自分自身は、数年前に、1プロジェクトでIaaS+RDS使ったレベル ○ Azure :MSDNサブスクリプションで使えたからちょっと使ったレベル ○ IBM Cloud :同じ部署の人が使って、何かメールが飛んでくるのをスルーしているレベル  ※いつか自分も使いたい ○ その他:色々あるんだなぁーと思ってるレベル このレベルの私だと、GCP、Azureが使いやすいです。直観的に、そして操作する導線が分かりやすい。 コマンドも雰囲気わかりやすい。