GeekFactory

int128.hatenablog.com

Prometheus Alertmanagerの通知テンプレートを改善する

AlertmanagerのSlack通知テンプレートで四苦八苦したのでメモを残します。 Prometheus OperatorのHelm chartには便利なデフォルトルールが組み込まれています。例えば、Podが頻繁に再起動している場合に通知するルール(KubePodCrashLooping)が組み込まれて…

Fluxによるアプリケーションの継続的デプロイ

FluxのAutomated deployment of new container imagesを利用して、Kubernetes上でアプリケーションの継続的デプロイを構成する機会があったのでまとめます。 GitOpsの基本形 GitOpsを採用する場合は下図のデプロイフローが基本形になります。 具体的には以下…

本物のクラスタを利用してkubectl pluginをテストする

kubectlのプラグインを開発していると、ユニットテストだけでなく、本物のKubernetesクラスタを利用したテストが欲しくなります。プラグインの振る舞いが複雑な場合は自動テストがあると安心してリリースできます。 本稿では、本物のKubernetesクラスタを利…

決済手段を選択するビジネスルールを考える

お店やネットで買い物する時のビジネスルールが複雑になってきたので書き出してみました。 以下の順に評価して条件を満たす決済手段で支払います。 USD/EUR建ての場合:Sony Bank WALLET ANA FESTAの場合:ソラチカカードVisa(5%割引) ビックカメラの場合…

kindでクラスタが起動しない原因を調べる

kind create cluster コマンドでKubernetesクラスタが起動しない場合、以下のようなメッセージが表示されます。 ✗ Starting control-plane ️ ERROR: failed to create cluster: failed to init node with kubeadm: command "docker exec --privileged kind-c…

GitHub GraphQLで新しいPull Requestを作成する

GitHub GraphQLで新しいPull Requestを作成するにはcreatePullRequest mutationを利用します。RESTの場合と同様に、以下のようにheadとbaseを指定します。 head ref: 適用したい変更が含まれるブランチ。cross repositoryの場合はforkされたリポジトリ。 bas…

アプリケーションの開発フローとGitOps

アプリケーションの開発フローとKubernetesへのデプロイを考えた軌跡を残します。特に結論はないです。 前提 以下を前提とする。 Kubernetesにアプリケーションをデプロイする場合を考える。 すべての変更はPull Requestを通して適用する。 アプリケーション…

GitHub GraphQL APIで新しいブランチを作成する

GitHub GraphQL APIで新しいブランチを作成できるようになっていたので試してみました。本記事の内容はGraphQL API Explorerで実行できます。 リポジトリに新しいブランチやタグを作成するにはcreateRef mutationを利用します。createRefを実行するには以下…

Kubernetes DashboardとAWS IAM認証

Amazon EKS #1 Advent Calendar 2019の13日目です。今日はKubernetes DashboardとIAM認証についてお話しします。 背景 Kubernetesのクラスタをチームで運用する場合、チーム全員がコマンドラインツールに習熟しているとは限らないため、GUIツールを併用する…

GitLab CI/CDでtfnotifyを使う

mercari/tfnotifyがv0.3.2でGitLab CI/CDに対応したので試してみました。個人的には待望の機能追加です。tfnotifyを利用すると、GitLab CI/CDでTerraformを実行した結果をMerge Requestのコメントに反映できます。いちいちジョブの結果を見に行かなくてよい…

Cluster AutoscalerをPrometheusでモニタリングする

Cluster Autoscalerを運用していると,ノード数が増減した契機を調査したいことがあります.Cluster Autoscalerは大量のログを出力するため,闇雲にログを追うのは大変です.PrometheusとGrafanaでCluster Autoscalerの動作を可視化しておくと調査しやすくな…

ffmpegでmovをgifに変換する

QuickTimeで画面収録したmovファイルをgifファイルに変換する方法です。 Docker Hubの jrottenberg/ffmpeg イメージを利用します。以下を実行すると、サイズやフレームレートをそのままにしてファイルを変換します。 docker run --rm -v $PWD:/src jrottenbe…

実行中のゴルーチンでwg.Add(1)/eg.Go()を実行すると,Wait()は呼び出し後に追加されたゴルーチンも待ってくれるか?

Goで並行処理のコードを書いている時に以下の疑問が思い浮かびました. sync.WaitGroupを利用する場合,実行中のゴルーチンでwg.Add(1)を実行すると,wg.Wait()は呼び出し後に追加されたゴルーチンも待ってくれるか? errgroup.Grpupを利用する場合,実行中…

kube2iamをTerraformとHelmfileでデプロイする

Kubernetes workerをEC2インスタンスで実行する場合,何も設定しないとPodはEC2インスタンスのIAMロールを利用します.このままでは,攻撃者が悪意のあるイメージを利用して情報漏洩や破壊を行うリスクがあります.kube2iamを利用すると,Podに適切なIAMロー…

TerraformでNATインスタンスを管理する

個人のAWS環境でプライベートサブネット構成を検証したいけどNATゲートウェイに毎月3,500円も払えない*1ので,NATインスタンスのTerraformモジュール int128/nat-instance/aws を作りました.主な特徴はこちらです. Auto Scaling GroupによるAuto Healingに…

Argo CDでGitLab SSOを利用する

Argo CDは自前でユーザ管理の仕組みを持たず*1,外部のIdentity Providerに認証を移譲するという設計思想になっています.Argo CDのHelm chartにはDexがバンドルされており,様々なIdentity Providerと連携させることが可能です.本稿では,Argo CDでGitLab …

AWS Cluster AutoscalerをTerraformとHelmfileでデプロイする

Cluster Autoscalerを利用すると,CPUやメモリの要求量に応じてノード数を自動的に増減させることが可能です. 本稿では,Amazon EKSで以下を利用する方法を紹介します. terraform-aws-eks Module AWS Cluster Autoscaler stable/cluster-autoscaler Helm C…

GitLab RunnerとkanikoでDockerイメージをビルドする

DockerやKubernetesでGitLab Runnerを実行する場合,GitLab RunnerでDockerイメージをビルドするにはDocker in Dockerの特権モードを構成する必要があります.kanikoを利用すると,特権モードを使わずにDockerイメージをビルドできます. 本稿では,GitLab R…

terraform-aws-modules/acm/aws でTLS証明書を取得する

terraform-aws-modules/acm/aws を使うとACMの証明書を簡単に取得できます.コンソール作業が一切必要ないのがうれしい. 例えば,ドメイン foo.example.com のRoute53 Hosted Zoneが存在する前提で *.foo.example.com のTLS証明書を取得するには,以下のコ…

Kubernetes上のGitLab Runnerでビルドキャッシュを利用する

GitLab CI/CDではビルドキャッシュがサポートされています.本稿では,KubernetesにデプロイしているGitLab Runnerでビルドキャッシュを利用する方法を紹介します. ここでは以下を利用している前提とします. AWS Kubernetes 1.13 (EKS) kube2iam Terraform…

GitLab CI/CDで特定のファイルが変更された場合にのみジョブを実行する

GitLab 11.4から only:changes という記法がサポートされました.これにより,特定のファイルが変更された場合のみジョブを実行できます. https://docs.gitlab.com/ee/ci/yaml/#onlychangesexceptchanges 例えば,以下のように記述すると,ブランチをpushし…

TerraformでIPアドレスリストをCIDRリストに変換する

Terraformの小ネタです.プライベートサブネットからInternet facing ALBへのアクセスを許可するため,NATゲートウェイのグローバルIPアドレスをセキュリティグループに追加する必要がありました.Terraformの aws_security_group_rule にはIPアドレスではな…

golang.org/x/tools/go/packages による構文解析と型解析

golang.org/x/tools/go/packages を利用すると,抽象構文木や型情報を利用したコードが簡単に書けるので調べてみました.日本語の情報があまりないようです. 抽象構文木を表示する Goのソースコードを読み込むには,packages.Load 関数を利用します.packag…

EKSのGitLab RunnerでTerraformをCI/CDする

AWS EKSでGitLab Runnerを実行して,GitLab RunnerでTerraformを実行する方法を紹介します. 以下の流れで作業を行います. EKS workerにAssumeRoleのIAMポリシーをアタッチする. stable/kube2iamをデプロイする. GitLab RunnerのIAMロールを作成する. Gi…

client-goでserviceのselectorに合致するpodを検索する

Kubernetesのクライアントであるclient-goを利用して,serviceのselectorに合致するpodを検索する方法を紹介します.コマンドラインではserviceの名前を受け取るが,実際の処理はpodに対して行う必要がある場合に活用できます. クライアントの生成 準備とし…

EKS workerにSSMセッションマネージャで接続する

EC2インスタンスをプライベートサブネットに配置する場合,EC2インスタンスにSSHで接続するには踏み台が必要になります.Systems Managerのセッションマネージャーを利用すると,踏み台を経由せずにEC2インスタンスにSSHで接続できます.もはやターミナルも…

GitLabのSAML SSO認証失敗とシステム時刻

とあるところで運用しているGitLab/Keycloakで発生した障害のメモ。 事象 GitLabにSAML SSOでログインしようとすると500エラーが表示される。GitLabとKeycloakの構成は以下で紹介した通りとなっている。 int128.hatenablog.com 原因 GitLab Omnibusのコンテ…

client-go@v12.0.0 に移行した

client-go@v12.0.0 で正式にGo Modulesに対応しました.それまでもGo Modulesでclient-goを利用することは可能でしたが,k8s.io/api などの依存関係のバージョンを固定する手順が必要でした(client-go#551).LinuxとmacOSでchecksumが異なる問題(go#27925…

GitHub GraphQLでRef, Commit, Treeを取得する

int128.hatenablog.com 上記の記事ではv3 REST APIで新しいブランチを作る方法を紹介しました.本記事ではv4 GraphQL APIを組み合わてAPI問い合わせを削減する方法を紹介します. 新しいブランチを作成/更新する手順は以下になります. RefのCommit SHA, Tre…

Terraform Moduleを用いたAWSにおけるGitLab Runnerの運用

GitLabにはCI/CDの機能が統合されています.GitLab CI/CDではGitLab本体とは別のGitLab Runnerと呼ばれるノードでビルドを実行します.GitLab RunnerはJenkinsでいうJenkins Agentと同様に,普通のPCで実行したり,クラウドでDockerコンテナとして実行したり…