for Google Cloud PODE
Anthos Config Management
以下のようなyamlベースのマニュフェストでGoogle Cloudリソースを管理できる。IaC的なイメージ。
従来のTerraformによる環境構築ではHCLでの定義とkubernetes環境のyaml定義が混在し管理が煩雑であったものをどちらもk8sライクなyamlベースで管理できるようにしたもの。(Kubernetes Resource Model (KRM) といわれるらしい。)
また、ポリシーを定義できることでガードレールとしての機能もある。
# test.yaml
# テスト用プロジェクト
apiVersion: resourcemanager.cnrm.cloud.google.com/v1beta1
kind: Project
metadata:
annotations:
cnrm.cloud.google.com/auto-create-network: "false"
name: cc-test-prj
namespace: config-control
spec:
# name (プロジェクト名、ディスプレイ表示) と resourceID (プロジェクトID) は一致させる
name: cc-test-prj
resourceID: cc-test-prj
folderRef:
# フォルダID
external: "1111111111111"
billingAccountRef:
# 請求先アカウントID
external: "222222-222222-222222"
---
# テスト用 Storage バケット
apiVersion: storage.cnrm.cloud.google.com/v1beta1
kind: StorageBucket
metadata:
annotations:
cnrm.cloud.google.com/project-id: cc-test-prj
cnrm.cloud.google.com/state-into-spec: absent
name: cc-test-prj-demo-bucket
namespace: config-control
spec:
storageClass: STANDARD
location: asia-northeast1
uniformBucketLevelAccess: true
---
▲ 以下より転載
以下の3部構成。
- Policy Controller
- セキュリティやコンプライアンスに沿ったポリシーを事前定義する
- ポリシーに合致しないAPIリクエストをブロックできる- Config Sync
- Gitリポジトリに格納されている構成をKubernetesクラスタに継続的に反映、調整する
- 各種Gitプラットフォームのパイプライン機能と組み合わせることで、CI/CDが可能になる- Config Controller
- Google Cloud, Anthosのリソースのプロビジョニングとオーケストレーションを行う
- yaml形式のファイル(kubernetesマニフェスト)によるリソース管理ができる
- 実体はk8sクラスタが構築され、上記のコンポーネントが立ち上がる。
- そのため料金は Anthos Config Managementの費用 と K8sクラスタのノードの費用がかかる。
- このk8sクラスやそのVPCなど幾つかはコンソールやTerraform、gcloudコマンドなりで作成しておく必要あり。
Config Controller
- Config Connector のホスト型バージョン
- 内部的にはConfig Connector と呼ばれる Kubernetes アドオンを利用。
-
公式だと元から
Config Connector
と記載されてる。
- Workload Identityでサービスアカウント連携されてリソースを操作できる。
Config Controller インスタンスを作成する
インスタンスを作成するといってるけど実体はクラスタを起動していてその中でPodを起動してるという意味と解釈。それってインスタンスを起動っていうの?
具体的には Config Connector は CRD と controller を提供してくれます。CRD は Google Cloud のリソースを表現するためのもので、Google Cloud のリソースを作成したい場合はそのリソースに対応する Custom Resource をクラスタに apply します。すると、cnrm-system ネームスペースに存在する controller が先ほど apply した Custom Resource を元に実際のリソースを作成してくれます。
CRDって何? → あまりヒットしない。一旦パス TODO
Config Controller には Policy Controller と Config Sync も含まれています。
公式に謎記述。 → Anthos Config Managementってもう言わない? TODO
Config Sync
- 構成ファイルをGit連携する。
- しない場合はConfig Controllerに直接kubectlする。applyとかdeleteとか、クラスタいじるのと同じ感覚でGoogle Cloud リソースを作成削除できる。
- Config Controller クラスタ(?)は限定公開クラスタとして作成されるのでGitHubなど外部アクセスのためにはCloud NATを作成する必要あり。
Policy Controller
Open Policy Agent (OPA) Gatekeeper ベースのサービス。ポリシーを設定してポリシーに準拠しない変更をもたらす API リクエストをブロック。
- 制約テンプレート(ConstraintTemplate)を定義したyamlを利用。デフォルトで用意もある。
- Rego (Native Query Language)で記述。
- 組織ポリシー(Organization policies)よりも柔軟にポリシーを作成可能。
- 拡張したカスタム制約テンプレートの作成
- 組織ポリシー自体もCOnfig Controllerで管理可能なため誤った無効化などのオペミス防止にも。
今だと組織ポリシーも作成可能じゃなかったっけ? → TODO
Terraformとの違い
- K8sの仕組みにより管理するため、Reconciliation Loopに従いリソースの状態を維持。= ドリフトが起きない。
- Configuration as Data (CaD) vs Infrastructure as Code (IaC) ?
- おそらく、実体であるリソースを削除してもそれを検知して元の状態に戻してくれる仕組みが搭載されてるってことを言いたいものと認識。
参考
- https://blog.g-gen.co.jp/entry/try-gitops-resource-management-with-config-controller
- https://www.creationline.com/tech-blog/61646
- https://zenn.dev/dogggggo/articles/93a764cf08f370
- https://sreake.com/blog/config-connectortest/
- https://lp.cloudplatformonline.com/rs/808-GJW-314/images/App_Modernization_OnAir_q1_0302_Session2.pdf
→ Config Controller
この記述は誤りと予想。
以下参照するに、 Config Controller
=Config Connecter
ではなくこれまで自前構築が必要だったものをマネージドサービス化したものがConfig Controllerということで他2つのコンポーネントも含んだものになると考える。
事例? メルカリ
Cloud Deploy
アプリケーションのデプロイには有用。
K8sクラスタにネットワークポリシーやDeamonSetなどをデプロイするのはCloud Buildの方がいい。
ドリフトの検出をするのもPolicy Controllerの役目。
※ Config Connector はバージョン間でトラフィックを振り分けるみたいなものではない。
メモリ
- ヒープ領域
- 順序なし。メモリの動的確保/解放に利用。
- スタック領域
- LIFO。関数呼び出しやローカル変数の割り当てに利用。
- 静的領域
- sh吉を持つ
- テキスト領域
CloudBuildの実行時間改善
ビルドの速度を上げるには、以前のビルドの結果を再利用します。以前のビルドの結果を Google Cloud Storage バケットにコピーし、その結果から計算を行い、新しい結果をコピーしてバケットに戻すことができます。ビルドに時間がかかるときに、生成されるファイル数が少なく、Google Cloud Storage とのコピーに時間がかからない場合は、この方法を使用します。
CodeBuildの中間生成物をGCSにキャッシュする。
→ GCSへのアップロードが発生するのでその分の時間はかかる。不要なファイルがわかっているならあらかじめ.gcloudignore ファイル
で定義しておくことでアップロード時間を最適化できる。
kanikoキャッシュというGoogleのOSSを利用した高速化手法もある。
Kaniko キャッシュでは、コンテナ イメージのレジストリ(Google 独自の Artifact Registry など)内に中間レイヤが保存され、インデックス付けされます。
Kaniko キャッシュの仕組みは次のとおりです。
Cloud Build では、コンテナ イメージのレイヤがビルド時にレジストリに直接アップロードされるため、明示的な push ステップはありません。すべてのレイヤが正常にビルドされると、それらレイヤを含むイメージ マニフェストがレジストリに書き込まれます。
Kaniko では、各レイヤが、その作成元の Dockerfile ディレクティブと、先行するすべてのディレクティブ(FROM 行のイメージのダイジェストに至るまでのもの)のコンテンツに従ってキャッシュに保存されます。
GCSにキャッシュするのとの違い。
ビルドに --cache-from を常に使用することをおすすめします
Docker ビルド専用の --cache-from とは異なり、Google Cloud Storage のキャッシュは、Cloud Build でサポートされているすべてのビルダーで使用できます。
通常のDockerビルドの場合は Artifact Registry にキャッシュが作られ、--cache-from
で以前のビルドからキャッシュを再利用する。
Dockerビルド以外を利用する場合はこれができないのでGCSにキャッシュを作るということと理解。
Access Context Manager
Access Context Manager は、Google Cloud のプロジェクトとリソースに対する、属性ベースのアクセス制御を定義するものになります。例えばアクセス元のデバイスやOS、IPアドレス、ユーザーIDなどの属性によって制御することが可能です。
Access Context Manager で定義するルールは、「アクセスレベル」と呼ばれ、IAP や IAM Conditions のアクセス許可の条件の1つとしても利用することが可能です。ですが、上述のとおり、アクセスレベルでのデバイス属性の使用 をIAPで利用したり、後述する VPC Service Controls での利用は、BeyondCorp Enterprise の有料機能です。
アクセスレベル
どのような条件でアクセスを許可するかのユーザアクセスのコンテキストを定義する。fromのIPアドレスや国、デバイスなど。
例としてVPC Service Controlsで上向きのポリシー作成時にこれらのアクセス元のコンテキストを指定する。
Cloud Run
ログエージェントなど自由にインストールできない。
Cloud Runのログ取得は自動的に行わることからログフォーマットの変更などはアプリケーション側で必要。
Cloud Build の結果通知
- 公式がある程度サンプル提供してくれてる。
- 欲しい情報に合わせてカスタマイズ。
- ステータス変化をPub/Subにプッシュできるのでそれを利用。
▲ 引用元 : https://kumaaaaa.com/slack-notifications-for-cloud-build/
ブランチ保護ルール
→ GitHubの機能。
mainブランチへの直接pushを禁じたり、マージ前のApprovalやテストを強制することができる
Gitフック : コマンド実行前にスクリプトを挟む
Cloud Functions
- HTTPトリガ
- イベントトリガ
- Pub/Sub トリガ
- GCSトリガ
- google.cloud.storage.object.v1.finalized : オブジェクトの作成/更新の完了
- google.cloud.storage.object.v1.deleted : オブジェクトの削除
- etc.....
- Firestoreトリガ
- google.cloud.firestore.document.v1.created : ドキュメントの作成
- google.cloud.firestore.document.v1.updated : ドキュメントの更新
- etc.....
- Eventarcトリガ
Eventarc
Eventarc は、Google Cloud もしくは外部のイベントソースで発生したイベントを、 Pub/Sub サブスクリプション 経由 で 様々な宛先(イベントコンシューマ)に転送するサービスです。
インフラストラクチャの管理は不要で、Eventarc を介したイベントはすべて CloudEvents 形式 に標準化され、コンシューマに配信されます。
- 第二世代Cloud FunctionsをトリガするGCSの場合 Pub/Subのアクセスが必要になるのは裏でPub/Subが動いてるためと理解。
Cloud Foundation Toolkit & Cloud Foundation Fabric
Cloud Foundation Toolkit(CFT)とCloud Foundation Fabric(CFF)はいずれも、Terraformモジュールを基本的な単位として、個別のソリューション、あるいはベストプラクティス集としてサンプルをまとめたものです。
自分の見解では、
Cloud Foundation ToolkitはTerraform Registryに登録されたGoogle Cloudモジュールを利用した汎用的な構成ソリューションが多い
Cloud Foundation Fabricは専用線を用いた閉域網をオンプレミスとGoogle Cloud間で構成するような、エンプラ向けの大規模開発を行いたい環境向けソリューションが多い
マルチクラウドでのイメージデプロイ
→ Packer
Packer
HashiCorpのOSS。マルチプラットフォーム対応したVMイメージを自動ビルドできるツール。Cloud Buildで利用可能。
VMからLoggingとかのOperations Suiteに送るとかならOpsエージェント入れる。
そうでないコンピュートリソースからOperations Suiteへ出力するなら各種言語向けのクライアントライブラリを入れる。もちろんIAM権限も
例 : PythonからのLogging
ライブラリをインストールする
ポストモーテム
→ 事象発生者が自身でアクションを振り返り、改善点を見つける手法。
→ 障害対応のチームに責任を持たせてはいけない。
Cloud Monitoring
valueType
: DISTRIBUTION → 値の分布を表現
eg.) HTTPレスポンスの待ち時間の分布など
複数プロジェクト(全prod環境とか)のメトリクスを横断して確認する場合
Compute Engine 仮想マシン(VM)インスタンスを含む Staging と Production という名前の 2 つのプロジェクトがあるとします。すべての VM の指標を 1 つのビューで表示するには、別のプロジェクト AllEnvironments を作成し、Staging プロジェクトと Production プロジェクトを AllEnvironments という名前のプロジェクトの指標スコープに追加します。
具体的な指標スコープの構成方法はここ
Metrics Explorer
Google Cloud環境上のメトリクスを視覚的に観察・分析するためのツール
カスタムダッシュボードの見た目部分の定義はjsonで定義されているのでエクスポートし他の人に共有(提供)可能。
これは中のデータを含まない。
Binary Authorization / Container Analysis (Artifact Registory)
Binary Authorization API と Container Analysis API は、オープンソース プロジェクトの Grafeas と Kritis に基づいています。
Grafeas は、コンテナ イメージ、仮想マシン(VM)イメージ、JAR ファイル、スクリプトなどのソフトウェア リソースに関するメタデータを管理するための API 仕様を定義しています。Grafeas を使用すると、プロジェクトのコンポーネントに関する情報を定義したり集約したりできます。
Kritis は、一元的に管理されているポリシーに準拠していないアーティファクト(コンテナ イメージ)のデプロイを防止するための API を定義しています。必要な証明書があるかどうかを確認することもできます。
SLO
評価方法
- ウィンドウベース : 一定期間内に特定の状態にあった時間の割合を測定するためのもの
- リクエストベース : 個々のリクエストの成功または失敗を判定するために使用される評価方法
SLI
SLIはユーザの視点からサービスの可用性を定義するためのもの
Cloud Logging
シンクを作成する際に「このリソースとすべての子リソースによって取り込まれたログを含める」オプションを有効化することで、その組織/フォルダ配下の全てのプロジェクトに対してシンクが有効になり、ログ集約用のプロジェクトにログを収集できます。
2種類あるらしい
- 非インターセプト型集約シンク(non-intercepting aggregated sink)
- インターセプト型集約シンク(intercepting aggregated sink)
前述の通り、組織の上流(組織のルートやフォルダ)で集約シンクを使用すれば、下流の子リソース(プロジェクト等)で発生するログを集約することが可能ですが、非インターセプト型集約シンクの場合は、親リソースの非傍受型集約シンクで収集したログは、子リソースでも収集することができます。一方のインターセプト型集約シンクの場合、上流のシンクで収集したログはそれより下流の子リソースでは収集できません。
インターセプト型シンクを使えば、子リソースでログを重複して収集し、ログ収集コストが肥大化することを避けることができます。逆に、子リソースでもログを自由に収集できるようにしたい場合は、非インターセプト型のシンクを利用します。
なおインターセプト型シンクは子リソース(プロジェクト)からも閲覧できます(コンソールのログルーター画面に表示されます)。
DiskPressure
K8sにおいて、ノードのディスク容量が圧迫されているかの指標。bool値。
Terraform
→ 環境ごとにフォルダ分け。CDKみたいに環境変数で自動的に分かれる構成を望まない。
DevOpsチーム → インフラ管理
開発チーム → コード作成
両チームはインシデント対応だけでなくコードレビューも共有の責任の下実施する。
Cloud Monitoring
→ SLOを定義し監視可能。
→ SLOを達成しない時にリスクが通知され、アラートがトリガされる。
select_slo_burn_rate メトリクス ?
Cloud Run
カナリアリリース
始めに--no-traffic
オプションを付してデプロイすることで、トラフィックを送らずにタグ付きリビジョンを作成することが可能。サービスのurlは発行されるので手動でアクセスすること自体はできるので、手動でUIのテストなどを実施できる。完了次第update-traffic
コマンドでトラフィックを分割しカナリアリリースできる。
VPCフローログ
サンプリングのため全パケットを拾いたいならミラーリング ← これもう古い? TODO
サンプルボリュームスケール
を1にすると完全に拾える。
インシデント状態文書 : インシデント中に更新していくもの。
ポストモーテムは別途作成する。
アクションアイテム : ポストモーテムに基づき作成された改善策のリスト。
各アクションアイテムに1人責任をもつオーナーを立て、必要であれば協力者を当てる。
シャドーテスト
本番トラフィックをミラーリングしてテスト環境に再現し、アップデート前のアプリケーションを評価する手法。通常カナリアリリースなど他の手法と組み合わせて実施。
※ ただしサードパーティシステムへのアクセスはスタブする必要がある。1回のリクエストから本番とシャドウ環境の2つで処理が発生し決済などの冪等性のない重要な処理が重複する恐れがある。
ローリングアップデートはパーティショニングすることで全てのポッドに更新を加えるのではなく、特定の数のポッドまでを更新するように制限できる。
新機能の段階的なロールアウトで有用。 // カナリアリリースと異なる? TODO
Cloud Operation Suite Kubernetes Engine Monitoring
ログ収集、メトリクス収集など。
Prometheus + grafanaでもメトリクスの可視化は可能だが手間がかかる。
Spinnaker
CICDパイプラインのOSS。メトリクス収集やクラウドとの連携も可能
Network Service
- スタンダードティア
- リージョン内or大陸内の通信を最適化する。グローバルならプレミアムティア
- プレミアムティア
- グローバルなアクセスをサポートするサービスに高品質なネットワークを提供するもの。
- ラストワンマイルまでGoogle Cloudで保護
スタンダードに対応していないサービス。いくつか
- Cloud VPN GW
- Cloud CDN
デフォルトではプレミアムが選択されている。
■ プレミアム
■ スタンダード
VPCがリージョナルリソースでない。
Google所有の海底ケーブルが何本もある → 閉域網でリージョンを超えて通信できるからリージョナルで作る必要がない。
イベント管理(SIEM)システム
→ ネットワークの監視、サイバー攻撃やマルウェア感染などのインシデント検知を目的とした仕組みのこと。
Looker Studio (旧Data Studio)
AWS QuickSight相当。
インタラクティブなレポート、リアルタイムな反映が可能。
ログビュー
ログビューを使用すると、ログバケットに保存されているログのサブセットのみに対するアクセス権をユーザーに付与できます。たとえば、一元管理されたプロジェクトに組織のログを保存するシナリオを考えてみます。ログバケットにログを提供するプロジェクトごとに 1 つのログビューを作成できます。その後、各ユーザーに 1 つ以上のログビューへのアクセス権を付与し、ユーザーが表示できるログを制限できます。
Cloud Logging は、すべてのログバケットの _AllLogs ビューと、_Default ログバケットの _Default ビューを自動的に作成します。
_AllLogs ビュー: ログバケット内のすべてのログを表示できます。
_Default ビュー: ログバケット内のデータアクセス以外のすべての監査ログを表示できます。
Cloud Logging によって自動的に作成されたビューは変更できませんが、_AllLogs ビューは削除できます。
CLBのHPA(水平Podオートスケール)構成には以下を指定可能。
- Operation Suiteのカスタムメトリクスアダプタ
- Prometheusのアダプタ
リクエスト数などのメトリクスに基づいてスケーリングする場合にはカスタムアダプタのymlをapplyする。
Web Security Scanner (旧Cloud Security Scanner)
App Engine、GCE、GKE上のWebアプリケーションにおける脆弱性スキャンを実行できる。
Inspector相当?
CI/CDパイプライン上でTerraformで環境構築する場合、tf.stateファイルはGCSに入れるのがベストプラクティス
Artifact Resistory
Container Analysis : 脆弱性スキャンによるコンテナ安全性評価。
OCI(Open Container Initiative)基準に準拠したレジストリであるため、コンテナイメージとHelmチャート両方対応。
Cloud Buildでのシークレット情報の扱い。
- KMSを使って暗号化しCode Buildの構成展開に含める
- Secret Manager
後者の方が一般的なのではと思ったりする。
クォーラム
// 後で読む TODO
Network Connectivity Center
AWS Transit GW相当。
VPC同士をピアリングしていくとメッシュになる。 → 中央に一個ハブを置く。このハブに相当。
Transit GW同様にVPC同士のほか専用線(Dedicated Interconnect)やVPN(Cloud VPN)の終端とも繋がる。
ネットワーク接続の可視化や診断機能もあり。
Code Build
→ プライベートプールを利用することでビルド環境からVPC内のリソースアクセスが可能。
AWS CodeBuild でVPC内にインスタンス立てるようなものと理解。
Opsエージェントにログ解析のスクリプトを実行させることができる? // TODO
tcp_ssl_proxy.xxxx メトリクス → CLB
flex/instance/xxxx メトリクス → App Engine フレックス環境
filter-record-transformer
Fluentdでログのフィルタ、変換。
Cloud Profiler
profilerライブラリで初期化することでその言語のアプリケーションの実行時間とリソース利用情報を収集できる。
Google Cloud Managed Service for Prometheus
- 複数のGKEクラスターから収集したメトリクスを一元的に管理、分析可能。
VPCフローログ
→ IPトラフィックのキャプチャ
IAP
たくさん昨日あるけどいずれもインターネット上からのアクセスを制限するサービス
gcloud auth login
ローカルでgcloudなどのCLIを実行するための認証情報取得
gcloud auth application-default login
各言語のSDKを使ったプログラムを実行する際の認証を得るために使う
→ ユーザアカウントを使ってGoogle Cloudリソースへの認証を行う。
インスタンスのヘルスチェック
→ CLBの機能ではない。
マネージドインスタンスグループの機能。ヘルスチェックによる自動リペア機能を備えている。
バイナリ認証
→ テストが通ったことを秘密鍵を使用して証明書を作る。
この秘密鍵をどこに置くか → KMS。 k8sからはworkload Identityでシームレスに連携
kubectl rollout undo
→ ローリングアップデートを戻す時
Serviceの向き先を以前のDeploymentに戻す → Blue/Greenを戻す時
Workflows
AWS Step Functions相当。
Logシンク → Pub/Subに飛ばせる。
ルーティングは、ほぼリアルタイムで発生します
Loggingのイベントをリアルタイム検出するならPub/Subっぽい。
Terraform
ライフサイクル
- create_before_destroy
- インプレースで更新できない場合にリソースを削除→再作成が通常の流れ。
- trueにすると新リソースを構築後に古いものを削除する。
- prevent_destroy
- trueとした場合、リソース定義が構成ファイルに記載される限り削除できない。
-
terraform destroy
できない。
- ignore_changes
- 通常、実際のリソースの状態とリソース定義に差異があると後者に揃える。
- trueにするとリソースの更新時にはリソース定義は無視され実際のリソースの状態が優先される。