$30 off During Our Annual Pro Sale. View Details »

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
    ~ ハンズオン:アプリケーションを動かすぞ!~

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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
    $

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

  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
    $

    View Slide

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

    View Slide

  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/

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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
    $

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide