GeekFactory

int128.hatenablog.com

Kubernetes

EKS Managed Node GroupでSpot Instancesを使う

Amazon EKSのManaged Node Groupsがスポットインスタンスに対応しました。 aws.amazon.com これまでManaged Node Groupsではオンデマンドしか利用できず、スポットを利用するには自分でAuto Scaling Groups(mixed instance types)を管理する必要がありまし…

Certified Kubernetes Administratorを取得した

Certified Kubernetes Administrator(CKA)を取得しました。すでに多くの受験記があるので、他の人が書いていないことをまとめてみます。 きっかけ いろんな言い訳でCKAの申し込みを先延ばしにしてきたのですが、以下の条件が揃ったので受験するに至りまし…

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

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

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

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

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…

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

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

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

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

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

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

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…

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

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

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で接続できます.もはやターミナルも…

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…

NGINX Ingressで複数ドメインを1つのALBに集約する

AWSでKubernetesを利用する場合、Ingress Controllerの選択肢にはaws-alb-ingress-controllerやkube-ingress-aws-controller、nginx-ingressなどがあります。 aws-alb-ingress-controllerやkube-ingress-aws-controllerではKubernetesのレイヤでALBを管理で…

HackMDでGitLab認証を利用する

HackMDは同時編集が便利なコラボレーションツールです。HackMDは認証なしでも十分に使えますが、外部認証を利用するとさらに便利に使えます。公式リポジトリのドキュメントによると、HackMDは以下の認証方式に対応しています。 GitHub Twitter GitLab (self …

Debian and Kubernetes optimized Kernel in kops

kopsが利用するAMIについて調べたのでまとめておく。 kopsでサポートされているOSは https://github.com/kubernetes/kops/blob/master/docs/images.md に書かれている。デフォルトではDebianが選択される。他にCoreOS、Ubuntu、CentOS、RHELがサポートされて…

開発基盤ツールのHelm charts

開発基盤ツールをKubernetesで運用する時に使えるHelm chartsを調べたのでまとめました。開発支援ツールやDevOpsツールという言い方もあるかもしれません。 Atlassian JIRA Software オフィシャルのHelm chartやDockerイメージはありません。検索したところ…

Helmfile supports inlined values in YAML

HelmfileはKubernetesクラスタのHelm releasesを管理するツールです。 helmfile.yaml にデプロイしたいHelm chartを書いて helmfile sync を実行するだけでインストールやアップグレードを冪等にやってくれるので便利です。 例えば、Kubernetes DashboardとH…

kubectl getでカスタムカラムを表示する

kubectl getはデフォルトでは以下のカラムを表示するが、どのカラムを表示するかはオプションで変更できる。 % kubectl get po --all-namespaces NAMESPACE NAME READY STATUS RESTARTS AGE 特定のカラムを表示するには -o custom-columns オプションを渡せ…

Upgrade to Kubernetes 1.9 using kops

個人用のKubernetesクラスタを1.9.3に更新したのでログを残します。 % kops version Version 1.9.0 kops upgrade cluster コマンドでS3の構成情報を更新します。 % kops upgrade cluster Using cluster from kubectl context: hello.k8s.local ITEM PROPERTY…

kubeloginコマンドを利用してOpenID ConnectでKubernetesにアクセスする

TL;DR Kubernetesの認証はクライアント証明書やID/パスワードだけでなく、OpenID Connectに対応している。 RBACを設定することで、ユーザやグループによるアクセス制御ができる。 以下の設定が必要になる。 Keycloak(OpenID Connect IdP) kube-apiserver(…

KeycloakのOpenID ConnectでKubernetes Dashboardにアクセスする

TL;DR Keycloakはオープンソースの統合ID管理ツールでOpenID ConnectやSAMLに対応している。 Kubernetes DashboardはOpenID ConnectのIDトークンによる認証に対応している。 RBACを設定することで、ユーザやグループによるアクセス制御ができる。 以下の設定…

Helm ChartsをGitHub Pagesで公開する

KubernetesではHelmというパッケージマネージャが広く使われています。HelmではChartという単位でパッケージを管理します。有名なソフトウェアであればOfficial Chartsが公開されていますが、場合によっては自分で書いたChartを公開したいこともあるでしょう…

EBS volume type standard not working on Kubernetes

The EBS volume type standard seems not working as a storage class on Kubernetes. Reproduce the issue Adding the following storage class: kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: standard labels: k8s-addon: storage-a…

Prometheus/GrafanaでPersistent Volumesの空き容量を取得する

TL;DR KubernetesのPersistent Volumesの容量をPrometheusで取得するには以下のMetricsを使用する。 kubelet_volume_stats_available_bytes (使用可能バイト数) kubelet_volume_stats_used_bytes (使用済みバイト数) kubelet_volume_stats_capacity_byte…

kopsでルートボリュームタイプにstandardを指定できるようになった

kopsではEC2のルートボリュームに割り当てるボリュームタイプに gp2 か io1 しか指定できない問題がありました。検証用途では standard で十分なので、standard も指定できるように入力値チェックを修正するPRを送りました。 github.com 以下のようにインス…

Deploy static site on nginx pod

滅多に変更しない静的ページを配置したい時に便利です。 apiVersion: v1 kind: ConfigMap metadata: name: landing-page data: index.html: | <html> <body> <h2>Welcome</h2> </body> </html> --- apiVersion: extensions/v1beta1 kind: Ingress metadata: name: landing-page spec: rules: - …