Carpe Diem

備忘録

Cloud VPN (Classic VPN) を使ってみる

概要

GCPVPCは物理ネットワークを仮想化したネットワークであり、異なるVPC同士は直接疎通することはできません。
通常であればExternal IP経由もしくはLBなどを用いてアクセスしますが、内部IPで疎通したい場合はVPNを構築する必要があります。

検証

事前準備

VPCの用意

VPC リージョン Subnet
vpn-network-1 us-central1 10.5.4.0/24
vpn-network-2 europe-west1 10.1.3.0/24

f:id:quoll00:20210725110253p:plain

続きを読む

gRPCのkeepaliveで気をつけること その2

背景

以前gRPCのkeepaliveについて説明しました。

christina04.hatenablog.com

keepaliveの目的は

  1. idleコネクションを維持するため
  2. 死んだコネクション(TCPハーフオープン)があったら切断し、再接続するため

と書きましたが、どちらの検証もアクティブなRPCがなくなってからのkeepaliveの例であり、リクエストが続く中での挙動は検証できてなかったので今回はそれを行います。

環境

  • grpc-go v1.38.1
  • Ubuntu 18.04 (Linux Kernel 4.15.0-147-generic)
続きを読む

gRPCのChannelについて

背景

gRPCにはクライアントとサーバとの通信を抽象化したChannelという仕組みがあります。

GRPC_GO_LOG_SEVERITY_LEVEL=infoを有効にした際に出てくる

[core] Channel Created
[core] parsed scheme: ""
[core] scheme "" not registered, fallback to default scheme
[core] ccResolverWrapper: sending update to cc: {[{localhost:8080  <nil> 0 <nil>}] <nil> <nil>}
[core] Resolver state updated: {Addresses:[{Addr:localhost:8080 ServerName: Attributes:<nil> Type:0 Metadata:<nil>}] ServiceConfig:<nil> Attributes:<nil>} (resolver returned new addresses)
[core] ClientConn switching balancer to "pick_first"
[core] Channel switches to new LB policy "pick_first"
[core] Subchannel Created
[core] Subchannel(id:2) created
[core] Subchannel Connectivity change to CONNECTING
[core] Subchannel picks a new address "localhost:8080" to connect
[core] Channel Connectivity change to CONNECTING
[core] CPU time info is unavailable on non-linux or appengine environment.
[core] Subchannel Connectivity change to READY
[core] Channel Connectivity change to READY
...
[core] Channel Connectivity change to SHUTDOWN
[core] Subchannel Connectivity change to SHUTDOWN
[core] Subchannel Deleted
[core] Subchanel(id:2) deleted
[core] Channel Deleted

Channel、Subchannelのような概念もあるので、理解のため一度整理します。

続きを読む

Kubernetes Eventを保持したりSlack通知させたりする

背景

Kubernetesは宣言的で自己回復するシステムを提供しているため、おかしなコミットが入ったdocker imageをapplyしてCrashLoopBackOffが発生していたりしても前のPodが生きていて気づかなかったみたいなケースがあります。

またメモリが瞬間的に枯渇するなどでメトリクスには表示されないレベルで急にOOMKilledされるケースがありますが、後からdescribeしてイベントをチェックして気づくことが多いです。しかしイベントは1時間しか保持されないので、調査が遅れると何が起きたかも調べられなくなります。

そこでKubernetes Eventを保持し、ケースによってはSlack通知してすぐに対応できるようにしたくなったのが今回の背景です。

環境

ツール

今回はKubeCon 2019にて発表された opsgenie/kubernetes-event-exporter を使います。 Atlassianのアラート&オンコール管理チームが作ったツールです。

  • フィルタが直感的に使える
  • 出力先(sink)が多い
    • Elasticsearch, Webhook, Slack, Kinesis, MS Teams, PubSub, etc...

という点から採用します。

続きを読む

CircleCIでのslack連携 (Slackアプリ版)

背景

以前CircleCIの新UI後のslack連携を書きました。

今見るとまたやり方が変わっている(Webhook URL→Slackアプリ)ので、やり方を説明します。

環境

手順

大きく3ステップあります。

  1. Slackアプリを作る
  2. CircleCIのContexts or プロジェクトの環境変数トークンを設定
  3. Orbで↑を使う
続きを読む

gcloud auth login と gcloud auth application-default login

概要

ローカルからGCPにアクセスする際に使う

  • gcloud auth login
  • gcloud auth application-default login

について区別できるようまとめます。

環境

  • gcloud v340.0.0

gcloud auth login

用途

こちらはローカルで以下のようなGCPCLIを実行する際の認証を得るために使います。

  • gcloud (GCPAPI全般)
  • bq (BigQuery)
  • gsutil (Cloud Storage)
  • cbt (Bigtable)
  • etc...
続きを読む

Slackアプリでチャンネルにメッセージを送信する方法

概要

Slackアプリでチャンネルにメッセージを送信する方法は主に以下の3つがあります。

  1. Incoming Webhooksを使う
  2. Bot TokenでSlack API (chat.postMessage) を叩く
  3. User TokenでSlack API (chat.postMessage) を叩く

それぞれのやり方を説明します。

メッセージ送信

事前準備としてどれもSlackアプリを使うので、あらかじめ作成しておきます。

Slack API: Applications | Slack

f:id:quoll00:20210507004052p:plain

分かり易さのためDisplay Informationを設定しておくと良いです。

f:id:quoll00:20210507004246p:plain

続きを読む