はてなリモートインターンシップ2023 コンテナオーケストレーション講義資料
by
Hatena
×
Copy
Open
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
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を体験した !"