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

はてなリモートインターンシップ2023 コンテナオーケストレーション講義資料

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for Hatena Hatena
October 18, 2023

はてなリモートインターンシップ2023 コンテナオーケストレーション講義資料

Avatar for Hatena

Hatena

October 18, 2023
Tweet

More Decks by Hatena

Other Decks in Programming

Transcript

  1. Cluster • マスターノードとワーカーノードで構成される • マスターノード • コントロールプレーン • クラスタの管理を担当 •

    パブリッククラウドではマネージドに提供される • ワーカーノード • データプレーン • コンテナを実⾏するためのコンピューティングリ ソースの集まり • 詳細は後述 !"
  2. リソースのカテゴリ • Workloads コンテナの実⾏に関するリソース • Service コンテナを外部公開するようなエンドポイントを提供するリソース • Config&Storage 設定‧機密情報‧永続化ボリュームなどに関するリソース

    • Cluster セキュリティやクォータなどに関するリソース • Metadata クラスタ内の他のリソースを操作するためのリソース Namespaceという仮想的なクラスタの分離機能 !"
  3. Service サービスディスカバリ • 動的にPodが⼊れ替わるクラスター内で情報を 登録、発⾒するための仕組み • クラスタ内DNSの利⽤が推奨されている • ロードバランシングの⼊り⼝となるエンドポイ ントがクラスタ内DNSに⾃動的に登録される

    • accountサービスは account.hatena- intern-2023.svc.cluster.local という 形式でDNS Aレコードに割り当てられる • account(service名).hatena- intern-z{z|(namespace名).svc(リソースの 種類) !"
  4. Ingress • Ingress • L)のロードバランサ • 実装は様々 (AWS ALB, Google

    Cloud GCLB, クラスタ内 Nginx) • Ingressリソースが登録されると実体が構築される • HTTPSの終端 !"
  5. 負荷に対する拡張性 • ⽔平オートスケール • Horizontal Pod Autoscaler (HPA) • CPU等のメトリクスを参照してPodのレプリカを⾃動で追加する

    • 垂直オートスケール • Vertical Pod Autoscaler (VPA) • CPU, メモリの使⽤量を分析してリクエスト値を提案したり⾃動的に更 新したりする !"
  6. マニフェストの構成 k8s ├── account │ ├── app.yaml │ ├── config

    │ │ └── schema.sql │ ├── db.yaml │ ├── kustomization.yaml │ ├── secret │ │ └── ecdsa-private.pem │ └── test.yaml ├── blog │ ├── app.yaml │ ├── config │ │ └── schema.sql │ ├── db.yaml │ ├── kustomization.yaml │ ├── secret │ │ └── account-ecdsa-public.pem │ └── test.yaml ├── kustomization.yaml ├── namespace.yaml ├── renderer-go │ ├── app.yaml │ └── kustomization.yaml └── system └── sa.yaml • k8s ディレクトリがマニフェスト置き場 • account/blog/renderer-goとマイクロサービスごと にディレクトリを分ける • kustomization.yaml がkustomizeの設定ファイル !"
  7. k"s/blog/kustomization.yaml apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: - app.yaml - db.yaml

    - test.yaml secretGenerator: - name: blog-app-secret files: - secret/account-ecdsa-public.pem configMapGenerator: - name: blog-app-env-vars literals: # (snip) - name: blog-db-schema-config files: - config/schema.sql !"
  8. 確認 % make up • 8080番ポートは⾃動でポートフォワードされるようになっていますが、ポートフォワード されていない場合、別のターミナルを開き、以下のコマンドでポートフォワードできま す。 % kubectl

    port-forward service/blog 8080:8080 # ϩʔΧϧͷ8080ϙʔτ΁ ͷ௨৴Λblog service ͔Βෛՙ෼ࢄ͞Ε͍ͯΔpodͷ8080ϙʔτʹసૹ͢Δ Podが起動すると、⾃動でブラウザが開くので開いてブログを作成してみましょう。 開かない場合、vscodeのterminalのPORTSタブから8080ポートを追加してあげてください。 !"
  9. デバッグ # Podͷৄࡉ৘ใͷදࣔɻpod͕ىಈ͠ͳ͍৔߹͸ಛʹ"Events:"ཝʹ஫໨ % kubectl describe pod blog # ωʔϜεϖʔε্ʹ͋ΔϦιʔεͷ৘ใΛදࣔ

    % kubectl get all # ىಈ͍ͯ͠ΔPodͰγΣϧΛىಈ͢Δ % kubectl exec -it svc/account -c account !" /bin/sh • 起動しているプロセスは? ! ps • blogサービスにアクセス ! wget -q -O - blog:8080 • ! nslookup blog !"
  10. マニフェストの追加 % cp -R k8s/renderer-go k8s/renderer-ts % sed -i -e

    's/renderer-go/renderer-ts/g' k8s/renderer-ts/*.yaml • k8s/renderer-go ディレクトリをコピーして k8s/ renderer-ts を作成 • マニフェスト内の renderer-go を renderer-ts に置き換え !!
  11. マニフェストの編集 skaffold.yaml apiVersion: skaffold/v2beta5 kind: Config metadata: name: hatena-intern-2023 build:

    artifacts: # (snip) - image: hatena-intern-2023-renderer-go context: services/renderer-go - image: hatena-intern-2023-renderer-ts # ! context: services/renderer-ts # ! local: # (snip) • services/renderer-ts のdockerイメージのビルドとk2sクラスタへの反映がされるようにする !"
  12. マニフェストの編集 k"s/blog/kustomization.yaml apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization # (snip) configMapGenerator: -

    name: blog-app-env-vars literals: - MODE=development - DATABASE_DSN=root@(blog-db:3306)/intern_2023_blog?time_zone=UTC&parseTime=true&loc=UTC - ACCOUNT_ADDR=account:50051 - RENDERER_ADDR=renderer-ts:50051 # ! - name: blog-test-env-vars # (snip) • blogサービスの記法変換サービスへの向き先をrenderer-goからrenderer-tsに変 える !"
  13. データベースを覗いてみよう おまけコーナー。アプリケーション開発に役に⽴つと思います。 % mysql -u root -h 127.0.0.1 -P 3306

    intern_2023_blog MySQL [intern_2023_blog]> show tables; +----------------------------+ | Tables_in_intern_2023_blog | +----------------------------+ | blogs | | entries | | sessions | | users | +----------------------------+ MySQL [intern_2023_blog]> select count(*) from blogs; +----------+ | count(*) | +----------+ | 0 | +----------+ 接続できない場合、ポートの転送ができていない可能性があります。以下のコマンドでポートフォワードしてください # ϙʔτͷసૹ % kubectl port-forward svc/blog-db 3306:3306 !"