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
180
GitOpsでJobの 実行と管理どうしてます?
dulltz
0
1.1k
ツラくないクラウド運用環境を作る
dulltz
0
1.2k
Other Decks in Programming
See All in Programming
Go言語とトイモデルで学ぶTransformerの気持ち / fukuokago23-transformer
monochromegane
0
140
GitHubCopilotCLIのスラッシュコマンドを自作してみる
htkym
0
100
SREの積み重ねがAI駆動開発のガードレールになった ― 7つの実践/SRE Guardrails The 7
tomoyakitaura
8
5.3k
これからAgentCoreを触る方へトレンドはGatewayです
har1101
6
500
人間の目はかわらない、だからJPEGは30年もつ
yuzneri
1
520
Built Our Own Background Agent at LayerX #aidevex_findy
layerx
PRO
8
3.1k
【SRE NEXT 2026 Lunch Session】一人目専任SREの立ち上げを加速する ― AIと進めたオンボーディングで2分を0.04秒にした話
pkshadeck
PRO
0
3k
AI駆動開発を妨げる技術的負債の解消アプローチ / ai-refactoring-approach
minodriven
17
9.3k
鹿野さんに聞く!『TypeScriptコードレシピ集』で磨く実践力
tonkotsuboy_com
4
1.1k
Laravelで学ぶ Webアプリケーションチューニング入門/web_application_tuning_101
hanhan1978
4
1.3k
【やさしく解説 設計編・中級 #6】良いアーキテクチャとは ~ 一本の登り道の、行き先 ~
panda728
PRO
0
180
1年で人数1.5倍、PR数5.5倍増。 品質とアウトカムはどうなったか、 何が効いたか
ike002jp
0
150
Featured
See All Featured
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
440
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.9k
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
350
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
410
We Have a Design System, Now What?
morganepeng
55
8.2k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.8k
Designing Powerful Visuals for Engaging Learning
tmiket
1
460
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
380
Faster Mobile Websites
deanohume
310
32k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.3k
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.7k
Designing for humans not robots
tammielis
254
26k
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に アクセスしてもらうことで対応