/// BANGBOO BLOG ///
■24/5/9 12:00AM
Pubsub
■pubsubPublisher app → |GCPの壁| Topic(Schema) → Subscription 1や2 |GCPの壁| → Subscriber app
 サブスクライバーappにPull/PushさせるPull/Pushのサブスクリプションをトピックに紐づける設定をしておく
[Click for image]
【図解付き】Cloud Pub/Subに概要や使い方についてわかりやすく解説 - KIYONO Engineer Blog (kiyono-co.jp)Pub/Sub サービスの概要  |  Pub/Sub ドキュメント  |  Google CloudGCPのCloud PubSubで考慮すること - Carpe Diem (hatenablog.com)Pub/Sub の割り当てと上限  |  Pub/Sub ドキュメント  |  Google Cloudアプリで簡単にPubsubにパブリッシュや、サブスクもできるので、アプリ間の連携にPubsubが使える • 非同期処理(画像処理とか重めのもの • IDの種類 (message id, subscription id, topic id, ack id, project idあたりがアプリでは使われるっぽい  ※ack idはpull時のみでPushのときはhttpステータスコードが200でackとなるGCP - Pub/Sub サービス概要 #GoogleCloud - QiitaPub/Sub メッセージの作成とレスポンス  |  Python 用 App Engine フレキシブル環境に関するドキュメント  |  Google Cloudトピック(メッセージのパブリッシュ先)
 • スキーマ/外部アクセス許可/リテンション/GCS/バックアップの設定がある (Push/Pullの設定はない) • パブリッシュ側のベストプラクティス (JWT)   Pub/Sub トピックにパブリッシュするためのベスト プラクティス  |  Pub/Sub ドキュメント  |  Google CloudサブスクライバのPushとPull (PushはEndpointが必要、デフォルトはpull) GCP - Pub/Sub サービス概要 #GoogleCloud - Qiita • at-least-once (少なくとも1回) 配信を提供します • 同じ順序指定キーを持ち、同じリージョンに存在している場合は、メッセージの順序指定を有効にできます • サブスクライバーが31日間未使用、またはサブスクリプションが未更新の場合、サブスクリプションは期限切れ • メッセージ数が多いとpull向き サブスクリプション タイプを選択する  |  Pub/Sub ドキュメント  |  Google Cloudpushはhttpsが必要? push サブスクリプションを作成する  |  Pub/Sub ドキュメント  |  Google Cloud • push エンドポイントのサーバーには、認証局が署名した有効な SSL証明書が必要でhttps • Cloud run でEvent Arcを設定するとサブスクが自動作成されrunのデフォルトhttpsのURLが使われるが、これはPullよりPushで安定した • CronバッチならPullで安定するのでは?大量リクエストはPull向きとある(Pullは失敗処理込みの話かも知れん)トピックのリテンション:デフォルトなし、最小値:10分、最大値:31日サブスクのリテンション:デフォルト値:7日、最小值:10分、最大値:7日 サブスクリプション プロパティ  |  Pub/Sub ドキュメント  |  Google Cloudpubsub ack期限(Ack Deadline)
 •デフォルト60秒> 設定10分>ack延長で最大1時間まで伸ばせると思われる リース管理で確認時間を延長する  |  Pub/Sub ドキュメント  |  Google Cloud •exactly onceを設定しなければ期限の延長は保証されない •ack期限を過ぎる、あるいはNackを返す場合、メッセージは再配送される •ack応答期限の延長は99パーセンタイル(上位1%の値よりも小さい値のうち最大の値)で modifyAckDeadlineを返し、延長してもMaxExtension (ack期限を延長 する最大値) 60minまで?
  modifyAckDeadlineリクエストを定期的に発行すればよいらしいメッセージの再試行を強制するには
 •nack リクエストを送信 •高レベルのクライアント ライブラリを使用していない場合は、ackDeadlineSeconds を0に設定して modifyAckDeadline リクエストを送信するexactly once
1 回限りの配信  |  Pub/Sub ドキュメント  |  Google Cloud •pullなら設定できる。他には、Cloud Dataflowを組み合わせる(プログラムコードでDataflowを使う感じかり、あるいはmessageについているunique idを利用して、KVS を用いたステート管理をして自前で重複を排除する •再配信は、メッセージに対してクライアントによる否定確認応答が行われた場合、または確認応答期限が切れる前にクライアントが確認応答期限を延長しな かった場合のいずれかか原因で発生することがある。  ※exactly onceはエラーでも再配信でPubsubパニックしないようにしたいために使うものではない?pubsubはトピックにPublishされたメッセージをDataflowに引き継げる
 Dataflow (Apache Beam) を大量のメッセージをバッチ処理する場合に使える  Pub/Sub→Dataflow→処理 •Apache Beamのウィンドウ処理とセッション分析とコネクタのエコシスエムがある •メッセージ重複の削除ができる •pubsub>dataflow>BQやGCS: この流れでログ等をストーリミングで入れ込めるBQサブスクリプション (PubSubはBigQuery Storage Write API を使用してデータを BigQueryテーブルに送信、GCSサブスクもある) Langganan BigQuery  |  Dokumentasi Pub/Sub  |  Google Cloud BigQuery サブスクリプションの作成  |  Pub/Sub ドキュメント  |  Google CloudサブスクライバーApp側のコードでのフロー制御によりちょっと待てよのトラフィック急増対応 フロー制御を使用して一時的な急増を処理する  |  Pub/Sub ドキュメント  |  Google Cloudデッドレタートピック (配信試行回数が見れる)やエラーでの再配信 メッセージ エラーの処理  |  Pub/Sub ドキュメント  |  Google Cloud  • Pub/Subサブスクリプションにデッドレタートピックを設定しておくと、一定の回数再送信が失敗したメッセージの宛先がデッドレタートピックに変更され貯められるメッセージのフィルタ、同時実行制御により多いメッセージに対応 サブスクリプションからのメッセージをフィルタする  |  Pub/Sub ドキュメント  |  Google CloudPubsubをローカルでエミュレートする エミュレータを使用したローカルでのアプリのテスト  |  Pub/Sub ドキュメント  |  Google Cloudpubsubのスナップショットやリテンションクイックスタート: スナップショットまたはタイムスタンプまでシークして Pub/Sub でメッセージを再生する  |  Pub/Sub ドキュメント  |  Google Cloudトピックにリテンションを設定しスナップショット作成> 過去のサブスクしたメッセは見えなさそうサブスクにリテンションを設定しスナップショット作成> 過去のAckしたメッセは見えなさそうスナップショットでどう使うのか? cloud pubsubで配信済みのメッセージを再送する #PubSub - Qiita キューがたまっているときに撮るものと思われる。またシーク時間のポイントを設定する意味がある スナップショットとシークを使いこなして特定期間の再実行を行う機能  スナップショットで再実行する  シークは指定時間か最後のスナップショット以降のサブスク再実行(実際pushでrunが再実行された)Pubsubにどんなメッセージが入ってきているか確認する方法 pull形式ならAckしなければpullボタンで拾い見れる (トピックでパブリッシュしてサブスクでPull し見る) トラブルシュートはログを見るかデッドレタートピックかGCSバックアップを見る?デッドレターキュー(ドロップしたものの確認と救済?) サブスクでDLQのONしデッドレタートピックを設定し転送する>GCSにもバックアップできる DLTでメッセージ(実行済みOR未実行)の再生データ形式:スキーマを使うか、スキーマなしならdataで取得できる トピックのスキーマを作成する  |  Pub/Sub ドキュメント  |  Google Cloud Cloud Pub/Subの概要とPythonでの実践 - case-kの備忘録from google cloud import pubsub_v1from avro.io import DatumReader, BinaryDecoderfrom avro schema import Parseproject_id="your-project-id"subscription id="your-subscription-id"subscriber pubsub_v1.SubscriberClient()subscription_path = subscriber.subscription_path(project_id, subscription_id)avro_schema = Parse("""{"type": "record","name": "Avro"."fields": [{"name": "ProductName","type": "string","default":""},{"name": "SKU","type": "int","default": 0}}def callback(message): print(f"Received message: {message}") reader = DatumReader(avro_schema) decoder = Binary Decoder (message.data) avro_record = reader.read(decoder) message_id=message.message id message.ack() print("Message ID: (message_id}") product_name = avro_record['ProductName'] sku= avro_record['SKU'] print("Product Name: (product_name}") print("SKU: (sku}")subscriber.subscribe(subscription_path, callback=callback)
def callback(message): print("Received message: (message)") data message data message_id=message.message_id message.ack() print("Date (data)") print("Message ID: (message_id)")
Pub/SubでStreamingPull APIを使用してメッセージをリアルタイムで処理する - G-gen Tech Blog
StreamingPull API を使用するとアプリとの間で永続的な双方向接続が維持され、Pub/Sub でメッセージが利用可能になるとすぐに pullされる。1 つの pull リクエストで 1 つの pull レスポンスが返る通常の 単項 Pull と比較すると、高スループット・低レイテンシ。必要なメッセージを残す処理をしたりも?GCP側の問題であっても通信が切れた場合は別サーバに繋ぎなおすためmodifyAckDeadlineも切れ再配信されるバグがある

+++メッセージのTTL (Time-To-Live) はメッセージ保持期間(message retention duration) に依存メッセージが TTLを超えると、自動的に削除され、Subscriberが受信できなくなるackDeadlineSeconds (デフォルトは10秒、最大600秒) を超えたACKのメッセージは再配信されますが、TTL期限を超えた場合は消える#TTLを最大7日間に設定gcloud pubsub subscriptions update my-subscription message-retention-duration=604800s
DLQ (Dead Letter Queue)
Subscriberが指定回数(最大100回) メッセージのACKを行わなかった場合に、メッセージを隔離する仕組みDLQもサブスクなので期間やTTL設定方法は同じ
#DLQ topic 作成gcloud pubsub topics create my-dlq-topic
#5回失敗したらDLQへgcloud pubsub subscriptions update my-subscription dead-letter-topic=projects/my-project/topics/my-diq-topic max-delivery-attempts=5
#DLQ subsc作成gcloud pubsub subscriptions create my-diq-subscription--topic-my-diq-topic
#サブスクの詳細確認gcloud pubsub subscriptions describe my-diq-subscription
#DLQメッセージの確認、-auto-ackも付けられるが、gcloud pubsub subscriptions pull my-dlq-subscription -limit=10 [{ "ackld": "Y3g49NfY...=", "message": { "data": "SGVsbG8gd29ybGQ=", #Base64 エンコードされたデータ "messageld": "1234567890", "publish Time": "2024-02-18T12:34:56.789Z" } }]
#base64のでコードが必要echo "SGVsbG8gd29ybGQ=" | base64-decode
#ack-idによりackを返しDLQメッセージを削除gcloud pubsub subscriptions acknowledge my-diq-subscription--ack-ids=Y3g49NfFY
モニタリング > アラートポリシーから新しいアラートを作成しpubsub.subscription.outstanding_messages を監視対象に選択し、閾値を設定するとよい
#DLQ メッセージの再処理をfunctionsに設定 (トピックに入れなおす)from google.cloud import pubsub_v1publisher = pubsub_v1.PublisherClient()topic_path = publisher.topic_path("my-project", "my-topic")
def republish_message(message):    future = publisher.publish(topic_path, message.data)    print(f"Republished message ID: {future.result()}")
subscriber = pubsub_v1.SubscriberClient()subscription_path = subscriber.subscription_path("my-project", "my-dlq-subscription")
def callback(message):    print(f"Received message: {message.data}")    republish_message(message)    message.ack()
subscriber.subscribe(subscription_path, callback=callback)
/// BANGBOO BLOG /// - GCP runs off functions pubsub on scheduler

Comment (0)

■24/4/27 11:27PM
HELM
Helm Templateについて色々説明してみる #kubernetes - QiitaHighway to Helm (zenn.dev)Helmの概要とChart(チャート)の作り方 #Docker - QiitaHelm | 一般的な慣習
helmはコマンド一発だが生k8sはマニフェストファイルの数だけkubectl apply(delete)を繰り返す必要がある helm upgrade chart名 -f 環境毎yamlファイル
 文法覚えるより繰り返した方がええんじゃないhelmはテンプレートフォルダ以下がマニフェスのようなもの ループ処理が記述可、関数が使える、関数を作れる

helmは基本はテキストの整形用と言える(ヘルパー関数やビルトイン関数を使い外部ファイルを取り込んで変形したり、変数yamlを環境yamlで上書きし外部の値を使う等で沢山のGKEアセットをループ的に生成しようとしている)
helm create <チャート名>templates/ マニフェスト (テンプレート)env/ 自分で作成するが環境毎に異なる値の入る変数を記述┣dev.yaml┣prd.yamlvalues.yaml 繰り返す値等 (dev/prd.yamlが優先され上書きされる) helm upgrade-install <release名> <Helmチャートの圧縮ファイル名>
●●helmテンプレートの文法 (.ファイル名.親.子で表す、.はルートオブジェクト、Valuesはvaluesオブジェクト、$変数:=値、ymlインデントはスペース2つ)●templates/deployment.yaml{{ $env := Values.environment }}{{ $serviceAccountName := Values.serviceAccountName }}image: {{ .Values.deployment.image }}:{{.Values deployment.imageTag }} //nginx:latestserviceAccountName: {{ $serviceAccountName }}-{{ $env }} //sample-sa-dev↑●values.yamldeployment:  image: nginx  imageTag: latestserviceAccountName: sample-sa●env/dev.yamlenvironment: dev
※values.yaml よりdev/prd.yamlが優先され上書きされ.Valueで使う

●●helmテンプレートのループ (range~end)●templates/es.yamlspec:  nodeSets:  ((- range .Values.es.nodeSets }}  name: {{ .name }}  config:    node.attr.zone: {{ .zone }}  {{- end }}↑●values yamies:  nodeSets:  - name: node-a    zone: asia-northeast1-a  - name, node-b    zone: asia-northeast1-b

●●helmテンプレートのIF (if-end)●templates/ingress.yaml((- if .Values.ingress.enabled -))apiVension: networking k8s.io/v1kind: Ingress{(- end }}●env/prd.yamlingress:  enabled: true●env/dev.yamlingress:  enabled: false

●●helmテンプレートの複数値 (toYaml、nindentは関数)●templates/ingress.yamlmetadata:  annotations:    {{- toYaml .Values.ingress.annotations | nindent 4 }}●values.yamlingress:  annotations:    kubernetes.io/ingress.global-static-ip-name: sample-ip-name    kubernetes.io/ingress.class: "gce-internal"

●●その他中括弧内側の前後にダッシュ {{--}} をつけることができ、前に付けた場合は前の半角スペースを、 後ろにつけた場合は改行コードを取り除くhoge:  {{- $piyo := "aaa" -}}  "fuga"/* */で囲まれた部分はコメント構文{{-/* a comment */ -}}
.Releaseでリリースの情報を使用できる
{{ .ReleaseName }}とか{{ .ReleaseNamespace }}

●●_helpers.tpl
Helmの_helpers.tplを使える人になりたい #kubernetes - Qiitahelm create [チャート名]で自動でtemplates ディレクトリに_helpers.tplが作成されるが、 partialsやhelpersと呼ばれる共通のコードブロック (defineアクションで定義されtemplateアクションで呼び出される)や、ヘルパー関数などが定義される。_アンスコ始まりのファイルは、他のテンプレートファイル内のどこからでも利用できるという共通部品。 これは内部にマニフェストがないものとみなされる。種類としては、values.yamlが差し替え可能な変数、ローカル変数が定義したTemplateファイル内でのみ使える変数、_helpers.tplはチャート内で自由に使える変数●templates/_helpers.tpl{{- define "deployment" -}}apiVersion: apps/v1kind: Deploymentmetadata:  labels:    app: {{.name }}    name: {{ .name }}-deploymentspec:  replicas: {{ .replicas }}  selector:    matchLabels:      app: {{ .name }}  template:    metadata:      labels:        app: {{.name}}    spec:      containers:      - image: {{ .image }}        name: {{ .name }}{{- end -}}●values.yamlnginx:  replicas: "1"  name: nginx  image: docker.io/nginx:1.25.1httpd:  replicas: "3"  name: httpd  image: docker.io/httpd:2.4.57●deployment-nginx.yami{{ include "deployment" .Values.nginx }}
※{{ include "deployment" 引数 }}で関数を呼ぶ

●●英語サイトだともっと情報がある
Helm | Built-in Objects
.Filesなどのビルトインオブジェクトがあったりと、、、

GKEクラスタを作成しておくkubectlでArgo adminとシークレット作成?brew install argocdArgo cd設定ファイルリポジトリのcloneargocd cluster add <context name>argocd repo add <repo url> --ssh-private-key-path ~/.ssh/id_rsaargocd-configuration に設定を追加argocd-insallation に設定を追加argo cd上からinstallationをsyncするargocd login --grpc-web --sso dev-argocd.dev.bb.com
===ArgoはSettingsにリポジトリ、クラスター、プロジェクト、他にUserの設定 アプリ設定でhelmのパス等を指定(Argo内部でhelm upgradeでなくkubectrl applyに変換しでやってもらえるお作法:helmコマンドのインストール不要でArgoでhelm文法が使える)
総務省|報道資料|「クラウドの設定ミス対策ガイドブック」の公表 (soumu.go.jp)


Comment (0)

■24/1/14 9:59PM
GKE
モダンか何か知らんが、豚玉かイカ玉で十分じゃ

===========
kubectlチートシート | Kubernetes

フォルダに .py と requirements.txt と .dockerignore と Dockerfile を入れてアップロードしているgcloud builds submit --tag asia-northeast2-docker.pkg.dev/bangboo-prj/xxx/image001
helloworld@bangboo-prj.iam.gserviceaccount.com 作成アクセス元のIPを確認するCloud run作成 ドメインないと無理なのでLBとIAPをあきらめ生成されるURLで十分 Cloud runでアクセス元IPを表示するヤツ runのallUsersのinvokerを削除したらアクセス不可になった(この方法で管理する)curl http://ifconfig.me/ で十分だったが

GKE
k8sの内部NWは通常別途いるがGKEは速い奴が動作
GKEはクラスタ内部のDNSでサービス名で名前解決できる
サービスのIPとポートは環境変数で参照可
kubectlを使うには、gcloud container cluters get-credentials を打つ必要がある

GKE設定-クラスタ:側の設定(IP範囲とかセキュリティとか?) 一般/限定公開:外部IPを使うか使わないか コントロール プレーン承認済みネットワーク:CPにアクセスできるセキュリティ範囲-ワークロード:マニフェストで設定
一般か限定公開か?コントロールプレーンが外部IPか?CPがグローバルアクセス可か?承認NWか? 一般公開で承認NWが良いのでは?簡単だし、 限定公開で使うには>CPに外部IPで承認NWでいいのでは?  NW:default subnet:default  外部IPでアクセス許可  CP アドレスの範囲 192.168.1.0/28とか172.16.0.0/28(サブネット重複しない奴)  コントロール プレーン承認済みネットワーク home (169.99.99.0/24ではなくGCPのIPぽい)  限定公開ならnatが要る CPの VPCのIP範囲は、クラスタの VPC 内のサブネットと重複不可。CPとクラスタは VPC ピアリングを使用してプライベートで通信します グローバルアクセスは別リージョンからという意味っぽい、cloud shellからのkubectlのためONが良いデフォルト設定なら作成したサブネットのIP範囲でなくクラスタが作られない 面倒ならdefault-defaultで良いかも
サブネットをVPCネットワークを考えて指定する方が偉いかも知れんがdefault asia-northeast2 10.174.0.0/20 の場合 サブネットは asia-northeast2 10.174.27.0/24 とか
ARにあるコンテナからGKEをデプロイが簡単にできるCloud Source Repositories でソース管理gitが下記のようにできる gcloud source repos clone bangboo-registry --project=bangboo-prj cd bangboo-registry git push -u origin masterrun使用中のコンテナがGKE上では上手くいかない runのコンテナは8080のようだ Dockerfileとmain.py上ではポートは何でもよい仕様だが、runで自動的に8080割り当てるようだ  それが駄目でありGKEは環境変数でPORT 8080を指定  CrashLoopBackOff問題がでる  https://www.scsk.jp/sp/sysdig/blog/container_security/content_7.htmlデプロイ公開でポート80 ターゲットポート8080に(クラスタを作成後、ワークロードでデプロイする)
developmentのspec: containers: ports: - containerPort: 8080 を入れる? yamlでなく、コンソールで設定時に入れると良い
$ kubectl get allNAME                      TYPE           CLUSTER-IP    EXTERNAL-IP    PORT(S)        AGEservice/flask-1-service   LoadBalancer   10.48.4.134   34.97.169.72   80:32147/TCP   20m
us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0 これは簡単に上手く行く、環境変数PORT8080不要 クイックスタート: アプリを GKE クラスタにデプロイする  |  Google Kubernetes Engine (GKE)  |  Google Cloud
ワークロードでyamlの spec: replicas: 0を保存するとアクセスを止められる
コンフィグマップ:構成ファイル、コマンドライン引数、環境変数、ポート番号を別途持っていてPodにバインドする(マニフェストに書くと抜き出され見れる)シークレット:Base64の値?(マニフェストに書くと抜き出され見れる)甘いのでsecret mgrを使う方が良い? config map/secretはマニフェストで編集する必要がある(見れるだけと思われる)エディタで見てみる:yamlとかステータスが見れる

■LBに静的IPを振る
GKE で Ingress を使用して Google マネージド SSL 証明書を使用した外部 HTTP(S) ロードバランサを作成する - G-gen Tech Bloghello-app-addressと名付けたIPを取得LBのアノテーションで設定# ingress.yaml(NWはNodePort、RouteapiVersion: networking.k8s.io/v1kind: Ingressmetadata:  name: hello-ingress  namespace: default  annotations:    kubernetes.io/ingress.global-static-ip-name: hello-app-address  # IP    networking.gke.io/managed-certificates: hello-managed-cert      # 証明書    kubernetes.io/ingress.class: "gce"  # 外部 HTTP(S)LBspec:  defaultBackend:    service:      name: hello-deployment      port:        number: 8080

GKEでロードバランサのIPを指定するとき、グローバルに属するIPアドレスリソースは使用できないので注意 #GoogleCloud - QiitaServiceのLBはリージョン指定するタイプの静的IPIngressはグローバルIPOKapiVersion: v1kind: Servicemetadata:  name: hoge  labels:    app: hogespec:  ports:    - port: 80  selector:    app: hoge    tier: frontend    environment : stage  type: LoadBalancer  loadBalancerIP: xxx.xxx.xxx.xxx

ArmorでIP制限1)サービスから対象を選択しingressを作成することでLBを追加しArmorも設定可能2)デフォルトLBに付けるにはkubectl要りそう、backendconfig.yamlはどこに置く Cloud ArmorでGKE IngressへのアクセスをIPで制御する #GoogleCloud - Qiitaサービス画面のkubectrlから# backend-config.yaml を作り kubectl apply -f backend-config.yamlapiVersion: cloud.google.com/v1kind: BackendConfigmetadata:  namespace: default  name: hello-backend-configspec:  securityPolicy:    name: "bangboo-armor"
serviceのyamlに下記を追加metadata:  annotations:    cloud.google.com/backend-config: '{"ports": {"8080":"hello-backend-config"}}'↑これでは不足する どこで設定状態を見るか?ingress作成してLBとArmorつけて、デフォルトLBを削除してみる?
GKEの外部からのアクセスを制限するには? 限定公開+コントロールプレーンは承認済み等でアクセスしKubectlする ArmorでIP制限+アダプティブ設定(ArmorはLBが要る)
GKEでNodePort TypeのServiceに対してインターネットアクセス許可する - IK.AM

限定公開クラスタ+踏み台サーバにIAPで入りKubectl(承認済みNWでの制御はIPのみなので危ういらしい)
GKE(Google Kubernetes Engine) Autopilotの限定公開クラスタにIAPを利用してアクセスする | Tech-Tech (nddhq.co.jp)
【GKE/Terraform】外部ネットワークからの全てのアクセスを制限した限定公開クラスタを作成し、踏み台サーバーからkubectlする (zenn.dev)
コントロールプレーンとPod間で自動FWされない場合もありFirewall要チェック
 Cloud shellのグローバルIPを取得しシェルを承認済みNWにできないか?>OK curl http://ifconfig.me/
GKEでPythonをCron定期実行させたいArgoでDAGを実行させたい https://zenn.dev/ring_belle/articles/2c4bbe4365b544ArgoでGKEのCICD(Argoは別ホストでGithubにアクセスし、GKEを操る) https://www.asobou.co.jp/blog/web/argo-cd

サービスアカウント
Workload Identity Federation for GKEの新しい設定方法を解説 - G-gen Tech Blog
1)ノードに紐付いたサービスアカウントKSAをそのまま使用する(裏でimpersonate)
gkeのサービスアカウントとIAMサービスアカウントの紐づけが不要になった
VPCサービスコントロールで管理したい場合impersonateのSAを指定できないためWIFが要る2)サービスアカウントのキーを Kubernetes Secret として GKE クラスタに登録する3)Workload Identity Federationをつかう
GCP の Workload Identity サービスについてのまとめ #GoogleCloud - Qiita
Githubとか外部のサービスから利用するためSAを連携させる
IAM>Workload identity連携画面で設定が見れる※KSAはノード単位で設定、Pod単位でGCPのリソースにアクセスできるように管理したい?
●メモ
忙しいときはスケールアウトするが、落ち着き始めるとスケールinし、必要なPodも落とされてしまう
safe-to-evict をymlのannotationで明示して特定Podはスケールinしない等にしておくannotations:  cluster-autoscaler.kubernetes.io/safe-to-evict:"false"クラスタのオートスケーラー イベントの表示  |  Google Kubernetes Engine (GKE)  |  Google Cloud

最小Pod数をスケールinした値で固定する等も

■Workloads リソースPod:Workloadsリソースの最小単位ReplicaSet:Podのレプリカを作成し、指定した数のPodを維持し続けるリソースです。Deployment:ローリングアップデートやロールバックなどを実現するリソースです。DaemonSet(ReplicaSet亜種):各ノードにPodを一つずつ配置するリソースです。StatefulSet(ReplicaSet亜種):ステートフルなPodを作成できるリソースです。Job:Podを利用して、指定回数のみ処理を実行させるリソースです。(使い捨てPod)CronJob:Jobを管理するリソースです。Config connector:GKEでGCPリソースを調節してくれるアドオン。Podの増加減少にあたり必要なアカウントや権限やPubSub等々を自動作成や管理する。マニフェストのymlにcnrmのAPIを記載したりする(Config connector resource nameの略)Config Connectorを試してみる (zenn.dev)
■GKE関連の運用GKEクラスタ認証ローテーション30日以内になると自動ローテーションするが危険なので手動が由GKEはマイクロサービスのエンドポイントでのサービス提供かgcloud api利用が前提といえるのでこれでOK1) ローテ開始 (CPのIPとクレデンシャル)2) ノード再作成3) APIクライアントを更新 (クレデンシャル再取得)4) ローテ完了 (元IPと旧クレデンシャルの停止)クラスタ認証情報をローテーションする  |  Google Kubernetes Engine (GKE)  |  Google CloudGKEクラスタ認証ローテーションの考慮Google Kubernetes Engine のクラスタ認証情報をローテーションするまでに考えたこと - DMM insideセキュアなGKEクラスタそれなりにセキュアなGKEクラスタを構築する #GoogleCloud - Qiitaコントロールプレーンの自動アップグレード&IPローテーション&ノードブールの自動アップグレードで死ぬGKEシングルクラスタ構成で障害発生してサービス停止しちゃったのでマルチクラスタ構成にした話 (zenn.dev) CPの更新後はクレデンを取得しなおす必要がある、ArgoでCICDを組んでいるとクラスタに認証入りなおす必要がある
 ノードが入れ替わりに時間が掛かり、時間差で問題がでることがあるので注意
(More)
Comment (0)

Navi: <  1 | 2 | 3 | 4  >
-Home
-Column [133]
-Europe [9]
-Gadget [77]
-Web [137]
-Bike [4]

@/// BANGBOO BLOG ///