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
dulltz
November 26, 2019
Programming
4.5k
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
190
GitOpsでJobの 実行と管理どうしてます?
dulltz
0
1.1k
ツラくないクラウド運用環境を作る
dulltz
0
1.2k
Other Decks in Programming
See All in Programming
Foundation Models frameworkで画像分析
ryodeveloper
1
610
5分で問診!Composer セキュリティ健康診断
codmoninc
0
1k
AIが無かった頃の素敵な出会いの話
codmoninc
1
430
Go言語とトイモデルで学ぶTransformerの気持ち / fukuokago23-transformer
monochromegane
0
170
【やさしく解説 設計編・中級 #4】ルールの寿命と、システムの年輪
panda728
PRO
2
190
リアルな遅延を測る仕様
kota_yata
1
100
為什麼你並不需要ViewModel / No, you don't need a ViewModel
lovee
1
490
変わらないものが、変わるものを決める — 意図駆動開発 × イベントソーシング × イミュータブル | What Doesn't Change Decides What Can — IDD × Event Sourcing × Immutability
tomohisa
0
1.7k
PHP に部分適用が来るぞ!……ところで何それ?おいしいの? #phpcon / phpcon-2026
shogogg
0
660
生成AIで帳票OCRが「簡単に」作れる時代になった?
kon_shou
0
880
freee が目指す データ マネジメント戦略 AI-Ready 時代を支える 攻めのガバナンスとは
freee
PRO
0
360
TSX の <Hoge<Fuga>> という構文に驚いた話 / tsx-type-argument-syntax
kanaru0928
0
230
Featured
See All Featured
Building the Perfect Custom Keyboard
takai
2
840
Building a Scalable Design System with Sketch
lauravandoore
463
34k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.3k
Paper Plane
katiecoart
PRO
2
53k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
210
How STYLIGHT went responsive
nonsquared
100
6.2k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
430
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
470
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
770
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
410
Code Review Best Practice
trishagee
74
20k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
201
75k
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に アクセスしてもらうことで対応