Slide 1

Slide 1 text

© 2024 Wantedly, Inc. ウォンテッドリーのマイクロサービス運用・開発を加速する kube Wantedly Tech Night #8 Feb. 25 2025 - Ken Kato

Slide 2

Slide 2 text

© 2024 Wantedly, Inc. 自己紹介 加藤 健 Infra Squad 2024年1月 中途入社 AWS上のKubernetes、PostgreSQLを運用 X: @kkato25

Slide 3

Slide 3 text

© 2024 Wantedly, Inc. ウォンテッドリーの開発環境 多数のマイクロサービスを全てk8sで管理している

Slide 4

Slide 4 text

© 2024 Wantedly, Inc. kubeの概要 ウォンテッドリーではkubeという CLI ツールを内製している kube = kubectl + 開発用機能 ● kubectlの各種設定隠蔽 ● 開発を効率化するための機能

Slide 5

Slide 5 text

© 2024 Wantedly, Inc. kubeの概要 ウォンテッドリーではkubeという CLI ツールを内製している kube = kubectl + 開発用機能 ● kubectlの各種設定隠蔽 ● 開発を効率化するための機能

Slide 6

Slide 6 text

© 2024 Wantedly, Inc. kubeの設計思想 ウォンテッドリーにおけるPlatform Engineeringを実現するツール ● 開発者体験の向上 ○ 以前ウォンテッドリーはHerokuを使っており、開発者がコマンド一発でデプロイしていた ○ 現在k8s上でもkubeを使うことで、開発者がコマンド一発でデプロイできる体験を提供し ている ● セルフサービス化 ○ インフラがボトルネックにならず、リリースを高速に行えるようにしたい ○ 開発者自身で開発に必要なものを用意できるようにする

Slide 7

Slide 7 text

© 2024 Wantedly, Inc. k8s上で開発・デプロイするための手順 1. GitHubリポジトリを用意する 2. GitHubリポジトリにアプリケーションコードをプッシュする 3. Dockerfileを作成する 4. k8sマニフェストを作成する: kube generate 5. ArgoCDにアプリケーションを登録する 6. コンテナイメージをビルドする: kube ci-build 7. アプリケーションをデプロイする: kube deploy

Slide 8

Slide 8 text

© 2024 Wantedly, Inc. kubeの機能① kube generate k8sマニフェストを自動生成してくれるコマンド ● k8sマニフェストを手動作成する場合、作成に時間がかかる、設定ミスが起こりや すい、フォーマットが統一されていない ● kubeの場合、作成が短時間で完了する、設定ミスが起こりにくい、フォーマットが 統一されている

Slide 9

Slide 9 text

© 2024 Wantedly, Inc. kubeの機能① kube generate % cat kube-generate.yaml generates: - namespace: clusters: - sandbox % kube generate --update Generate manifests by using /Users/kenkato/ghq/github.com/wantedly/test-deploy-app/kube-generate.yaml generated "/Users/kenkato/ghq/github.com/wantedly/test-deploy-app/kubernetes/sandbox/namespace.yaml" % cat kubernetes/sandbox/namespace.yaml --- apiVersion: v1 kind: Namespace metadata: labels: istio-injection: "enabled" name: test-deploy-app

Slide 10

Slide 10 text

© 2024 Wantedly, Inc. kubeの機能② kube ci-build コンテナイメージをビルドし、レジストリにプッシュするためのコマンド GitHub ActionsなどのCI上で実行される ● dockerコマンドの場合、時間がかかる、設定ミスが起こりやすい ● kubeの場合、短時間で設定でき、設定ミスが起こりにくい docker build -t :$GITHUB_SHA . docker tag :$GITHUB_SHA .dkr.ecr.ap-northeast-1.amazonaws.com/:$GITHUB_SHA docker push .dkr.ecr.ap-northeast-1.amazonaws.com/:$GITHUB_SHA kube ci-build

Slide 11

Slide 11 text

© 2024 Wantedly, Inc. kubeの機能③ kube deploy k8sにアプリケーションをデプロイするためのコマンド ● ローカル環境とCI環境で動作する ● kubectl の場合、環境の切り替えが必要、設定ミスが起こりやすい ● kubeの場合、環境の切り替えは不要、手順ミスが起こりにくい kubectl config user-context kubectl set image deployment/ =:$GITHUB_SHA kubectl rollout restart deployment/ kube deploy $GITHUB_SHA

Slide 12

Slide 12 text

© 2024 Wantedly, Inc. kubectlの設定隠蔽 素のkubectlを設定するのは、開発者にとって大変 kubeが各種設定を隠蔽するため、開発者自身で設定する必要はない kube = kubectl + 開発用機能 ● kubectlの各種設定隠蔽 ● 開発を効率化するための機能

Slide 13

Slide 13 text

© 2024 Wantedly, Inc. kubectl の各種設定隠蔽① クラスタの切り替え ウォンテッドリーには、sandbox、qa、prodという3つの環境が存在する ● kubectlの場合、開発者自身でkubeconfigを設定、手動でクラスタを切り替える 必要がある ● kubeの場合、kubeconfigは自動で設定、環境を指定して直接コマンドを実行で きる kubectl config use-context kube get pods kube get pods

Slide 14

Slide 14 text

© 2024 Wantedly, Inc. kubectl の各種設定隠蔽② 認証情報の設定 ウォンテッドリーでは、OIDC認証している ● kubectlの場合、OIDCプロバイダーからトークンを取得し、それをkubeconfigに 設定する必要がある ● kubeの場合、↑を自動で実施しており、手動で設定する必要がない

Slide 15

Slide 15 text

© 2024 Wantedly, Inc. その他機能 kube vault 独自管理しているvaultから秘匿情報を参照、更新、削除するためのコマンド kube argocd-utils ArgoCDを使って、特定のブランチの k8sマニフェストを反映するためのコマ ンド kube lock 特定の開発者以外のデプロイを禁止するためのコマンド kube status ロック状態を確認するためのコマンド kube canary カナリアリリースを実現するためのコマンド (この後の発表で詳細説明 ) kube sh 任意のコンテナイメージの Podをデプロイする kube bash デバッグに役立つコマンドを内包したコンテナイメージの Podをデプロイする kube history デプロイ履歴を確認するためのコマンド kube fork kubeforkを使用するためのコマンド (この後の発表で詳細説明 )

Slide 16

Slide 16 text

© 2024 Wantedly, Inc. kubeの内部構造 kubeはGo (+ Cobra) を使って実装している ● Goを使っている理由 ○ k8sと相性が良い ■ k8sを操作するためのライブラリが充実している ○ ツールとして配布しやすい ■ 環境依存がない ■ マルチプラットフォーム対応 ● 実装上の工夫 ○ 既存のCLIツールを内包している ■ 実装コストを抑えるため、既存ツールの知識を再利用するため、client-go などで再実装するのではなく、kubectlをwrapしている

Slide 17

Slide 17 text

© 2024 Wantedly, Inc. kubeの内部構造 kubeではテストをしやすいように設計している ● DIの利用 ○ Googleが提供しているwireというライブラリを活用している ○ wireが自動で依存関係を構築してくれる ● スナップショットテストの導入 ○ cupaloyというライブラリを活用している ○ cupaloyを使うと簡単にスナップショットテストを導入できる ○ https://speakerdeck.com/izumin5210/techniques-that-support -building-cli-tools-2019-spring

Slide 18

Slide 18 text

© 2024 Wantedly, Inc. まとめ 「kube = kubectl + 開発用機能」これを開発者に配布することで、ウォンテッドリーに おけるプラットフォームエンジニアリングを実現している ● 開発者体験の向上 ○ k8sの細かい設定を意識せず、開発できる ○ kube deployを使えば、Herokuのようにコマンド一発でデプロイ可能 ● セルフサービス化 ○ 開発者がCI/CDを自分で回せる環境を提供 ○ インフラチームに頼らず、開発者自身でk8sマニフェストを用意できる