はてなリモートインターンシップ2023 コンテナオーケストレーション講義資料
by
Hatena
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
ίϯςφΦʔέετϨ ʔγϣϯ #hatenaintern)*)+ !
Slide 2
Slide 2 text
この講義で学んでほしいこと • コンテナオーケストレーションの⽬的と主な機能 • デファクトスタンダードであるKubernetesの特徴と各機能 • インターンの中でKubernetesを使うために最低限の操作⽅法 !
Slide 3
Slide 3 text
コンテナオーケストレーションとは !
Slide 4
Slide 4 text
コンテナ • Docker: Build/Ship/Run • 1プロセス1コンテナ • 1つの⼤きなサービスを実現するために多くのコンテナを⽤ いることも • マイクロサービス • 可⽤性を⾼めるための⽔平スケーリング !
Slide 5
Slide 5 text
コンテナオーケストレーションとは 複数のコンテナを管理し、協調させて動かすためのツール • コンテナ同⼠が通信できるようにする • ⾃動化によりコンテナ管理コストを減らす • ⾼い可⽤性を維持する !
Slide 6
Slide 6 text
コンテナオーケストレーションツールが持つ 主な機能 • コンテナ配置のスケジューリング • 負荷分散/サービスディスカバリー • セルフヒーリング/ヘルスチェック • オートスケーリング !
Slide 7
Slide 7 text
コンテナ配置のスケジューリング • コンテナの実⾏数を指定し、その数だけコンテナを⽴てる • システムの負荷をみて、どのマシンにコンテナを⽴てるかを⾃ 動で選択する !
Slide 8
Slide 8 text
負荷分散/サービスディスカバリー • 複数のコンテナに負荷を分散して可⽤性を⾼める • サービスディスカバリー • 動的にコンテナが⼊れ替わるクラスター内で特定のコンテナ を⾒つけて通信するための仕組み • コンテナは⽣存期間が⽐較的短く、IPアドレスも頻繁に変わ る !
Slide 9
Slide 9 text
セルフヒーリング • マシンに障害が発⽣した場合 • 正常なマシンにコンテナを配置し直す • コンテナに障害が発⽣した場合 • 必要な分だけコンテナを⽴て直す • コンテナ障害を検知するためのヘルスチェック !
Slide 10
Slide 10 text
オートスケーリング これらのスケーリングを、負荷状況に応じて⾃動で⾏う • コンテナのスケールイン‧スケールアウト(コンテナ数の増 減) • コンテナのスケールアップ‧スケールダウン(CPUやメモリの 割り当ての増減) • マシンクラスターのスケールイン‧スケールアウト !"
Slide 11
Slide 11 text
Kubernetesとは !!
Slide 12
Slide 12 text
Kubernetesとは • kubernetes, k,s • Googleの内製コンテナ管理ツールをOSS化したもの • コンテナオーケストレーションツールのデファクトスタンダー ド • パブリッククラウドでプラットフォームが提供されている • AWS EKS, Google Cloud GKE, Azure AKS !"
Slide 13
Slide 13 text
Kubernetesで何ができるのか? コンテナオーケストレーションツールとして持つべき機能を⼀通り兼ね備えている • 宣⾔的な構成管理 • コンテナ配置のスケジューリング • 負荷分散/サービスディスカバリー • セルフヒーリング/ヘルスチェック • オートスケーリング ここからはKubernetesの⾔葉でこれらを説明していく !"
Slide 14
Slide 14 text
宣⾔的な構成管理 Kubernetesは宣⾔的な構成管理を実現している • 期待する状態を設定ファイルに記述する • 設定ファイルを適⽤すると、以前の状態に依存せずに宣⾔した状態 になる • 例)コンテナを常に3つ⽴てたいと記述すると3つ⽴つ。2つに変更 するとどれか1つのコンテナが停⽌する 対照的なのは、現状からの差分を命令として記述する⽅式 !"
Slide 15
Slide 15 text
Kubernetesの構成 !"
Slide 16
Slide 16 text
Cluster • マスターノードとワーカーノードで構成される • マスターノード • コントロールプレーン • クラスタの管理を担当 • パブリッククラウドではマネージドに提供される • ワーカーノード • データプレーン • コンテナを実⾏するためのコンピューティングリ ソースの集まり • 詳細は後述 !"
Slide 17
Slide 17 text
Pod • デプロイの最⼩単位 • Podは1つ以上のコンテナから構成される • メインのアプリケーションコンテナとそれを 補助するサブコンテナから構成される !"
Slide 18
Slide 18 text
サイドカーパターン • podのデザインパターンとして のサイドカーパターン • サブコンテナはメインコンテ ナをサポートするような役割 を担う • (例) Proxy, ログ転送, 監視エ ージェント !"
Slide 19
Slide 19 text
ワーカーノード • 複数のPod(コンテナ)を実⾏するためのコン ピューティングリソース • 物理or仮想のサーバー • kubeletプロセスが起動していてマスターノ ードのAPIとやりとりをする • クラウド環境では台数などを⾃動的に調整す るする仕組みを導⼊している場合が多い !"
Slide 20
Slide 20 text
Kubernetesのリソース !"
Slide 21
Slide 21 text
リソースのカテゴリ • Workloads コンテナの実⾏に関するリソース • Service コンテナを外部公開するようなエンドポイントを提供するリソース • Config&Storage 設定‧機密情報‧永続化ボリュームなどに関するリソース • Cluster セキュリティやクォータなどに関するリソース • Metadata クラスタ内の他のリソースを操作するためのリソース Namespaceという仮想的なクラスタの分離機能 !"
Slide 22
Slide 22 text
Workloadsカテゴリ コンテナの実⾏に関するリソース • Pod 1つ以上のコンテナから構成されている Pod内に含まれるコンテナは同じネットワーク内に存在し同⼀IPを持つ • Replicaset Podのレプリカを作成して指定した数のPodを維持する(セルフヒーリ ング) 同じアプリケーションが動作している複数のPodが展開される !!
Slide 23
Slide 23 text
Workloadsカテゴリ • Deployment 複数のReplicasetを管理してローリングアップデートやロールバックなどを可能にする !"
Slide 24
Slide 24 text
Workloadsカテゴリ 以下、今回のハンズオンでは利⽤なし • Job コンテナを利⽤してワンオフの処理を実⾏させるリソース • CronJob スケジュールされた時間にjobを実⾏するリソース !"
Slide 25
Slide 25 text
Serviceカテゴリ コンテナを外部公開するようなエンドポイントを提供するリソース 受信したトラフィックを複数のPodにロードバランシングする • Service • L)ロードバランサ • サービスディスカバリ • Ingress • L;ロードバランサ !"
Slide 26
Slide 26 text
kubernetesクラスタ内の通信 • 同じPod内のコンテナに通信する場合はlocalhost宛に通信する • 別のPod内のコンテナに通信する場合はPodのIP宛に通信する • podのIP宛の通信は可能だがアプリケーションからIPを指定すると実運 ⽤上で課題が発⽣する • PodのIPはPodが⼊れ替わる度に異なるIPが割り当てられる • Podが停⽌した場合にサービス断が発⽣する • トラフィックが増えてもpodを増やして解決できない !"
Slide 27
Slide 27 text
Service ロードバランサ • 複数のPodに対するトラフィックのロードバランシング(負荷分散)を⾏う • 1回⽬のリクエストはpodJが受け取り2回⽬のリクエストはpodQが受け取り… • これによりpodJつあたりの負荷を分散することができる • ロードバランシングの⼊り⼝となるエンドポイントを提供 • エンドポイントには単⼀の仮想IPが割り当てられる • エンドポイントの種類は⽤途によって様々 • ClusterIP (内部向け) • NodePort (外部向け) • LoadBalancer(外部向け) • etc !"
Slide 28
Slide 28 text
Service サービスディスカバリ • 動的にPodが⼊れ替わるクラスター内で情報を 登録、発⾒するための仕組み • クラスタ内DNSの利⽤が推奨されている • ロードバランシングの⼊り⼝となるエンドポイ ントがクラスタ内DNSに⾃動的に登録される • accountサービスは account.hatena- intern-2023.svc.cluster.local という 形式でDNS Aレコードに割り当てられる • account(service名).hatena- intern-z{z|(namespace名).svc(リソースの 種類) !"
Slide 29
Slide 29 text
Ingress • Ingress • L)のロードバランサ • 実装は様々 (AWS ALB, Google Cloud GCLB, クラスタ内 Nginx) • Ingressリソースが登録されると実体が構築される • HTTPSの終端 !"
Slide 30
Slide 30 text
リソース管理について !"
Slide 31
Slide 31 text
Manifest • リソース定義が書かれたYAML • kubectl apply -f によってk7sクラスタに適 ⽤ • これにより宣⾔的なコードによる管理が可能となる !"
Slide 32
Slide 32 text
リソース制限 • Podに対して割り当てるCPUやメモリの制限を⾏うことができ る • 要求と制限 • 下限と上限を指定できる • ノードにPodを配置する際に考慮される !"
Slide 33
Slide 33 text
ヘルスチェック • Podが正しく動作しているか確認するための仕組み • Liveness Probe • アプリケーションが起動し、コンテナが正しく動作しているかどうか • チェックが通らなかったときはPodを再起動する • Readiness Probe • Podがリクエストを受け付ける準備ができているかどうか • チェックが通ったときにトラフィックを受け⼊れる !!
Slide 34
Slide 34 text
可⽤性と拡張性について !"
Slide 35
Slide 35 text
可⽤性 • セルフヒーリング • Replicasetがコンテナのプロセス監視を⾏ う • チェックに失敗するとManifestで設定した レプリカ数を維持するように働く • Node障害時にもPodを正常なNodeにスケ ジュールし直す !"
Slide 36
Slide 36 text
負荷に対する拡張性 • ⽔平オートスケール • Horizontal Pod Autoscaler (HPA) • CPU等のメトリクスを参照してPodのレプリカを⾃動で追加する • 垂直オートスケール • Vertical Pod Autoscaler (VPA) • CPU, メモリの使⽤量を分析してリクエスト値を提案したり⾃動的に更 新したりする !"
Slide 37
Slide 37 text
ハンズオンで利⽤するツール紹介 !"
Slide 38
Slide 38 text
Minikube • ローカル環境でKubernetesのクラスターを⽴ち上げるのにオス スメ https://minikube.sigs.kHs.io/docs/start/ • Kubernetesのバージョンを指定してクラスターを構築できる • 他にもkindといったツールなどでもローカルでクラスター構築 が可能 !"
Slide 39
Slide 39 text
Kustomize • https://github.com/kubernetes-sigs/kustomize • k6sのマニフェストの構成をカスタマイズするためのツール • Dev, Stg, Prd等の複数の環境分Manifestを書くのは冗⻑なの で、共通のベースとなるマニフェストを作りつつ環境毎の差分 をパッチファイルとして管理できるようになる • kustomization.yaml にどのマニフェストを使うか、secret やconfigの設定などを記述する !"
Slide 40
Slide 40 text
Skaffold • https://skaffold.dev/ • ファイルの変更を検知してコンテナイメージのビルド、kGs環境 へ反映するツール • skaffold.yaml に対象となるファイル、dockerイメージ、 マニフェストを記述する !"
Slide 41
Slide 41 text
Kubernetesハンズオン !"
Slide 42
Slide 42 text
アジェンダ • 第⼀部 Hatena-Intern-./.0環境で遊ぼう • 第⼆部 記法変換サービスの追加 !"
Slide 43
Slide 43 text
第⼀部 Hatena-Intern-)*)+環境で遊ぼう !"
Slide 44
Slide 44 text
この時間はハンズオンです • ⼀緒に⼿を動かして⼿元のKubenetes環境を触ってみましょう • codespaces環境を使います !!
Slide 45
Slide 45 text
サービスの構成 !"
Slide 46
Slide 46 text
マニフェストの構成 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の設定ファイル !"
Slide 47
Slide 47 text
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 !"
Slide 48
Slide 48 text
確認 % make up • 8080番ポートは⾃動でポートフォワードされるようになっていますが、ポートフォワード されていない場合、別のターミナルを開き、以下のコマンドでポートフォワードできま す。 % kubectl port-forward service/blog 8080:8080 # ϩʔΧϧͷ8080ϙʔτ ͷ௨৴Λblog service ͔Βෛՙࢄ͞Ε͍ͯΔpodͷ8080ϙʔτʹసૹ͢Δ Podが起動すると、⾃動でブラウザが開くので開いてブログを作成してみましょう。 開かない場合、vscodeのterminalのPORTSタブから8080ポートを追加してあげてください。 !"
Slide 49
Slide 49 text
サービスが起動していることを確認する contextの切り替え % kubectl config use-context hatena-intern-2023 % kubectl get pods !"
Slide 50
Slide 50 text
Podが起動する様⼦を⾒よう • services/blog/templates/index.html を書き換えて、 変更が反映されることを確認しましょう 別の端末で実⾏してPodの状態を⾒る % kubectl get pods -w % kubectl describe pods !"
Slide 51
Slide 51 text
デバッグ # 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 !"
Slide 52
Slide 52 text
第⼆部 記法変換サービスの追加 !"
Slide 53
Slide 53 text
記法変換サービス renderer • services/renderer-ts にある実装をk*s上で動かす • デフォルトでは services/renderer-go が動いている • k8s/renderer-go を参考に、k8s/renderer-ts を追加 !"
Slide 54
Slide 54 text
マニフェスト • 追加するマニフェスト • k8s/renderer-ts/kustomization.yaml • k8s/renderer-ts/app.yaml • 編集するマニフェスト • skaffold.yaml • k8s/kustomization.yaml • k8s/blog/kustomization.yaml !"
Slide 55
Slide 55 text
マニフェストの追加 % 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 に置き換え !!
Slide 56
Slide 56 text
マニフェストの編集 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クラスタへの反映がされるようにする !"
Slide 57
Slide 57 text
マニフェストの編集 k"s/kustomization.yaml apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization namespace: hatena-intern-2023 resources: - namespace.yaml - account - blog - renderer-go - renderer-ts # ! !"
Slide 58
Slide 58 text
マニフェストの編集 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に変 える !"
Slide 59
Slide 59 text
Podが正常に起動しない場合 • kubectl get pods を実⾏して各Podが正しく起動している かどうか確認する • kubectl describe pod renderer-ts で詳細情報を確認 • なぜ正常に起動しないか原因を探ろう !"
Slide 60
Slide 60 text
実際にrenderer-tsが動くことを確認する • kubectl get pods よりすべてのPodが正常に起動しているこ とを確認 • ブログにアクセスし、記事を作成し renderer-ts サービスが 動くことを確認 !"
Slide 61
Slide 61 text
変更点をpushしておく ここらへんはご⾃由にという感じですが、今回の変更点をコミットしてpushしておき、 いつでもtypescript実装に変更可能にしておくと今後のインターンに便利だと思います。 私はuse-renderer-ts-arthur-cっていうブランチでpushしておくので、もし今回のハン ズオンで⼿元でうまく動かなかった⼈がいても、このブランチを参考にすることで今後 のインターンでts使いたくなった時にrenderer-ts化できると思います。 % git switch -c use-renderer-ts-arthur-1 % git add k8s/ skaffold.yaml % git commit -m'rendererΛtypescript࣮ʹมߋ' % git push origin use-renderer-ts-arthur-1 !"
Slide 62
Slide 62 text
データベースを覗いてみよう おまけコーナー。アプリケーション開発に役に⽴つと思います。 % 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 !"
Slide 63
Slide 63 text
まとめ • コンテナオーケストレーションの⽬的と主な機能を紹介した • デファクトスタンダードであるKubernetesの概観と基本的な機 能を紹介した • ハンズオンを通して、Kubernetesを体験した !"