Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
プライベートクラウドのサービス運用環境をK8sで改善する話
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
dulltz
November 26, 2019
Programming
4.4k
7
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
プライベートクラウドのサービス運用環境をK8sで改善する話
dulltz
November 26, 2019
More Decks by dulltz
See All by dulltz
日本経済新聞社のセキュリティチームが推進するDevSecOps
dulltz
0
170
GitOpsでJobの 実行と管理どうしてます?
dulltz
0
1.1k
ツラくないクラウド運用環境を作る
dulltz
0
1.2k
Other Decks in Programming
See All in Programming
Oxcを導入して開発体験が向上した話
yug1224
4
340
Strategic Design in the Frontend: Moduliths & Micro Frontends @DDDEurope
manfredsteyer
PRO
0
130
Vite+ Unified Toolchain for the Web
naokihaba
0
360
Semantic Version 単位で戦略を柔軟に変えて、パッケージアップデートを自動化する
daitasu
1
310
TSKaigi Night Talks 2026_TypeScriptでサプライチェーンの整合性を型に閉じ込める
geekplus_tech
0
410
[2026年度第1回ORセミナー] 計画最適化ベンチャーと競技プログラミング人材
terryu16
0
280
そのテスト、説明できますか?~LWテスト戦略FW~のご紹介
nakahara
0
170
決定論的オーケストレーションの設計と実装 / Design and Implementation of Deterministic Orchestration
nrslib
4
1.5k
任せる範囲はこう広がった / How the Scope of AI Delegation Has Expanded
nrslib
0
160
代数的データ型って何が嬉しいの? #frontend_phpcon_do
kajitack
8
3.8k
AI駆動開発を妨げる技術的負債の解消アプローチ / ai-refactoring-approach
minodriven
15
7.6k
技術的負債解消で開発者の未来を開く- AIの力でコード刷新
kmd2kmd
0
120
Featured
See All Featured
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.1k
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.6k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
540
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.1k
Marketing to machines
jonoalderson
1
5.5k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
380
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.1k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
470
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.5k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
220
Transcript
プライベートクラウドの サービス運⽤環境を K8sで改善する話 2019/11/26 Bonfire Backend #4
⾃⼰紹介 鶴⽥貴⼤ @dulltz ログ基盤チーム(2017.09‒2017.12) クラウド基盤刷新チーム(2018.01-) 焚き⽕好き
cybozu.comというサービス 提供期間 > 8年 契約社数 > 3万5千
ユーザー数 > 130万
cybozu.comのインフラ
cybozu.com のインフラ ⾃社製プライベートクラウドでサービス運⽤ OpenStack は使っていない ⾃社製プライベートクラウドにガタがきてる
具体的な話は後述
cybozu.com のインフラ刷新 つらいので2018年から刷新中 Necoプロジェクト
インフラ刷新の進捗状況 Done: 本番含め3データセンターでk8sクラスタ稼働中 ⾃作k8s管理ツールCKEがCertifiedに Cybozu Kubernetes Engine -
CNCF Cloud Native Interactive Landscape WIP: Rook/Ceph LVサポートのためにissue/PR出したり WIP: サービス移⾏プロジェクトManeki Cybozuにおける⼤規模インフラ基盤の移⾏プロジェクト Manekiの紹介 - Speaker Deck
刷新プロジェクトの⽬的 運⽤コストの低減 今回はこっちの話 スケーラビリティの向上
運⽤に関する2017年当時の気持ち 運⽤が⼤変 もっと⾃動化したい ⾃作過ぎる もうちょっと標準的なしくみを取り⼊れたい
2017年後半の運⽤ツール コンテナオーケストレーションツールが既に流⾏ K8s Apache Mesos Docker
Swarm
なぜK8sを選択? K8sが圧倒的に流⾏っていた K8s中⼼に発展しているエコシステムが強そう 勝ち⾺に乗ろう
K8s導⼊の動機まとめ 課題 増⼤する運⽤コストをなんとかしたい なぜK8s? コンテナオーケストレーションツールの中で勢いが圧倒的だった
運⽤コスト下がった?
いい話1: OSアップグレード
旧基盤の環境 Ubuntuを使⽤ コンテナほぼ不使⽤ ホストOSの環境がアプリケーションに影響
旧基盤 Ubuntuアップグレード Ubuntu 14.04 から 16.04 へのアップグレード 内蔵ミドルウェアの変更が
サービス運⽤に影響ないかチェックする必要あり Changelogを全部チェック 実機で実験 不具合が現れたら原因調査、改修
ビッグバンリリースすぎた もっと⼿軽にOSアップグレードしていきたい 変更差分を⼩さくしたい
旧基盤のサービス退避 サーバ停⽌にはその上のサービスの退避が伴う ⼈⼒
新基盤ではすべてコンテナで K8sを使う、つまりコンテナによるサービス運⽤にする CoreOS Container Linux 採⽤
CoreOS Container Linux コンテナを動かすための軽量OS 内蔵ミドルウェアが少ない ネットブートにかかる時間が短い
新基盤の継続的インテグレーション OSのブートストラップ、アップグレードを⾃動テスト化 Nested VM上に仮想的なデータセンター環境を構築 VM構築ユーティリティを開発 cybozu-go/placemat
毎⽇CIで試験しておいて、常にOSアップグレード可能な状態に
新基盤のOSアップグレードはこれだけ 1. 対象ノードをdrain 2. サーバーを再起動 3. 対象ノードのuncordon
OSアップグレード楽になった k8sノードはコンテナさえ動けばOKなのでコンテナ⽤軽量OSが 使える。内蔵ミドルウェアが少なくアップグレードも⽐較的楽 Container Linux 最⾼ サービス退避はk8sのスケジューリング機能で楽できる
いい話2: サービスのデプロイ
旧基盤のサービスデプロイ 宣⾔的なオペレーションが書けない スクリプト実⾏の順番を厳密に守る必要がある ⼿順書が⻑く複雑になりがち
旧基盤のサービスデプロイ 継続的デリバリが⼀部しかできていない
旧基盤のサービスデプロイ 開発チームから渡ってきたアーカイブファイルを SREチームがデプロイ 運⽤コストが⼀部のチームに集中しがち
どうしてこうなった 旧基盤は 理想状態への収束を⾏えるようなアーキテクチャになってない マルチテナンシーという概念が薄い 本番デプロイできるようになるにはadmin並の権限が必要
新基盤では宣⾔的なオペレーション K8sのYAML適⽤ ⻑い⼿順書からの脱却 必要に応じてカスタムコントローラも導⼊
新基盤ではサクッと継続的デリバリ GitOps Argo CDを使⽤中 Kustomizeで構成管理 各ツールの使い⽅は他のチームにも布教
新基盤ではどのチームもデプロイできる 各チーム(=テナント)に適切な権限を割り当てることで、 基盤チーム以外でもk8sのリソースを触れるように
テナントの権限 アプリをデプロイできるようにする うっかり他のテナントを邪魔してしまわないようにする
新基盤のマルチテナンシー いわゆるソフトマルチテナンシー 単⼀のk8sクラスタですべてのテナントを賄う RBAC, Admission Controller, NetworkPolicy
などを利⽤ 時間余ったら最後に詳しく話します(資料の最後の⽅参照)
サービスデプロイ良くなった 基盤チーム以外がデプロイできるようになった GitOpsでCDできるようになった マルチテナンシー周りはまだまだ固まっていないので、 これからも改善していく
いい話3: 開発環境
旧基盤の開発環境 本番と同型のクラスタを共同利⽤ うっかり壊すと他の⼈に迷惑かけてしまう
新基盤はk8s 各⼈ごとに⽤意可能なK8sはいろいろある Minikube microk8s Kind
GKE
新基盤の開発環境はKindで ⾃作CSIプラグインなど、⾃社仕様のk8sクラスタで動かすミド ルウェアを動かすようにカスタマイズ
開発環境よくなった 開発環境を松⽵梅で⽤意 Kind環境 ローカルPCで動く Nested VM環境
GCEインスタンスで動く K8sの下回りのミドルウェアやネットワーク構成が本番と同じ 実機環境 どうしても実機が必要なとき使う
いい話4: いろいろ
サービス公開+証明書発⾏を⾃動化 カスタムリソースを1つ作成するだけで AレコードとTLS証明書が⾃動で作成される コンポーネント Contour Cert-manager
External-DNS Contour-plus
処理の流れ Contour⽤カス タムリソースを 作成する • ユーザが作成 Certificateと DNSEndpoint が作成される •
contour-plus TLS証明書と Aレコードが 作成される • cert-manager • external-dns
多機能踏台サーバが使える Teleport K8sへのアクセスを管理できる GitHubを使ったSSOで権限制御ができる ターミナルの⼊出⼒を録画できる
TeleportでKubernetesクラスタへのユーザーアクセスを管理する - Cybozu Inside Out
既存ツールの組み合わせで⾊々できる エコシステムが盛り上がっているツールを選んだメリット 勝ち⾺にのって良かった感
まとめ
運⽤コストは下がった? これまで⾯倒だったことが楽になった OSアップグレード サービスデプロイ 開発環境
その他⾊々 ⾃分たちで全部作らなくても既存ツールの組み合わせで いい感じにできるように ただしk8sの運⽤・アップグレードという新タスクも発⽣
おわり まだまだ模索中 他社の知⾒を教えて下さい
新基盤のマルチテナンシーについて詳細 1クラスタk8sですべてのテナントを賄う Soft multi-tenancy
RBAC テナントのスコープをnamespaceで切る 基盤チームの namespace はテナントからは⾒えない Custer-wide リソースをテナントは作成できない
Admission Controller 認証より後のフェーズで ユーザーからのAPIリクエストを受け⼊れるか制御する機構
今有効にしてるadmission controller https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/#is-there-a-recommended- set-of-admission-controllers-to-use を参考に NamespaceLifecycle LimitRanger
ServiceAccount Priority DefaultTolerationSeconds DefaultStorageClass PersistentVolumeClaimResize MutatingAdmissionWebhook ValidatingAdmissionWebhook ResourceQuota StorageObjectInUseProtection NodeRestriction PodSecurityPolicy
PodSecurityPolicy クラスタ全体でPodのセキュリティ設定を制御するポリシー 特権コンテナの拒否、hostのリソース使⽤の拒否などができる 運⽤⽅針:デフォルトのポリシーでは権限をある程度限定してお き、必要に応じて緩和するよう上書きする PSPは今後GAにならないらしい。そのうち⾒直す必要ありそう
デフォルトのPSP spec: privileged: false allowPrivilegeEscalation: false requiredDropCapabilities: - ALL volumes:
- 'configMap' - 'emptyDir' - 'projected' - 'secret' - 'downwardAPI’ - 'persistentVolumeClaim' hostNetwork: false hostIPC: false hostPID: false runAsUser: rule: 'MustRunAsNonRoot' seLinux: rule: 'RunAsAny' supplementalGroups: rule: 'MustRunAs' ranges: - min: 1 max: 65535 fsGroup: rule: 'MustRunAs' ranges: - min: 1 max: 65535 readOnlyRootFilesystem: true • 以下を不許可 • すべてのCapability • ホストのプロセス/ネットワーク/ファ イルシステムへのアクセス • rootによる実⾏を禁⽌ • ルートファイルシステムは read-only
緩和したPSP spec: privileged: false allowPrivilegeEscalation: false requiredDropCapabilities: - ALL volumes:
- 'configMap' - 'emptyDir' - 'projected' - 'secret' - 'downwardAPI’ - 'persistentVolumeClaim’ hostNetwork: true hostPorts: - max: 7472 min: 7472 hostIPC: false hostPID: false runAsUser: rule: 'MustRunAsNonRoot' seLinux: rule: 'RunAsAny' supplementalGroups: rule: 'MustRunAs' ranges: - min: 1 max: 65535 fsGroup: rule: 'MustRunAs' ranges: - min: 1 max: 65535 readOnlyRootFilesystem: true Metallb(ロードバランサー実装)のPSP • ホストネットワークの使⽤を許可
ResourceQuota, LimitRange ResourceQuota Namespaceごとに使⽤可能なリソース(CPU,RAM)の総量を設定 LimitRange Pod,PVCなどに割り当てるリソースの最⼩値/最⼤値を設定
基盤チームは無制限 テナントにはクラスタを壊さない程度の制限を設定 具体的な数値は相談しながら調整
NetworkPolicy Admission Controllerではない ラベルセレクタが使えるファイヤウォール Calicoの拡張NetworkPolicyを使っている 基盤チームが優先順位の⾼いポリシーを作っておく
基本: GlobalNetworkSetを定義 データセンターで使うサブネットを役割ごとに定義し、ラベル を付与しておく k8sクラスタ内部のサブネット BMCのサブネット
機材のサブネット 踏み台サーバのサブネット
基本: 外部への通信を許可 apiVersion: crd.projectcalico.org/v1 kind: GlobalNetworkPolicy metadata: name: egress-all-allow spec:
order: 10000.0 types: - Egress egress: - action: Allow
基本: 内部への通信を遮断 apiVersion: crd.projectcalico.org/v1 kind: GlobalNetworkPolicy metadata: name: ingress-all-deny spec:
order: 10000.0 types: - Ingress ingress: - action: Deny
クラスタ内からのアクセスを許可 apiVersion: crd.projectcalico.org/v1 kind: GlobalNetworkPolicy metadata: name: ingress-cluster-allow spec: order:
9900.0 types: - Ingress ingress: - action: Allow source: selector: role == 'cluster'
Admission Webhook APIサーバへのリクエストのバリデーション/ミューテーション を⾃作するための機構 Necoではテナントが優先順位の⾼すぎるNetworkPolicyを作れ ないようにしている 以前はGatekeeperとOpenPolicyAgentを使って実装していたが、
それは⽌めてcontroller-runtimeで作り直した
Admission Webhook 例 テナントが優先順位の⾼すぎるNetworkPolicyを作れないよう にする 以前はGatekeeperとOpenPolicyAgentを使って実装していたが、 ⼀旦⽌めてcontroller-runtimeで作り直した
*KubeConNA2019だとGatekeeperすごい流⾏ってました
テナントのやりたいことにAdmin権限が 必要な時はどうする? ケースバイケースで対応中 ミドルウェアレイヤーでなんとかなったりもする
「CRDやオペレーターを追加したい」 基盤チームで管理する テナントには基盤チームの提供する1サービスとして提供 例: Elastic Cloud on
Kubernetes
「ArgoCD使いたい」 ArgoCD⾃体は基盤チームが管理 ArgoCDの参照するGitソースは各テナントが管理 ArgoCD⾃体に独⾃RBAC機能があるので、 テナントのApplicationリソースの同期/閲覧権限だけテナント に渡したり
「基盤チームのPrometheusのデータを 使いたい」 kube-state-metricsなどがテナントから⾒えない 基盤チームのPrometheusのFederation APIに アクセスしてもらうことで対応